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

Ris*_*isa 25 opencv edge-detection hough-transform

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

我读过的2个教程:

  1. Imgproc特征检测
  2. 霍夫线变换

Adv*_*cer 11

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

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

霍夫变换

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


App*_*234 11

简答

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

答案很长

维基百科上更详细地描述了霍夫变换的局限性.

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

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

在运行霍夫变换之前需要很好地检测边缘,否则其效率会进一步降低.此外,噪声图像不适用于Hough变换,除非噪声在手前消除.


joh*_*jik 5

理论上,你是对的。霍夫线算法的工作并不是绝对需要寻找边缘。

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

Hough 也不会对它的线条或点进行加权。对霍夫来说,图像是二进制的——由 1 或 0、点或非点组成。不需要灰度,canny 方便地返回二进制图像。

因此,Canny 始终是 Hough 的一部分。