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

关于#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 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 路易威登官网 里边的参数逆向
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
  • ¥50 需求一个up主付费课程
  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入