什么';HoughLines之前的Canny(opencv)的用途是什么?

什么';HoughLines之前的Canny(opencv)的用途是什么?,opencv,edge-detection,hough-transform,Opencv,Edge Detection,Hough Transform,我是图像处理新手,我正在研究检测文档图像中的线条。我阅读了Hough线变换的理论,但我不明白为什么在调用opencv中的函数之前必须使用Canny,就像许多教程中所说的那样。在这种情况下找到边有什么意义?事实上,如果我不在HoughLines()之前使用Canny或threshold,结果将非常混乱。我希望有人能给我解释一下原因 我读过的教程中有两篇: 首先,要检测线条,您需要处理布尔值矩阵图像(或二进制),我的意思是:颜色是黑色或白色,没有灰度 HoughLines()正常工作的要求是将这

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

我读过的教程中有两篇:


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

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

    霍夫变换


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

    简短回答

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

    长答案

    维基百科上更详细地描述了该方法的局限性

    Hough变换的效率取决于累计像素的区域是否不同,例如,像素与其周围邻居之间的直接对比度,或者如果使用遮罩区域,则取决于像素区域及其周围区域。如果所有像素都有相似的累计值,没有什么会像直线或圆那样突出。这会导致颜色的减少(颜色变为灰度,灰度变为黑色和白色),以增加收缩

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


    在运行Hough变换之前,需要很好地检测边缘,否则其效率会进一步降低。此外,噪声图像也不能很好地与Hough变换配合使用,除非事先去除噪声。

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

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

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

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

    c二进制数据->函数3()

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

    复杂数据-X->function1()


    理论上,你是对的。寻找边并不是Hough线算法工作的绝对要求

    Hough的工作方式基本上是,它取每个点,并将其连接到每个其他点,无论什么点有最多的线穿过它们,这些线都会保持不变。为此,我们需要分数。精明的人创造了这些点。理论上,你可以使用任何类型的过滤器——隔离所有蓝色或紫色的点并连接它们,不管什么——但是边缘效果很好

    Hough也不为其线或点加权。对于Hough来说,图像是二进制的——由1s或0、点或非点组成。不需要灰度,canny可以方便地返回二值图像


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

    请提供一个最简单的工作示例,并链接到您所参考的“许多教程”之一。感谢您提供的链接!我现在明白了。非常感谢:>我明白了。我很抱歉我的英语不好,这对我阅读文件没有多大帮助。谢谢你的通俗易懂的回答。用findcontours代替canny怎么样?我认为轮廓也能像canny一样检测到边缘,但不适用于HoughLineTransform