【发布时间】:2020-11-21 09:34:22
【问题描述】:
我只是在冒险,迈出了迈向计算机视觉的第一步。我试图自己实现霍夫变换,但我并没有得到全貌。我阅读了维基百科条目,甚至阅读了理查德杜达和彼得哈特的原始“使用霍夫变换检测图片中的线条和曲线”,但没有帮助。
有人可以用更友好的语言向我解释吗?
【问题讨论】:
标签: image-processing geometry computer-vision hough-transform pattern-recognition
我只是在冒险,迈出了迈向计算机视觉的第一步。我试图自己实现霍夫变换,但我并没有得到全貌。我阅读了维基百科条目,甚至阅读了理查德杜达和彼得哈特的原始“使用霍夫变换检测图片中的线条和曲线”,但没有帮助。
有人可以用更友好的语言向我解释吗?
【问题讨论】:
标签: image-processing geometry computer-vision hough-transform pattern-recognition
以下是关于霍夫变换如何检测图像中线条的非常基本的直观说明:
【讨论】:
通常认为直线是矩形坐标,即y = mx + b。正如维基百科文章所述,一条线也可以用极坐标表示。 Hough 变换利用了这种表示形式的变化(无论如何,对于线。讨论也可以应用于圆、椭圆等)。
霍夫变换的第一步是将图像缩减为一组边缘。 Canny 边缘检测器是一种常见的选择。生成的边缘图像用作 Hough 过程的输入。
总而言之,边缘图像中“点亮”的像素被转换为极坐标形式,即它们的位置使用方向 theta 和距离 r 表示 - 而不是x 和 y。 (图像的中心通常用作这种坐标变化的参考点。)
霍夫变换本质上是一个直方图。假设映射到相同 theta 和 r 的边缘像素定义了图像中的一条线。为了计算出现频率,theta 和 r 被离散化(划分为多个 bin)。一旦所有边缘像素都转换为极坐标形式,就会分析这些 bin 以确定原始图像中的线条。
通常会寻找 N 个最频繁的参数 - 或阈值参数,使得计数小于某些 n 的参数被忽略。
我不确定这个答案是否比您最初提供的来源更好 - 您是否有一个特别的问题?
【讨论】:
霍夫变换是一种寻找最有可能代表一条线(或一个圆,或许多其他事物)的值的方法。
你给霍夫变换一张线的图片作为输入。这张图片将包含两种类型的像素:一种是线条的一部分,另一种是背景的一部分。
对于线中的每个像素,都会计算所有可能的参数组合。例如,如果坐标 (1, 100) 处的像素是直线的一部分,那么它可能是梯度 (m) = 0 且 y 截距 (c) = 100 的直线的一部分。它也可以成为 m = 1, c = 99 的一部分;或 m = 2,c = 98;或 m = 3,c = 97;等等。您可以求解直线方程 y = mx + c 以找到所有可能的组合。
每个像素对可以解释它的每个参数(m 和 c)投一票。所以你可以想象,如果你的行中有 1000 个像素,那么 m 和 c 的正确组合将有 1000 票。
得票最多的 m 和 c 的组合作为该行的参数返回。
【讨论】:
这是另一种观点(在电视节目 Numbers 的试播集中使用过):想象一下,一个喷泉式的草坪洒水器早些时候在草坪上的某个地方,在其周围喷出水滴。现在洒水器不见了,但水滴还在。想象一下,将每一滴水滴变成自己的洒水器,它自己将水滴洒在自己周围——向各个方向,因为水滴不知道它来自哪个方向。这会将大量的水分散在地面上,但会有一个地方会同时从所有水滴中溅出大量的水。那个地方就是原来的洒水器所在的地方。
对(例如)线检测的应用是类似的。图像中的每个点都是原始液滴之一;当它充当洒水器时,它会发送自己的液滴,标记所有可能通过该点的线条。大量二次液滴降落的地方代表通过大量图像点的线的参数 - 瞧!检测到线路!
【讨论】: