用python语言提取已经二值化后的mask掩码图片的像素坐标值,只需要输出掩膜最上面那一根曲线(下面那个红色箭头指向的曲线,范围大概就是红色括号的部分,不是整个白色区域)的所有像素坐标,图片大小是512*512
之前我思考的是对图片每一列从上到下进行遍历,提取出这一列中第一个白色像素,然后输出坐标,万一白色区域呈现梯形,可以设置阈值,排除下面干扰的坐标
用python语言提取已经二值化后的mask掩码图片的像素坐标值,只需要输出掩膜最上面那一根曲线(下面那个红色箭头指向的曲线,范围大概就是红色括号的部分,不是整个白色区域)的所有像素坐标,图片大小是512*512
之前我思考的是对图片每一列从上到下进行遍历,提取出这一列中第一个白色像素,然后输出坐标,万一白色区域呈现梯形,可以设置阈值,排除下面干扰的坐标
可以考虑在中间部分等间距取几个点,然后拟合一条直线,那么直线基本是平行于你要的那条线的,然后把直线下移几个坐标,然后取直线上方的白色区域,然后再取每一列的最大值,示例代码如下:
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()