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

关于#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日

悬赏问题

  • ¥50 内网的网页打开的Excel下载到本地
  • ¥15 该网站用的是什么程序模版
  • ¥15 verilog modelsim仿真
  • ¥15 Power BI 里面 帕累托图突出显示前20
  • ¥50 用预估矫正法,分数阶微分方程组传染病的最优控制代码怎么写
  • ¥15 画个数据流程图,手画也行
  • ¥60 AS自带模拟器AVD Root 和 Xposed安装
  • ¥30 哪位搞Android的编程师可以帮我远程一下,悬赏30元
  • ¥15 solidity部署上合约,可以mint,也继承接口了,在区块链也不显示代币名字
  • ¥15 讨论 博士论文交互项怎么讨论?