我想提取图像的轮廓,用点坐标序列表示。
使用Canny
,我能够生成一个只包含图像边缘的二进制图像。然后,我尝试使用findContour
来提取轮廓。不过,结果并不好。
对于每一条边,我通常得到两条线,就像它被认为是一个非常薄的区域一样。我想简化我的轮廓,这样我可以把它们画成单线。或者用不同的函数提取它们,直接产生正确的结果会更好。
我查看了OpenCV的文档,但没有找到任何有用的东西,但我想我不是第一个遇到类似问题的人。有什么功能或方法可以使用吗?
以下是我迄今为止编写的Python代码:
def main():
img = cv2.imread("lena-mono.png", 0)
if img is None:
raise Exception("Error while loading the image")
canny_img = cv2.Canny(img, 80, 150)
contours, hierarchy = cv2.findContours(canny_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
contours_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
scale = 10
contours_img = cv2.resize(contours_img, (0, 0), fx=scale, fy=scale)
for cnt in contours:
color = np.random.randint(0, 255, (3)).tolist()
cv2.drawContours(contours_img,[cnt*scale], 0, color, 1)
cv2.imwrite("canny.png", canny_img)
cv2.imwrite("contours.png", contours_img)
比例因子用于突出轮廓的双线。以下是图片链接:
如有任何建议,将不胜感激。
如果我没弄错的话,你的问题与寻找参数(霍夫变换)意义上的直线无关。
相反,这是findContours
方法为一条直线返回多个轮廓的问题。
这是因为Canny是一个边缘检测器——这意味着它是与图像强度梯度(发生在线条两侧)调谐的滤波器。
所以你的问题更类似于:“我如何将低级边缘特征转换为单行?”,或者:“我如何导航轮廓层次结构来检测单行?”
这是一个相当常见的话题——这里是之前的一篇文章,提出了一个解决方案:
OpenCV转换Canny边缘到轮廓
我有一个边缘被坎尼探测到。我想提取边缘的轮廓。 我已经检查了下面的帖子。OpenCV转换Canny边缘到轮廓。 但是它没有处理复杂的形状。例如,带矩形的圆或带线的圆。 cv::findContours()函数有两个问题。1.返回非闭合边的闭合轮廓,但我需要非闭合轮廓2。为闭合边返回2个闭合轮廓(可能其中一个轮廓用于边,另一个用于边的内侧,但我想要两个轮廓中的一个。 有没有办法解决这个问题?谢谢。
Canny边缘检测用于检测图像中的边缘。 它接受灰度图像作为输入,并使用多级算法。可以使用类的方法在图像上执行此操作,以下是此方法的语法。 该方法接受以下参数 - image - 表示此操作的源(输入图像)的对象。 edges - 表示此操作的目标(边缘)的对象。 threshold1 - 类型为的变量表示滞后过程的第一个阈值。 threshold2 - 类型为的变量表示滞后过程的第二个阈值。 示
目标 在这一章中,我们将学习 Canny 边缘检测的概念 OpenCV 的 Canny 边缘检测函数:cv2.Canny() 理论基础 Canny边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 于 1986 年开发的。它是一个多阶段算法,我们将学习每个阶段做了什么。 降噪 由于边缘检测容易受到图像中的噪声影响,因此首先要用5x5高斯滤波器去除图像中的噪声。我们在前面的章节已经
目标 在本章中,我们将学习 Canny边缘检测的概念 OpenCV函数: cv.Canny() 理论 Canny Edge Detection是一种流行的边缘检测算法。它由John F. Canny发明 这是一个多阶段算法,我们将经历每个阶段。 降噪 由于边缘检测容易受到图像中噪声的影响,因此第一步是使用5x5高斯滤波器消除图像中的噪声。我们已经在前面的章节中看到了这一点。 查找图像的强度梯度 然
本文向大家介绍python实现canny边缘检测,包括了python实现canny边缘检测的使用技巧和注意事项,需要的朋友参考一下 canny边缘检测原理 canny边缘检测共有5部分组成,下边我会分别来介绍。 1 高斯模糊(略) 2 计算梯度幅值和方向。 可选用的模板:soble算子、Prewitt算子、Roberts模板等等; 一般采用soble算子,OpenCV也是如此,利用soble水平和
在openCV中,在应用canny边缘检测后,我想进一步处理结果(仅显示水平线,删除短线等)。但是canny的结果只是另一张图像。我想得到一个描述检测到的边缘的线条数组 我知道著名的霍夫线变换,但结果并不总是好的,这就是为什么我想手动处理精明的结果。输入: 仅输出精明: 输出canny-then-Hough线变换 这是用于检测楼梯边缘的Hough线变换结果(红线)。虽然canny edge检测到一