我需要一个算法,可以识别输入图像的整体形状。我尝试了边缘检测和角点检测,但他们也在识别倾角和曲线。
如果输入图像,算法应该检测出高于初始点的点,除非它是图像顶部的最后一点;对于底部,算法应该识别那些低于初始点的点。通过这个过程,算法应该是ale来创建图像的整体边界形状,然后返回它。
有什么建议或联系吗?
输入图像:

预期产出:

发布于 2022-08-30 18:59:49
由于您没有提供任何库,所以我已经展示了如何使用OpenCV来完成它。
正如注释中提到的,寻找凸包是您所要寻找的。凸形是内角不大于180度的形状。关于更简单的解释,看看他的博客
下面的代码是用Python使用OpenCV编写的:
# read the input image
img = cv2.imread('red_plot.png')
img2 = img.copy()
# convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# obtain binary image, such that the red pixels are white
th = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]

# find contours (shapes with white pixels)
contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)contours包含在二进制图像中找到的所有形状的边界点。注意单词边界,因为我们只考虑白色区域的形状。为此,我们在查找等值线时使用cv2.RETR_EXTERNAL标志。
由于图中的线条没有连接,所以我们得到了多个等高线。下面的代码段收集单个变量中所有等值线的点:
cc = np.array([[0, 0]], dtype=int)
for i, c in enumerate(contours):
c_modified = c.reshape(len(contours[i]), 2)
cc = np.concatenate((cc, c_modified), axis = 0)
cc2 = cc[1:]
combined_contour = np.reshape(cc2, (cc2.shape[0], 1, cc2.shape[1]))combined_contour包含所有红色像素的边界点。
# finding convex hull
hull = cv2.convexHull(combined_contour, False)
# draw the result
color = (0, 255, 0)
img2 = cv2.drawContours(img2, [hull], -1, color, 3)
cv2.imshow('Convex hull', img2)
cv2.waitKey(0)

https://stackoverflow.com/questions/73543617
复制相似问题