【Python图像线条坐标提取】

这篇具有很好参考价值的文章主要介绍了【Python图像线条坐标提取】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述:

在进行图像处理时,有时需要对图像上的坐标点进行提取,然后进行曲线拟合,如下图,但是提取的xy坐标会有许多重复的值,影响曲线拟合效果。这里提供三种方法,其它的方法大家可以自行补充。

warn:函数传入的图像是二值化之后的图像,像素只有0和255,如何二值化自行百度。

python获取坐标值,python,人工智能,计算机视觉

1:直接提取黑色的所有点坐标,该方法显而易见,会存在很多重复的x坐标,直接上代码:

def extract_line_position(image):       # 提取坐标,存在bug,会重复提取x的值
    list_y = []
    list_x = []    # 存储值为0的行号和列号
    
    for i in range(len(image)):
        for j in range(len(image[i])):
            if image[i][j] == 0:
                list_x.append(j)
                list_y.append(len(image) - i)
    return list_x, list_y

python获取坐标值,python,人工智能,计算机视觉

2 直接提取曲线的上边缘坐标,该方法,在曲线较粗或垂直向下时会失真,但是适用于现在的场景,代码如下:

def get_line_position(image):
    list_x = []
    list_y = []
    # y_len = len(image)
    # print(y_len)
    for i in range(len(image[0])):    #  遍历列数
        for j in range(len(image)):   # 遍历行数
            if image[j][i] == 0:
                list_x.append(i)
                list_y.append(len(image)-j)
                break
    return list_x,list_y

python获取坐标值,python,人工智能,计算机视觉

3: 提取曲线上边缘与下边缘的中值来获取位置坐标,代码:


def get_lineMedium_position(image):
    image = np.delete(image, 0, axis=0)  # 删除第一行
    image = np.delete(image, 0, axis=1)  # 删除第一列
    list_x = []
    list_y = []
    start_index = 0
    end_index = 0
    for i in range(len(image[0])):  # 遍历列数
        for j in range(len(image)-1):  # 遍历行数
            if image[j][i] == 255 and image[j+1][i] == 0:
                start_index = j
                continue
            if image[j][i] == 0 and image[j+1][i] == 255:
                end_index = j
                y_position = (start_index + end_index)/2
                list_x.append(i)
                list_y.append(len(image) - y_position)
                start_index = 0
                end_index = 0
                break
    return list_x, list_y

这里就不上图了,效果挺不错的,不用对曲线进行细化,节省时间,但是要根据实际情况使用。文章来源地址https://www.toymoban.com/news/detail-519752.html

最后整理了一个类,供大家使用:

import numpy as np
import matplotlib.pyplot as plt


plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

"""
December 16, 2022,LuoNicus
获取曲线分割后的图像点坐标类
用不同的方法获取坐标
只可提取像素 0 or 255,提取其它自行修改
正常提取,上边缘提取,中值提取,各有优缺,根据实际情况使用
"""

"""   图像像素示意
    [[255,255, 255, 0,   0]
     [0,   0,  255, 0,   0]
     [0,   0,  255, 0,   0]
     [0,   0,  255, 255,255]]     
"""

class Get_Line_Positon:
    def __init__(self, image):
        self.image = image
        self.list_x = []
        self.list_y = []
        print("已获取图像信息,准备提取二值图像位置坐标")

    def by_allline_point(self):  # 提取坐标,存在bug,会重复提取x的值
        # 细化算法存在bug,第一行和第一列为0黑色,不合理,因此首先去掉
        print("warn:常规算法提取,容易出现多个x为相同值")
        self.image = np.delete(self.image, 0, axis=0)  # 删除第一行
        self.image = np.delete(self.image, 0, axis=1)  # 删除第一列

        for i in range(len(self.image)):
            for j in range(len(self.image[i])):
                if self.image[i][j] == 0:
                    # print(mask[i][j],j,i)
                    self.list_x.append(j)
                    self.list_y.append(len(self.image) - i)
        return self.list_x, self.list_y

    def by_upline_point(self):  # 提取直线坐标,提取曲线的边缘坐标,避免出现x的重复值
        print("提取曲线上边缘的值")
        self.image = np.delete(self.image, 0, axis=0)  # 删除第一行
        self.image = np.delete(self.image, 0, axis=1)  # 删除第一列
        # y_len = len(self.image)
        # print(y_len)

        for i in range(len(self.image[0])):  # 遍历列数
            for j in range(len(self.image)):  # 遍历行数
                if self.image[j][i] == 0:
                    self.list_x.append(i)
                    self.list_y.append(len(self.image) - j)
                    break
        return self.list_x, self.list_y

    def by_lineMedium_point(self):  # 提取像素上下值的中位数坐标,该方法不用对函数进行细化
        print("提取曲线的中值")
        self.image = np.delete(self.image, 0, axis=0)  # 删除第一行
        self.image = np.delete(self.image, 0, axis=1)  # 删除第一列
        start_index = 0
        end_index = 0

        for i in range(len(self.image[0])):  # 遍历列数
            for j in range(len(self.image) - 1):  # 遍历行数
                if self.image[j][i] == 255 and self.image[j + 1][i] == 0:
                    start_index = j
                    continue
                if self.image[j][i] == 0 and self.image[j + 1][i] == 255:
                    end_index = j
                    y_position = (start_index + end_index) / 2
                    self.list_x.append(i)
                    self.list_y.append(len(self.image) - y_position)
                    start_index = 0
                    end_index = 0
                    break
        return self.list_x, self.list_y

