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

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

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

img

img

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

  • 写回答

2条回答 默认 最新

  • 溪风沐雪 2022-07-03 01: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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月11日
  • 已采纳回答 7月3日
  • 修改了问题 7月2日
  • 创建了问题 7月2日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