如何将线条拟合到边缘并找到中心点(opencv)

Posted

技术标签:

【中文标题】如何将线条拟合到边缘并找到中心点(opencv)【英文标题】:how to fit lines to edges and find the center point (opencv) 【发布时间】:2020-11-19 12:38:21 【问题描述】:

我有一张图像,我对其应用双边过滤器,然后进行自适应阈值处理以获得下面的图像。

原图(这是物体深度图的截图)

阈值图像

我想将线条拟合到垂直部分/线条并找到中心点,输出如下图:

我似乎无法理解cv2.adaptiveThreshold() 的输出。紫色像素(即我的边缘)如何表示?以及如何安装一条线? MWE:

import cv2

image = cv2.imread("depth_frame0009.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

bilateral_filter = cv2.bilateralFilter(gray_image, 15, 50, 50)
plt.figure()
plt.imshow(bilateral_filter)
plt.title("bilateral filter")
#plt.imsave("2dimage_gaussianFilter.png",blurred)
plt.imsave("depthmap_image_bilateralFilter.png",bilateral_filter)


th3 = cv2.adaptiveThreshold(bilateral_filter,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
plt.figure()
plt.imshow(th3)

========

编辑:

精巧的边缘 轮廓

【问题讨论】:

【参考方案1】:

它们被表示为一个图像,一个 uint8 的矩阵。

它是紫色和黄色的原因是因为 matplotlib 正在对其应用颜色图。

在绘制图像处理输出图像时,我一般更喜欢使用一些特定的参数,例如

plt.imshow(th3, cmap='gray', interpolation='nearest')

如果您对查找和拟合线条特别感兴趣,您可能希望使用不同的表示形式,例如Hough lines。在图像中找到线条后,您可以选取最适合的线条并找到它们之间的中心点。

【讨论】:

它现在看起来是白色和黑色(而不是紫色和黄色)。将霍夫线应用于adaptiveThreshold的输出不起作用,只有1条对角线穿过整个图像。在 cv2.Canny() 的输出上尝试霍夫线只能检测到水平线 我会在原始图像上做霍夫线。 我认为这行不通。在houghlines() 的文档中,他们是在获得 Canny 边缘后执行此操作的。我厌倦了原始的灰色图像,adaptiveThreshold,但在所有情况下,houglines() 都不起作用。只有当我使用精明的边缘作为输入时,它才会检测到水平线:!hough_lines_image。 分享原始图像对找到可行的解决方案更有帮助。

以上是关于如何将线条拟合到边缘并找到中心点(opencv)的主要内容,如果未能解决你的问题,请参考以下文章

opencv---(腐蚀膨胀边缘检测轮廓检索凸包多边形拟合)

在图像文件中查找一行

使用 OpenCV 检测停车位

opencv去除图片中线条,保留数字

如何让线条边缘平滑?

使用 OpenCv 和 Python 在线条上分组轮廓