实现用Hough变换检测直线的算法.docx

上传人:cl****1 文档编号:547624619 上传时间:2023-02-18 格式:DOCX 页数:16 大小:656.32KB
返回 下载 相关 举报
实现用Hough变换检测直线的算法.docx_第1页
第1页 / 共16页
实现用Hough变换检测直线的算法.docx_第2页
第2页 / 共16页
实现用Hough变换检测直线的算法.docx_第3页
第3页 / 共16页
实现用Hough变换检测直线的算法.docx_第4页
第4页 / 共16页
实现用Hough变换检测直线的算法.docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《实现用Hough变换检测直线的算法.docx》由会员分享,可在线阅读,更多相关《实现用Hough变换检测直线的算法.docx(16页珍藏版)》请在金锄头文库上搜索。

1、沈阳理工大学数字图像处理课设1 设计目的1) 了解Hought变换的原理;2) 实现用Hough变换检测直线的算法。2 设计要求3) 找一幅或多幅(两幅以上)包含直线形状的图像,检测出图像中的多条直线; 4) 分析并显示各直线的角度、长度。 3 设计原理Hough变换是利用图像全局特性而将边缘像素连接起来组成区域封闭边界的一种方法。在预先知道区域形状的条件下,利用Hough变换可以方便的得到边界曲线而将不连续的像素边缘点连接起来。Hough变换的主要优点是受噪声和曲线间断的影响小。利用Hough变换可以直接检测某些已知形状的目标,如直线。Hough变换的基本思想是点线的对偶性。一方面,图像空间

2、中共线的点对应在参数空间里相交的线;另一方面,在参数空间中相交于同一个点的所有直线在图像空间里都有共线的点与之对应。因此Hough变换把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里进行简单的累加统计完成检测任务。如果参数空间中使用直线方程,当图像空间直线斜率为无穷大时,会使累加器尺寸和变很大,从而使计算复杂度过大。为解决这一问题,采用直线极坐标方程,变换方程如下:=xcos+ysin (3-1)根据3-1公式,原图像空间中的点对应新参数空间中的一条正弦曲线,即点- 正弦曲线对偶。检测直线的具体过程就是让取遍可能的值,然后计算的值,再根据和的值对累加数组累加,从而得

3、到共线点的个数。下面介绍和取值范围的确定。设被检测的直线在第一象限,右上角坐标为( m, n) ,则第一象限中直线的位置情况如图3.1所示。 图 3.1 坐标位置由图3.1可见,当直线从与x轴重合处逆时针旋转时,的值开始由0增大,直到180,所以的取值范围为0180。由直线极坐标方程可知:=x2+y2sin(+) (3-1)=sin-1(xx2+y2) (3-2)所以当且仅当x和y都达到最大且+=90时(根据80; %设置二值化的阈值为80 q(i,j)=255; %对图像进行二值化处理,使图像边缘更加突出清晰else q(i,j)=0; end end end subplot(2,2,4);

4、imshow(q);title(二值化处理后); % 检测直线 %Hough变换检测直线,使用(a,p)参数空间,a0,180,p0,2d a=180; %角度的值为0到180度d=round(sqrt(m2+n2); %图像对角线长度为p的最大值s=zeros(a,2*d); %存储每个(a,p)个数z=cell(a,2*d); %用元胞存储每个被检测的点的坐标for i=1:m for j=1:n %遍历图像每个点if(q(i,j)=255)%只检测图像边缘的白点,其余点不检测for k=1:a p = round(i*cos(pi*k/180)+j*sin(pi*k/180);%对每个点

5、1到180度遍历一遍,取得经过该点的所有直线的p值(取整)if(p 0) %若p大于0,则将点存储在(d,2d)空间s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加一zk,d+p=zk,d+p,i,j;%存储点坐标else ap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一zk,ap=zk,ap,i,j;%存储点坐标end end end end end % 显示效果for i=1:a for j=1:d*2 %检查每个累加器单元中存储数量if(s(i,j) 70) %将提取直线的阈值设为7

6、0 lp=zi,j;%提取对应点坐标for k=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作o(lp(1,k),lp(2,k),1)=255; %每个点R分量=255,G分量=0,B分量=0 o(lp(1,k),lp(2,k),2)=0; o(lp(1,k),lp(2,k),3)=0; %结果为在原图上对满足阈值要求的直线上的点赋红色end end end end figure,imshow(o);title(hough变换提取直线);rotf = imrotate(f,33,crop);%BW = edge(rotf,canny);H,T,R = hough(

7、BW);imshow(H,XData,T,YData,R,InitialMagnification,fit);xlabel(theta), ylabel(rho);axis on, axis normal, hold on;P = houghpeaks(H,7,threshold,ceil(0.3*max(H(:);x = T(P(:,2); y = R(P(:,1);plot(x,y,s,color,white); % Find lines and plot themlines = houghlines(BW,T,R,P,FillGap,5,MinLength,7);figure, imsh

8、ow(rotf), hold onmax_len = 0;for k = 1:length(lines) xy = lines(k).point1; lines(k).point2; plot(xy(:,1),xy(:,2),LineWidth,2,Color,green); % plot beginnings and ends of lines plot(xy(1,1),xy(1,2),x,LineWidth,2,Color,yellow); plot(xy(2,1),xy(2,2),x,LineWidth,2,Color,red); % 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; endend% highlight the longest line segmentplot(xy_long(:,1),xy_long(:,2),LineW

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号