5.3.4 直线提取检测
常见的边缘检测算子只产生边缘上的像素。由于噪声、不均匀照明引起的边缘断裂和亮度不连续而难以得到完全的边缘特性,这时Hough变换解决了此问题。
Hough变换于1962年由Paul Hough提出,并在美国作为专利被发表。它所实现的是一种从图像空间到参数空间的映射关系。由于具有一些明显优点和可贵性质,它引起了许多国内外学者和工程技术人员的普遍关注。例如,由于其根据局部度量来计算全面描述参数,因而对于区域边界被噪声干扰或被其他目标遮盖而引起边界发生某些间断的情况,它具有很好的容错性和鲁棒性。多年来,专家们对Hough变换的理论性质和应用方法进行了深入而广泛的研究,并取得了许多有价值的成果。
Hough变换的实质是将图像空间内具有一定关系的像元进行聚类,寻找能把这些像元用某一解析形式联系起来的参数空间累积对应点。在参数空间不超过二维的情况下,这种变换有着理想的效果。但是,一旦参数空间增大,计算量便会急剧上升,同时耗费巨大的存储空间,耗时也随之猛增。就此,多年来国内外众多学者针对具体情况对常规Hough变换进行了多方面的探索,并提出了许多有价值的改进方法。
MATLAB图像处理工具箱中提供了实现Hough变换函数houhg(),提取峰值点函数houghpeaks(),以及提取峰值点对应的直线函数houghlines(),在work目录下,调用hough.p、houghlines.p、houghpeaks.p、houghpixels.p函数。图5-21是一幅原始灰度图像,图5-22是用Canny算子得到的边缘检测结果,图5-23是用Hough变换查找到的峰值,图5-24是把检测到的线段叠加为灰色的粗线。程序代码如下:
f=imread('camera.jpg');
imshow(f);
gc_best=edge(f,'canny',[0.04 0.10],1.5);
figure,imshow(gc_best);
[H,theta,rho]=hough(gc_best,0.5);
figure,imshow(theta,rho,H,[],'notruesize');
axis on,axis normal;
xlabel('\theta'),ylabel('\rho')
[r,c]=houghpeaks(H,5);
hold on;
plot(theta(c),rho(r),'linestyle','none','marker','s','color','w');
lines=houghlines(gc_best,theta,rho,r,c);
figure,imshow(gc_best),hold on;
for k=1:length(lines);
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,2),xy(:,1),'linewidth',5,'color',[.6.6.6]);
end。
图5-21
图5-22
图5-23
图5-24
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。