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

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

我读过的2个教程:

  • Imgproc特征检测
  • 霍夫线变换

  • 简答

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

    长答案

    霍夫变换的局限在Wikipedia上有更详细的描述。

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

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

    在运行霍夫变换之前需要检测边缘,否则其效率会进一步下降。 另外噪声图像不适用于Hough变换,除非噪声在手之前被去除。


    首先,为了检测需要在boolean矩阵图像(或二进制)上工作的行,我的意思是:颜色是黑色或白色,没有灰度。

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

    霍夫变换

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


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

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

    霍夫也不会重压其线条或点。 对于霍夫来说,一幅图像是二元的 - 由1或0组成,即点或不点。 没有必要使用灰度,而Canny可以方便地返回二进制图像。

    因此,坎尼总是霍夫的一部分。

    链接地址: http://www.djcxy.com/p/79591.html

    上一篇: What's the use of Canny before HoughLines (opencv)?

    下一篇: OpenCV detect corners