- 📚 相关推荐文章
- 范特霍夫方程 推荐
- 基尔霍夫电压定律 推荐
- 霍夫斯泰德文化维度理论 推荐
- 霍夫变换 推荐
- 范特霍夫等温方程 推荐

霍夫变换
-
2023年3月17日发(作者:梨小食心虫)霍夫变换函数:hough;houghpeaks;houghlines(1)
(2014-03-3111:50:36)
转载▼
分类:matlab
图像处理工具箱提供了三个与霍夫变换有关的函数。函数hough实现了
前面讨论的概念,函数houghpeaks寻找霍夫变换的峰值(累加单元的高
计数),函数houghlines以来自其他两个函数的结果为基础在原始图像中
提取线段。
1.函数hough
函数hough支持任意的默认语法:
[H,theta,rho]=hough(f)
还支持完整的语法形式:
[H,theta,rho]=hough(f,'ThetaRes',val1,'RhoRes',val2)
其中,H是霍夫变换矩阵,theta(以度计)和rho是ρ和θ值向量,在这
些值上产生霍夫变换。输入f是二值图像,val1是0到90的标量,指
定了沿θ轴霍夫变换的间距(默认是1),val2是0
例10.5霍夫变换的说明
在这个例子中,我们用简单的合成图像来说明hough函数的机理:
>>f=zeros(101,101);
>>f(1,1)=1;f(101,1)=1;f(1,101)=1;
>>f(101,101)=1;f(51,51)=1;
图10-10(a)显示了我们的测试图像,下面使用默认值计算并显示霍夫变
换的结果:
>>H=hough(f)
>>Imshow(H,[])
图10-10(b)显示了结果,以熟悉的方法使用imshow函数来显示。在带
有标度轴的较大图中显现霍夫变换常常更有用。
在接下来的代码片段中,我们调用带有三个参数的hough函数。然后
把向量theta和rho作为附加输入参量传递给imshow,从而控制水平轴
和垂直轴的标度。我们还要把'InitialMagnification'选项传递给带有值'fit'
的imshow函数,因此,整个图像将被强迫在图形窗口中进行装配。axis
函数被用来打开轴标记,并使其显示填充图的矩形框。最后,xlabel和
ylabel函数(见2.3.1节)用希腊字母LaTeX字体符号在轴上标值:
>>[H,theta,rho]=hough(f);
>>imshow(H,[],'XData',theta,'YData',rho,'InitialMagnification','fit')
>>axison,axisnormal
>>xlabel('theta'),ylabel('rho')
图10-10(c)显示了标上值之后的结果。三条曲线(直线也可考虑为曲线)
在±45°处的交点指出:f中有两组三个共线的点。两条曲线在
(ρ,θ)=(0,-90)、(-100,-90)、(0,0)和(100,0)处的交点指出:有4组位于垂直
线和水平线上的共线点。
2.函数houghpeaks
线检测和连接用的霍夫变换的第一步是用高的计数寻找累加单元(工
具箱文本把高的计数单元作为峰值)。因为存在霍夫变换参数空间中的
量化和典型图像的边缘并不是很完美的直线这样的事实,霍夫变换的峰
值倾向于相比霍夫变换单元更多。函数houghpeaks用任意默认语法来
寻找指定的峰值数:
peaks=houghpeaks(H,NumPeaks)
或者使用完整的语法形式:
peaks=houghpeaks(...,'Threshold',val1,'NHoodSize',val2)
其中,"…"指出来自默认语法和peaks的输入是持有峰值行和列坐标的
Q×2大小的矩阵。Q的范围是0到NumPeaks,H是霍夫变换矩阵。参
数val1是非负的标量,指定了H中的什么值被考虑为峰值;val1可以
从0到Inf变化,默认值是0.5*max(H(:))。参数val2是奇整数的两元素
矢量,指定量围绕峰值的邻域大小。当鉴别出峰值之后,邻域中的元素
被置为0。默认是由最小奇数值组成的两元素矢量大于或等于
size(H)/50。这个过程的基本思想是:通过把发现峰值的直接邻域中的霍
夫变换单元置0来清理峰值。我们在例10.6中说明函数houghpeaks。
3.函数houghlines
一旦一组候选的峰值在霍夫变换中被识别出来,如果存在与这些峰值相
关的有意义的线段,剩下的就是决定线的起始点和终点。函数houghlines
用默认的语法执行这个任务:
lines=houghlines(f,theta,rho,peaks)
或者使用完整的语法形式:
lines=houghlines(...,'FillGap',val1,'MinLength',val2)
其中,theta和rho是来自函数hough的输出,peaks是函数houghpeaks
的输出。输出lines是结构数组(可能检测到多条直线),长度等于找
到的线段数。结构中的每个元素可以看成一条线,并含有下列字段:
point1:两元素向量[r1,c1],指定了线段起点的行列坐标。
point2:两元素向量[r2,c2],指定了线段终点的行列坐标。
theta:与线相关的霍夫变换的以度计量的角度。
rho:与线相关的霍夫变换的ρ轴位置。
其他参数如下:
val1是正的标量,指定了与相同的霍夫变换相关的两条线段的距离。当
两条线段之间的距离小于指定的值时,函数houghlines把线段合并为一
条线段(默认的距离是20个像素)。参数val2是正的标量,指定合并的
线是保留还是丢弃。如果合并的线比val2指定的值短,就丢弃(默认值
是40)。
例10.6用霍夫变换检测和连接线
在这个例子中,我们用函数hough、houghpeaks和houghlines寻找图
10-7(f)所示二值图像f的一组线段。首先,我们用比默认值更好的角间
距(用0.2代替1.0)计算和显示霍夫变换:
>>[H,theta,rho]=hough(f,'ThetaResolution',0.2);
>>imshow(H,[],'XData',theta,'YData',rho,'InitialMagnification','fit')
>>axison,axisnormal
>>xlabel('theta'),ylabel('rho')
下一步,我们用函数houghpeaks寻找5个有意义的霍夫变换的峰值:
>>peaks=houghpeaks(H,5);
>>holdon
>>plot(theta(peaks(:,2)),rho(peaks(:,1)),...
'linestyle','none','marker','s','color','w')
前边的操作计算和显示霍夫变换,并添加使用函数houghpeaks的默认
设置寻找到的5个峰值位置。图10-11(a)显示了结果。例如,最左边较
小的方形确定与房顶相关的累加单元,以工具箱的角度作为参考倾向于
近似-74°,在图10-9(a)中是-16°。最后,我们使用函数houghlines寻找
和连接线段,用函数imshow、holdon和plot在原始的二值图像上添加
线段:
>>lines=houghlines(f,theta,rho,peaks);
>>figure,imshow(f),holdon
>>fork=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',4,'Color',[.8.8.8]);
end
图10-11(b)显示了使用检测到的叠加了较粗灰线的线段得到的结果。
完整示例:
1.f=imread('');
(1)
(f);title('TheOriginalimage')
=graythresh(f);
5.f=im2bw(f);
6.[H,theta,rho]=hough(f,'ThetaResolution',0.2);
(2)
(H,[],'XData',theta,'YData',rho,'InitialMagnification','fit')
,axisnormal
('theta'),ylabel('rho')
=houghpeaks(H,2);%检测2个峰值点
(theta(peaks(:,2)),rho(peaks(:,1)),...
14.'linestyle','none','marker','s','color','w')
('Thepeakpointlocation')
=houghlines(f,theta,rho,peaks);
(3)
(f),holdon
=1:length(lines)
=[lines(k).point1;lines(k).point2];
(xy(:,1),xy(:,2),'LineWidth',4,'Color',[.7.7.7]);
('Hough-transformationresult')
结果: