HoughLines(opencv)之前的Canny有啥用?

Posted

技术标签:

【中文标题】HoughLines(opencv)之前的Canny有啥用?【英文标题】:What's the use of Canny before HoughLines (opencv)?HoughLines(opencv)之前的Canny有什么用? 【发布时间】:2012-03-07 19:22:57 【问题描述】:

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

我读过的 2 个教程:

    Imgproc Feature Detection Hough Line Transform

【问题讨论】:

请提供一个最小的工作示例并链接到您引用的“许多教程”之一。 感谢您的链接! 【参考方案1】:

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

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

霍夫变换

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

【讨论】:

我现在明白了。非常感谢:>【参考方案2】:

简答

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

长答案

Hough Transform 的限制在 Wikipedia 上有更详细的描述。

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

霍夫变换的参数数量也增加了像素箱中的投票分布,并增加了变换的复杂性,这意味着通常只有线或圆可以可靠地检测到,因为它们的参数少于 3 个。

在运行霍夫变换之前需要很好地检测边缘,否则它的效率会进一步受到影响。除非事先去除噪声,否则噪声图像也不适用于 Hough 变换。

【讨论】:

我明白了。我很抱歉我的英语不好,这对我阅读文件没有多大帮助。感谢您非常容易理解的回答。 用 findcontours 代替 canny 怎么样?我认为轮廓也检测到像 canny 这样的边缘,但不适用于 HoughLineTransform【参考方案3】:

理论上,你是对的。霍夫线算法并非绝对需要找到边缘。

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

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

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

【讨论】:

【参考方案4】:

一切都是关于处理二进制数据,

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

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

b 二进制数据 -> function2()

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

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

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

HTH

【讨论】:

以上是关于HoughLines(opencv)之前的Canny有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV+python:从 3.4.2 开始访问 HoughLines 累加器

OpenCV 的 HoughLines 以啥顺序列出 [rho,theta] 矩阵中检测到的线?

OpenCV-标准霍夫变换cv::HoughLines

OpenCV-标准霍夫变换cv::HoughLines

如何从 OpenCV C++ 中的 HoughLines 函数输出中绘制所需的线?

为啥OpenCV for Python的cv2.HoughLines的返回值需要用索引来访问?