matlab-霍夫变换详解以及自编函数

参考文献: http://blog.sina.com.cn/s/blog_ac7218750101giyf.html

https://blog.csdn.net/saltriver/article/details/80547245

https://ww2.mathworks.cn/help/images/ref/hough.html

霍夫变换

霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆、曲线等。

直线的霍夫变换就是 把xy空间的直线 换成成 另一空间的点。就是直线和点的互换。

我们在初中数学中了解到,一条直线可以用如下的方程来表示:y=kx+bk是直线的斜率,b是截距。

我们转换下变成:b=-kx+y。我们是不是也可以把(kb)看作另外一个空间中的点?这就是k-b参数空间。 这样,我们就把一条x-y直线用一个(k,b)的点表示出来了。

我们看到,在x-y图像空间中的一个点,变成了k-b参数空间中的一条直线,而x-y图像空间中的2点连成的直线,变成了k-b参数空间中的一个交点。

如果x-y图像空间中有很多点在k-b空间中相交于一点,那么这个交点就是我们要检测的直线。这就是霍夫变换检测直线的基本原理。

当然,有一个问题需要注意,图像空间中如果一条直线是垂直的,那么斜率k是没有定义的(或者说无穷大)。为了避免这个问题,霍夫变换采用了另一个参数空间:距离-角度参数空间。也就是极坐标。

我们在中学中学过,平面上的一个点也可以用距离-角度来定义,也就是极坐标。那么在图像中,每一个点都可以用距离和角度来表达:

 

但是,使用距离-角度后,点(xy)与距离,角度的关系变成了:

ρ=xcosθ+ysinθ

于是,在新的距离-角度参数空间中,图像中的一个点变成了一个正弦曲线,而不是k-b参数空间中的直线了。这些正弦曲线的交点就是图像空间中我们要检测的直线了。

Matlab霍夫变换的函数详解

[H, theta, rho] = hough(BW,ParameterName, ParameterValue)

BW:二值图

ParameterName'RhoResolution''Theta'

RhoResolution-指定在累计数组中(检测极值)的检测间隔?默认为1

Theta-指定检测的角度范围(不超过-90~90度)以及间隔,例如-90:0.5:89.5,默认-90:1:89

H:累计数组

ThetaH对应的θ,实际上H的大小就是Rho×Theta

RhoH对应的ρ

 这两个参数值的注意,RhoResolution太大覆盖不到极值点,检测到一些不对应直线的次极值,

峰值提取

peaks = houghpeaks(H,numpeaks)

peaks = houghpeaks(...,param1, val1, param2, val2)

H:累计数组;

Numpeaks:指定需要检测的峰值个数;

Param1:可以是'Threshold''NHoodSize'

'Threshold'-指定峰值的域值,默认是0.5*max(H(:))

'NHoodSize'-是个二维向量[m,n],检测到一个峰值后,将峰值周围[m,n]内元素置零。

画直线段

lines = houghlines(BW,theta, rho, peaks)

lines = houghlines(...,param1, val1, param2, val2)

BW:二值图

Thetarhopeaks:分别来自函数houghhoughpeaks

Lines:结构数组,大小等于检测到的直线段数,每个单元包含

Point1point2:线段的端点

Thetarho:线段的thetarho

待续。。。。

猜你喜欢

转载自www.cnblogs.com/hyb965149985/p/10126396.html