欢迎补充!!

到了这里,关于【Python图像线条坐标提取】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python获取软件窗口的坐标

            我的最终需求是获取单选按钮的中间的按钮位置,然后通过pynput这个包去操作鼠标键盘        1.包的导入                 a.第一步导入 win32gui 这个包,这里需要注意的是并没有win32gui这个包,这个组件包是存在于PyWin32这个包中,所以我们只要 pip install PyWin3

    2023年04月16日
    浏览(25)
  • Python绘图系统11:绘制极坐标图像

    Python绘图系统: 📈从0开始的3D绘图系统📉一个3D坐标系,多个函数 自定义控件:📉 极坐标绘图 图表类型和风格:散点图和条形图📊混合类型图表 用坐标个数来判断是否绘制三维图的确很直观,但从matplotlib的绘图逻辑来说却非如此,对于matplotlib来说,只有直角坐标是真实

    2024年02月10日
    浏览(47)
  • opencv 图像分割与提取(python)

    图像分割与提取 图像中将前景对象作为目标图像分割或者提取出来。 对背景本身并无兴趣 分水岭算法及GrabCut算法对图像进行分割及提取。 用分水岭算法实现图像分割与提取 分水岭算法将图像形象地比喻为地理学上的地形表面,实现图像分割,该算法非常有效。 算法原理

    2024年02月04日
    浏览(48)
  • Appium+python自动化(二十二)- 控件坐标获取(超详解)

    有些小伙伴或者是童鞋可能会好奇会问上一篇中的那个monkey脚本里的坐标点是如何获取的,不是自己随便蒙的猜的,或者是自己用目光或者是尺子量出来的吧,答案当然是:NO。获取控件坐标点的方式这里宏哥给小伙伴们分享和讲解三种方法,个人喜欢第二种,也推荐小伙伴

    2024年02月15日
    浏览(33)
  • OpenCV Python – 如何在图像上显示点击点的坐标?

    OpenCV为我们提供不同类型的鼠标事件,包括左键或右键单击、鼠标移动、左键双击等。鼠标事件返回鼠标事件的坐标(x,y)。为了在事件发生时执行一个操作,我们定义一个鼠标回调函数。我们使用左键单击(cv2.EVENT_LBUTTONDOWN)和右键单击(cv2.EVENT_RBUTTONDOWN)来显示在图像上单击的点

    2024年02月06日
    浏览(38)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(50)
  • Python人工智能应用--图像识别&&深度学习

    像素(缩写为px)是图像中的最小单位,由一个个小方格组成。 这些小方格都有一个固定的位置和颜色,共同决定了图像所呈现出来的样子。 这些小方格的行数与列数又被叫做分辨率。我们常说的某幅图像的分辨率是1280×720,指的就是这张图中的每一行都有1280个像素,每一列都

    2024年04月09日
    浏览(71)
  • Qt QGraphicsItem获取鼠标位置对应图像坐标

    本次使用了QGraphicsView来加载图像,然后给其设置了一个QGraphicsScene场景,再给场景添加了一个自定义的QGraphicsItem,在其中重写了paint事件,用来重绘图像。 正常情况时,QGraphicsItem上图像的有效区域QRect大小和QGraphicsView一致,此时正好铺满,鼠标位置的坐标可以比较轻松的推

    2024年01月22日
    浏览(42)
  • python:使用Scikit-image库对单波段遥感图像做特征提取

    作者:CSDN @ _养乐多_ 本文将介绍使用Scikit-image库对单波段遥感图像做特征提取的代码。方法包括:颜色直方图特征提取(histogram),纹理特征提取(texture) ,形状特征提取(morphology) ,边缘检测特征提取(edges) ,角点检测特征提取(corner) ,尺度空间特征提取(scale-

    2024年02月10日
    浏览(52)
  • Python-OpenCV中的图像处理-GrabCut算法交互式前景提取

    cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode=…) img:输入图像 mask:掩模图像,用来确定那些区域是背景,前景,可能是前景/背景等。 可以设置为: cv2.GC_BGD,cv2.GC_FGD,cv2.GC_PR_BGD,cv2.GC_PR_FGD,或者直接输入 0,1,2,3 也行。 rect :包含前景的矩形,格式为

    2024年02月13日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包