我是图像处理的新手,我正在检测文档图像中的线条。我阅读了霍夫线变换的理论,但我不明白为什么在 opencv 中调用该函数之前必须使用 Canny,就像在许多教程中所说的那样。在这种情况下寻找边缘有什么意义?事实是,如果我在 HoughLines() 之前不使用 Canny 或阈值,结果将非常混乱。我希望有人能给我解释原因。
我读过的2个教程:
我是图像处理的新手,我正在检测文档图像中的线条。我阅读了霍夫线变换的理论,但我不明白为什么在 opencv 中调用该函数之前必须使用 Canny,就像在许多教程中所说的那样。在这种情况下寻找边缘有什么意义?事实是,如果我在 HoughLines() 之前不使用 Canny 或阈值,结果将非常混乱。我希望有人能给我解释原因。
我读过的2个教程:
首先,要检测需要处理boolean
矩阵图像(或二进制)的线条,我的意思是:颜色是black或white,没有grayscale。
HoughLines()
正常工作的要求是将这种图像作为输入。这就是您必须使用Canny
orTreshold
将彩色图像矩阵转换为布尔值的原因。
霍夫变换
一张图片中的一条线实际上是一条边。霍夫变换扫描整个图像并使用将所有白色像素笛卡尔坐标转换为极坐标的变换;黑色像素被排除在外。因此,如果您首先不检测边缘,您将无法获得一条线,因为HoughLines()
当有灰度时不知道如何表现。
简答
cvCanny 用于检测边缘,以及增加对比度和去除图像噪声。使用 Hough 变换的 HoughLines 用于确定这些边缘是否为线。霍夫变换需要很好地检测边缘,以便高效并提供有意义的结果。
长答案
霍夫变换的局限性在 Wikipedia 上有更详细的描述。
Hough 变换的效率依赖于累积像素的 bin 是否不同,例如像素与其周围邻居之间的直接对比,或者如果使用掩码区域,则像素区域及其周围区域。如果所有像素具有相似的累积值,则没有任何东西会像一条线或圆一样突出。这导致颜色的减少(颜色到灰度,灰度到黑白)以增加合同。
霍夫变换的参数数量也增加了像素箱中的投票分布并增加了变换的复杂性,这意味着通常只有线条或圆形可以可靠地检测到,因为它们的参数少于 3 个。
在运行霍夫变换之前需要很好地检测边缘,否则它的效率会进一步受到影响。除非事先消除噪声,否则噪声图像也不适用于 Hough 变换。
从理论上讲,您是正确的。霍夫线算法的工作并不是绝对需要找到边缘。
Hough 的工作方式基本上是它获取每个点并将其连接到每个其他点,并且任何点有最多的线穿过它们,这些线会保留。为此,我们需要积分。Canny 创造了这些点。从理论上讲,您可以使用任何类型的过滤器 - 隔离所有蓝色或紫色点并将它们连接起来,无论如何 - 但边缘效果很好。
霍夫也不加权它的线或点。对霍夫来说,图像是二进制的——由 1 或 0、点或非点组成。不需要灰度,canny 可以方便地返回二进制图像。
因此,Canny 始终是 Hough 的一部分。
一切都是关于处理二进制数据,
复杂数据 ->(a 二进制数据,b 二进制数据,c 二进制数据,..)(使用 canny()、sobel() 等)
二进制数据 -> function1()(使用 houghlines())
b 二进制数据 -> function2()
c 二进制数据 -> function3() ..
二进制数据 -X-> function2() ..
复杂数据 -X-> function1() ..
高温高压