菜菜的进阶 2022-07-02 15:47 采纳率: 66.7%
浏览 126
已结题

关于#python#的问题:用python语言提取已经二值化后的mask掩码图片的像素坐标值,只需要输出掩膜最上面那一根曲线(下面那个红色箭头指向的曲线,不是整个白色区域)的所有像素坐标

用python语言提取已经二值化后的mask掩码图片的像素坐标值,只需要输出掩膜最上面那一根曲线(下面那个红色箭头指向的曲线,范围大概就是红色括号的部分,不是整个白色区域)的所有像素坐标,图片大小是512*512

img

img

之前我思考的是对图片每一列从上到下进行遍历,提取出这一列中第一个白色像素,然后输出坐标,万一白色区域呈现梯形,可以设置阈值,排除下面干扰的坐标

  • 写回答

2条回答 默认 最新

  • 溪风沐雪 2022-07-02 17:15
    关注

    可以考虑在中间部分等间距取几个点,然后拟合一条直线,那么直线基本是平行于你要的那条线的,然后把直线下移几个坐标,然后取直线上方的白色区域,然后再取每一列的最大值,示例代码如下:

    from random import randint
    from certifi import where
    import cv2
    import numpy as np
    from scipy import optimize as op
    
    def f_1(x, A, B):
        return A * x + B
    
    img = cv2.imread('test.jpg')
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    ret,binary = cv2.threshold(gray,80,255,cv2.THRESH_BINARY)
    shape = binary.shape
    xs = [randint(50,250) for _ in range(20)]
    xs.sort()
    ys = [min(np.where(binary[:,x]>0)[0]) for x in xs]
    A, B = op.curve_fit(f_1, xs, ys)[0]
    print(A,B)
    x = np.arange(0,shape[1])
    y = A*x+B+3
    coors = []
    for i,j in zip(x,y):
        if len(np.where(binary[:,i]>0)[0])>0 and np.where(binary[:,i]>0)[0][0]<j:
            coors.append([[i,np.where(binary[:,i]>0)[0][0]]])
    cv2.drawContours(img,np.array(coors),-1,(0,0,255),2,cv2.LINE_AA)
    cv2.imshow('img',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    img

    img

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    菜菜的进阶 2022-07-03 07:59

    谢谢您的解答,太感谢您了,刚刚我试了一下,效果感觉还不错,就是下面那个for循环的i和j是提取的红色曲线的像素坐标吗?我又换了一张图测试了一下,为什么最左边曲线的提取效果不是特别好呀

    img

    img

    回复
    溪风沐雪 回复 菜菜的进阶 2022-07-03 10:35

    图形越不规则越麻烦,你可以适当的把y = A*x+B+3里边的3加大一点

    回复
    菜菜的进阶 回复 溪风沐雪 2022-07-03 12:23

    好嘞⊙▽⊙,我试试

    回复
    展开全部6条评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 7月10日
  • 已采纳回答 7月3日
  • 修改了问题 7月2日
  • 创建了问题 7月2日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部