智能2112杨阳
一、目的
熟悉在MATLAB中如何使用Hough变换对图像进行检测,计算获得矢量化的边缘特征。
二、平台
MATLAB
三、内容
1、要求
选取一副图像(如房屋图像),利用hough变换检测,计算获得矢量化的边缘特征。
2、思路
首先先将彩色图片进行灰度处理,然后通过边缘检测算子,如roberts算子,sobel算子,log算子……对目标图像边缘进行检测。接着对图像进行Hough变换,找出变换域中的峰值数据(相交直线最多的点),根据峰值数据的空域坐标绘出对应直线。
3、代码实现
I0=imread('/Users/darellyang/Desktop/House.png');
I=rgb2gray(I0);%灰度图转换
rotI=imrotate(I,33,'crop');
BW=edge(rotI,'canny');
%BW=edge(rotI,'log');
%BW=edge(rotI,'roberts');
%BW=edge(rotI,'sobel');
imshow(BW);
title('原图');
%对图像进行Hough变换
[H,T,R]=hough(BW); %[H,theta,rho]
%显示变换域
figure,imshow(imadjust(rescale(H)),'XData',T,'YData',R,...
'InitialMagnification','fit');
xlabel('\theta');ylabel('\rho');
axis on,axis normal,hold on
title('变换域');
%计算变换域峰值
P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x=T(P(:,2));y=R(P(:,1));
plot(x,y,'s','color','red');
%标记直线
lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure,imshow(rotI),hold on
max_len=0;
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','white');
%Plot beginning and ends of lines
plot(xy(1,1),xy(1,2),'xw','LineWidth',2);
plot(xy(2,1),xy(2,2),'xw','LineWidth',2);
%Determine the endpoints of the longest line segment
len=norm(lines(k).point1-lines(k).point2);
if(len>max_len)
max_len=len;
xy_long=xy;
end
end
title('检测结果')
结果
如下为canny算子的情况,其他算子的情况仅需在检测边缘上更改算子即可。为了使此示例更具说明性,旋转图像。显示图像。
使用edge函数找到图像中的边缘。
计算由edge返回的二值图像的Hough变换。显示由hough函数返回的变换H。
使用houghlines函数查找图像中的线条。显示原始图像及其叠加线条的绘图。
四、总结
图像的Hough变换是一种图像特征提取的技术,通过投票法检测特定形状并提取,其方法是在参数空间中通过投票累加获得局部最大值,从而通过值得到符合特定形状的集合,该集合即为Hough变换结果。在Hough变换中,主要是利用图像的特殊形状,按照指定的函数进行参数空间点的累加,每取到函数形状上的点则进行投票累加,最后通过参数限制获得需要统计的点并组成点的集合,此时即可得到最终的边界点。Hough变换多用于对直线、圆、椭圆形状的检测和提取。Hough变换算法适用于所有能够用方程表达出的图像特征,而其算法的复杂度也随着图像特征方程的复杂度变化。
根据检测结果可以总结出以下几点。
1、Hough变换是通过函数拟合来完成边缘选择的,对于具有单一颜色、简单边缘以及已知函数的图像而言,Hough变换能够更好地选择边缘;
2、Hough变换不适合用于复杂颜色、复杂边缘的图像,这种图像都不适合进行函数拟合,Hough变换会使得最终的效果较差。
遇到的问题及解决方法:
问题:
在运行时出错,因为没有对图像进行灰度处理,显示使用算子后图像运行失败。
解决方法:
将图片进行灰度处理后运行成功。