hough变换检测线段.doc
文本预览下载声明
Hough变换检测直线
1)实验要求:
(1)找一幅或多幅(两幅以上)包含直线形状的图像,检测出图像中的多条直线;
(2)分析并显示各直线的角度、长度。
2)实验原理:
Hough变换用来在图象中查找直线。它的原理:
对于边界上的n个点的点集,找出共线的点集和直线方程。
对于任意两点的直线方程:y = ax + b,构造一个参数a,b的平面,从而有如下结论:
xy平面上的任意一条直线y = ax + b ,对应在参数ab平面上都有一个点
过xy平面一个点(x,y)的所有直线,构成参数ab平面上的一条直线。
如果点(x1,y1)与点(x2,y2)共线,那么这两点在参数ab平面上的直线将有一个交点
在参数ab平面上相交直线最多的点,对应的xy平面上的直线就是我们的解
Hough变换算法实现
由于垂直直线a,为无穷大,我们改用极坐标形式: xcos ( + ysin( = (
参数平面为(,( ,对应不是直线而是正弦曲线
使用交点累加器,或交点统计直方图,找出相交线段最多的参数空间的点
然后找出该点对应的xy平面的直线线段
由此可见,Hough变换的基本策略是:由图像空间中的边缘数据点去计算参数空间中的参数点的可能轨迹,并在一个累加器中给计算出的参考点计数,最后选出峰值。Hough变换法主要优点是受共线点的间隙和噪声影响较小。Hough变换的程序:
f=imread(d:\image\f.tif); %读取原图像
imshow(f); %显示原图像
H=hough(f); %原图像的hough变换
imshow(H,[]) %显示hough变换结果
Warning: Image is too big to fit on screen; displaying at 56% scale.
In truesizeResize1 at 308
In truesize at 44
In imshow at 161
[H,theta,rho]=hough(f); %为hough变化后加标度轴
imshow(theta,rho,H,[],notruesize)
axis on,axis normal
xlabel(\theta),ylabel(\rho) %显示带有标度轴的hough变换
Hough变换做线检测的程序:
f=imread(d:\image\f.tif);
imshow(f);
[g_canny_default,tc]=edge(f,canny); %使用canny边缘检测
g_canny_best=edge(f,canny,[0.04 0.10],1.5); %设置参数后的边缘检测
imshow(g_canny_best); %显示边缘检测后的图像
h=g_canny_best;
[H,theta,rho]=hough(h,0.5); %用一个比较默认值精细的角度间隔来计算hough变换
imshow(theta,rho,H,[],notruesize),axis on,axis normal
xlabel(\theta),ylabel(\rho)
[r,c]=houghpeaks(H,7); %用houghpeaks函数找到7个看起来很明显的hough变换峰值
hold on
plot(theta(c),rho(r),linestyle,none,marker,s,color,w)
lines=houghlines(h,theta,rho,r,c) %使用houghlines函数查找并连接线段
lines =
1x14 struct array with fields:
point1
point2
length
theta
rho
figure,imshow(h),hold on
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,2),xy(:,1),lineWidth,4,Color,[.6 .6 .6]);
end
Hough变换的结果:
a)显示的测试图像:
b)使用函数imshow显示的Hough变换:
c)带有标度轴的Hough变换:
Hough变换做线检测的结果:
经过Canny边缘检测器得到的边缘图像:
显示带有峰值位置重叠的Hough变换图像:
使用函数houghpeaks找到了7个看起来很
显示全部