我只是在冒险,并迈出了迈向计算机视觉的第一步。我试图自己实现霍夫变换,但我只是不明白整个画面。我阅读了维基百科条目,甚至阅读了理查德杜达和彼得哈特的原始“使用霍夫变换检测图片中的线条和曲线”,但没有帮助。
有人可以用更友好的语言向我解释吗?
我只是在冒险,并迈出了迈向计算机视觉的第一步。我试图自己实现霍夫变换,但我只是不明白整个画面。我阅读了维基百科条目,甚至阅读了理查德杜达和彼得哈特的原始“使用霍夫变换检测图片中的线条和曲线”,但没有帮助。
有人可以用更友好的语言向我解释吗?
以下是关于霍夫变换如何检测图像中线条的非常基本的可视化解释:
更常见的是考虑矩形坐标中的一条线,即y = mx + b。正如维基百科文章所述,一条线也可以用极坐标表示。霍夫变换利用了这种表示的变化(无论如何,对于线。讨论也可以应用于圆、椭圆等)。
霍夫变换的第一步是将图像缩小为一组边缘。Canny 边缘检测器是一种常见的选择。生成的边缘图像用作霍夫过程的输入。
总而言之,边缘图像中“点亮”的像素被转换为极坐标形式,即它们的位置使用方向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的试播集中使用过):想象一下,一个喷泉式的草坪洒水器早些时候在草坪的某个地方,将水滴洒在它周围。现在洒水器不见了,但水滴还在。想象一下,将每一滴水滴变成自己的洒水器,它自己将水滴洒在自己周围——向各个方向,因为水滴不知道它来自哪个方向。这会将大量的水分散在地面上,但会有一个地方会同时从所有水滴中溅出大量的水。那个地方就是原来的洒水器所在的地方。
对(例如)线检测的应用是类似的。图像中的每个点都是原始液滴之一;当它充当洒水器时,它会发送自己的液滴,标记所有可能通过该点的线条。大量二次液滴降落的地方代表了一条穿过大量图像点的线的参数 - 瞧!检测到线路!