【问题标题】:How to implement the Hough Transform?如何实现霍夫变换?
【发布时间】:2012-03-24 11:16:20
【问题描述】:
如何在文本图像上实现Hough transform?我正在寻找伪代码(最终会在 java 中)。
这里是一些背景信息:
给定图像,确定直线y = mx + b 的方程。通常,霍夫变换以极坐标表示,例如Rho = y*sin(theta) + x*cos(theta)。 (我不太确定 X 和 Y 值对应于图像)。
我们只对Rho 和theta 值感兴趣并绘制它们。累加器中有很多点的位置(我知道一些实现,而不是执行)被认为是一条线。
我不明白的问题是如何找到更新累加器的rho 和theta。
【问题讨论】:
标签:
java
image
image-processing
signals
transform
【解决方案1】:
霍夫变换最简单的情况是线性变换
检测直线。在图像空间中,直线可以是
描述为 y = mx + b 并且可以为每对绘制图形
图像点数 (x, y)
所以这会告诉您x 和 y 对应于图像中的背面。
在霍夫变换中,一个主要思想是考虑特征
直线的不是像点 (x1, y1), (x2, y2), ...,而是
相反,就其参数而言,例如斜率参数 m 和
截距参数b。
基于这一事实,直线 y =
mx + b 可以表示为参数空间中的一个点 (b, m)。
然而,人们面临着垂直线引起的问题
参数 m 和 b 的无限值。由于计算原因,
因此最好使用一对不同的参数,表示为
和 (theta),用于霍夫变换中的线。
参数 rho 表示直线与直线之间的距离
原点,而 theta 是从原点到这个向量的角度
最近的点。
这告诉您 rho 和 theta 对应于什么:它们是您试图在图像中描述的直线的斜率和截距的极坐标表示。
在SourceForge 上,您可以找到C++ 霍夫变换的实现。
您应该能够解释我在上一个链接中指出的代码的描述可能如下:
霍夫变换算法使用一个称为累加器的数组来
检测是否存在一条线 y = mx + b。
例如,线性霍夫变换问题有两个未知数
参数:m 和 b。
对于每个像素及其邻域,霍夫变换算法
确定该像素是否有足够的边缘证据。如果
所以,它会计算那条线的参数,然后寻找
参数落入累加器的 bin,并增加
该 bin 的值。
通过查找具有最高值的箱,通常通过查找
累加器空间中的局部最大值,最可能的行可以是
提取