在HoughLines(opencv)之前Canny有什么用?

时间:2012-02-16 11:32:07

标签: opencv edge-detection hough-transform

我是图像处理的新手,我正致力于检测文档图像中的线条。我阅读了霍夫线变换的理论,但是我不明白为什么我必须在opencv中调用该函数之前使用Canny,就像在许多教程中所说的那样。在这种情况下找到边缘的重点是什么?事实是,如果我在HoughLines()之前不使用Canny或阈值,结果将非常混乱。我希望有人能为我解释原因。

我读过的2篇教程:

  1. Imgproc Feature Detection
  2. Hough Line Transform

4 个答案:

答案 0 :(得分:11)

首先,要检测需要处理boolean矩阵图像(或二进制)的行,我的意思是:颜色是黑色白色,没有灰度

HoughLines()正常工作的要求是将这种图像作为输入。这就是您必须使用CannyTreshold彩色图像矩阵转换为布尔图像矩阵的原因。

Hough转型

一张照片中的一条线实际上是边缘。霍夫变换扫描整个图像并使用转换来转换极坐标中的所有白色像素笛卡尔坐标; 黑色像素被排除在外。因此,如果您第一次不检测边缘,则无法获得线条,因为HoughLines()在灰度级时不知道如何表现。

答案 1 :(得分:10)

简答

cvCanny用于检测边缘,以及增加对比度和消除图像噪声。 使用Hough变换的HoughLines用于确定这些边是否为线。霍夫变换需要很好地检测边缘,以便有效并提供意义结果。

长答案

维基百科上更详细地描述了Hough Transform的局限性。

霍夫变换的效率依赖于相邻像素的区域是不同的,例如,像素与其周围邻居之间的直接对比,或者如果使用掩模区域,则是像素区域及其周围区域。如果所有像素具有相似的累积值,则没有任何东西可以作为线或圆突出。这导致颜色减少(颜色变为灰度,灰度变为黑色和白色)以增加收缩。

霍夫变换的参数数量也增加了像素区中投票的扩散并增加了变换的复杂性,这意味着通常只使用它来可靠地检测线或圆,因为它们具有少于3个参数。

在运行霍夫变换之前需要很好地检测边缘,否则其效率会进一步降低。此外,噪声图像不能与Hough变换一起使用,除非噪声被移除。

答案 2 :(得分:3)

理论上,你是对的。 Hough Line算法无法正常查找边缘。

Hough的工作方式基本上是它需要每个点并将其连接到其他每个点,并且无论哪个点都有最多的线穿过它们,这些线都会停留。为此,我们需要积分。 Canny创造了这些点。从理论上讲,你可以使用任何类型的滤镜 - 隔离所有蓝色或紫色点并连接它们,无论如何 - 但边缘效果很好。

霍夫也没有对其线条或点进行加权。对于霍夫来说,图像是二进制的 - 由1或0,点或非点组成。不需要灰度,并且canny方便地返回二进制图像。

因此,Canny永远是Hough的一部分。

答案 3 :(得分:-2)

所有都是关于处理二进制数据,

复杂数据 - > (二进制数据,b二进制数据,c二进制数据......)(使用canny(),sobel()等)

二进制数据 - > function1()(使用houghlines())

b二进制数据 - >函数2()

c二进制数据 - > function3()..

二进制数据-X-> function2()..

复杂数据-X-> function1()..

HTH