霍夫(Hough)变换是利用图像的全局特性直接检测目标的轮廓,将图像边缘像素连接起来的常用方法。在预先知道区域形状的条件下,利用Hough变换可以方便地将不连续的边缘像素点连接起来,从而得到边界曲线。
Hough变换的基本思想是利用点、线的对偶进行操作。图像变换前在图像空间,变换后再参数空间。图像空间中共线的所有点对应于参数空间中交于同一点的所有直线;反之,也成立。这样,就可以把图像空间中求直线长度(即共线点的个数)转化为求参数空间中过一点直线的个数;反之,也成立。
(1)在MATLAB图像处理工具箱中提供了hough()函数用于实现Hough变换,该函数的调用格式如下:
[H, theta, rho]=hough(BW):
[H, theta, rho]=hough(BW, ParameterName, ParameterValue):
其中,H是Hough变换矩阵;theta(以度计)为变换角度θ,rho为变换半径ρ,都是一维向量;BW时输入图像;
当参数ParameterName=‘RhoResolution’时,实值标量ParameterValue介于0~norm(size(BW))之间,默认值为1,间隔为rho;
当参数ParameterName='Theta'时,实值向量ParameterValue(θ)介于[-90:90)之间,默认值-90:89,间隔为theta;
(2)在MATLAB图像处理工具箱中提供了houghpeaks()函数用于Hough变换中的峰值识别,该函数的调用格式如下:
peaks = houghpeaks(H, numpeaks):H是Hough变换矩阵;numpeaks是峰值的数量;
peaks = houghpeaks(..., param1, val1, param2, val2):
可选参数'Threshold',非负标量值,表示H值被认为是峰值的阈值。阈值可以从0变化到Inf。默认值为0.5*max(H(:)) ;
可选参数'NHoodSize',正奇数整数的两元素向量:[M N],表示抑制邻域的大小。这是在峰值被识别之后,每个峰值周围的邻域设置为零,默认值为大于或等于size(H)/ 50的最小奇数值。简单来说,就是通过把所发现峰值的直接邻域中的霍夫变换单元置0来清理峰值。
(3)在MATLAB图像处理工具箱中提供了houghlines()函数用于实现基于Hough变换提取直线段,这些直线段是与被识别峰值相关的有意义的线段,该函数的调用格式如下:
lines = houghlines(BW, theta, rho, peaks)
lines = houghlines(..., param1, val1, param2, val2)
其中,theta和rho是来自函数hough()的输出,peaks是函数houghpeaks()的输出。输出lines是结构数组(可能检测到多条直线),长度等于找到的线段数。结构中的每个元素可以看成一条线,并含有下列字段:
point1:两元素向量[r1, c1],指定了线段起点的行列坐标;
point2:两元素向量[r2, c2],指定了线段终点的行列坐标;
theta:与线相关的Hough变换的以度计量的角度;
rho:与线相关的Hough变换的ρ轴位置。
其他参数如下:
参数val1是正的标量,指定了与相同的霍夫变换相关的两条线段的距离。当两条线段之间的距离小于指定的值时,函数houghlines()把线段合并为一条线段(默认的距离是20);
参数val2是正的标量,指定合并的线段是保留还是丢弃。如果合并的线段比val2指定的值小,就丢弃(默认值是40)。
下面通过具体实例来说明利用Hough变换的方法来寻找图像中线段的方法:
代码:
显示效果:
从上面结果中可以看出,在一定的约束条件下,找到的最长线段为265,最短线段为19。上述结果可能还不是最好的,所以需要多次实验来调整检测阈值,即houghpeaks()函数中‘Threshold’参数的值。
MATLAB的世界
「十」MATLAB语言之程序性能优化
上一篇:MATLAB图像变换之傅里叶变换
最后,感谢您的耐心阅读!