菜菜的进阶 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日

悬赏问题

  • ¥60 在mc68335芯片上移植ucos ii 的成功工程文件
  • ¥15 笔记本外接显示器正常,但是笔记本屏幕黑屏
  • ¥15 Python pandas
  • ¥15 蓝牙硬件,可以用哪几种方法控制手机点击和滑动
  • ¥15 生物医学数据分析。基础课程就v经常唱课程舅成牛逼
  • ¥15 云环境云开发云函数对接微信商户中的分账功能
  • ¥15 空间转录组CRAD遇到问题
  • ¥20 materialstudio计算氢键脚本问题
  • ¥15 有没有代做有偿主要做数据可视化部分即可(2023全国高考更省一本线理科类)
  • ¥15 配置FPT报错,该如何处理