计算机视觉基础:霍夫变换(Computer Vision Fundamentals: Hough Transform)

霍夫变换

核心思想

将二值图像由直角坐标系的表达方式转化为极坐标系表达。这样,极坐标系下具有相同 ρ \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. 首先选择角度分辨率, 如当分辨率为1时,则一共有180个角度 (0 ~ 180).
  2. 构建accumulator, 即一个表格(这里有个特殊名词叫Hough space),横坐标为 θ \theta θ ( 0 − 180 度 ) (0 - 180度) (0180), 纵坐标 ρ \rho ρ (0, 对角线的长度)
  3. 对于任何一个前景点,我们给定一个经过该点的 θ \theta θ, 就会计算出一个对应的 ρ \rho ρ, 然后给对应表格 ( ρ , θ ) (\rho, \theta) (ρ,θ)加一。
  4. 遍历所有前景点,得到最终表格。
  5. 使用阈值对直线进行选择。

下图动态地展示了上述1-5的操作过程:

在这里插入图片描述

下图直观地展示了一个从直角坐标转化到极坐标之后的图像,霍夫空间中高亮点的地方就是直角坐标系下直线可能出现的地方:

在这里插入图片描述

概率霍夫变换 (PPHT)

简介

OpenCV给我们提供了两种霍夫变换的实现方式,一种是原始的霍夫变换,另一种是概率霍夫变换。区别在哪儿呢?

扫描二维码关注公众号,回复: 15614652 查看本文章

我们发现,霍夫变换的计算量和占用内存情况还是很大的,特别是当前景像素点较多,或分辨率较小的时候,概率霍夫变换在一定程度上解决了这个问题。

核心思想

概率霍夫变换的主要思想是:只将部分前景点计算到霍夫空间中,而不是遍历直角坐标系下的所有点, 从而简化运算

基本流程

  1. 检查图像是否为空,如果为空则结束
  2. 在图像中随机选择一个前景点映射到极坐标系,更新累加器(accumulator)
  3. 在图像中删除这个前景点
  4. 检测更新后的累加器的峰值,看其是否超过设定的阈值 T T T. 如果没超过,返回1
  5. 沿着累加器的峰值查看,找到具有连续像素的线段,或者找到不超过给定阈值间隙的最长线段。
  6. 在图像中把线段上所有的前景点去掉。(这样可以减少计算量)
  7. 在累加器中将刚才线段上的所有点对应的 ρ \rho ρ θ \theta θ去掉
  8. 如果线段长于设定的最小长度,则将其添加到输出列表中
  9. 返回1

参考文献

[1] Hough Line Transform

[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

猜你喜欢

转载自blog.csdn.net/xuyangcao123/article/details/115189636