霍夫变换
核心思想
将二值图像由直角坐标系的表达方式转化为极坐标系表达。这样,极坐标系下具有相同 ρ \rho ρ和 θ \theta θ的位置如果大于一定阈值,说明该位置具有一条直线。
基本流程
对于一条直线,其在直角坐标系下可以表示为 y = k x + b y = kx+b y=kx+b, 在极坐标系下可以表示为 ρ = x cos θ + y sin θ \rho = x\cos \theta + y\sin \theta ρ=xcosθ+ysinθ。其中, ρ \rho ρ表示坐标原点到直线的距离, θ \theta θ表示直线和 x x x轴的夹角。
下面两个图都表示直角坐标到极坐标的转换,只不过坐标原点不同。
好了,有了直角坐标系到极坐标系的转换,对于任何一个二值图像(假设维度为 100 × 100 100 \times 100 100×100), 我们可以列一个表格(横坐标表示角度 θ \theta θ,纵坐标表示 ρ \rho ρ), 然后把所有的前景像素全部转化到极坐标下,具体操作如下:
- 首先选择角度分辨率, 如当分辨率为1时,则一共有180个角度 (0 ~ 180).
- 构建accumulator, 即一个表格(这里有个特殊名词叫Hough space),横坐标为 θ \theta θ ( 0 − 180 度 ) (0 - 180度) (0−180度), 纵坐标 ρ \rho ρ (0, 对角线的长度)
- 对于任何一个前景点,我们给定一个经过该点的 θ \theta θ, 就会计算出一个对应的 ρ \rho ρ, 然后给对应表格 ( ρ , θ ) (\rho, \theta) (ρ,θ)加一。
- 遍历所有前景点,得到最终表格。
- 使用阈值对直线进行选择。
下图动态地展示了上述1-5的操作过程:
下图直观地展示了一个从直角坐标转化到极坐标之后的图像,霍夫空间中高亮点的地方就是直角坐标系下直线可能出现的地方:
概率霍夫变换 (PPHT)
简介
OpenCV给我们提供了两种霍夫变换的实现方式,一种是原始的霍夫变换,另一种是概率霍夫变换。区别在哪儿呢?
我们发现,霍夫变换的计算量和占用内存情况还是很大的,特别是当前景像素点较多,或分辨率较小的时候,概率霍夫变换在一定程度上解决了这个问题。
核心思想
概率霍夫变换的主要思想是:只将部分前景点计算到霍夫空间中,而不是遍历直角坐标系下的所有点, 从而简化运算
基本流程
- 检查图像是否为空,如果为空则结束
- 在图像中随机选择一个前景点映射到极坐标系,更新累加器(accumulator)
- 在图像中删除这个前景点
- 检测更新后的累加器的峰值,看其是否超过设定的阈值 T T T. 如果没超过,返回1
- 沿着累加器的峰值查看,找到具有连续像素的线段,或者找到不超过给定阈值间隙的最长线段。
- 在图像中把线段上所有的前景点去掉。(这样可以减少计算量)
- 在累加器中将刚才线段上的所有点对应的 ρ \rho ρ和 θ \theta θ去掉
- 如果线段长于设定的最小长度,则将其添加到输出列表中
- 返回1
参考文献
[2] 霍夫变换
[3] https://en.wikipedia.org/wiki/Hough_transform
[4] J. Matas, C. Galambos and J. Kittler. “Robust Detection of Lines Using the Progressive Probabilistic Hough Transform,” in Computer Vision and Image Understanding, 2000, 78(1): 119-137 doi: 10.1006/cviu.1999.0831