您的位置:首页 > 编程语言 > MATLAB

霍夫变换检测直线--原理和Matlab实现

2016-02-19 20:27 645 查看
该博客所需代码和资源文件可以到Github中进行下载。

霍夫变换本质上是坐标变换,如下图1,左半部分表示直线的xy空间,直线方程为y=mx+cy=mx+c,其中斜率为m,截距为c。右半部分表示将直线从xy空间变换到mc空间,取直线在xy空间上的四点1,2,3,4,在mc空间就是不同斜率和截距的四条直线。



图1 直线坐标系变换

那么,在mc空间中四条直线的交点处的m值和c值就对应xy空间中直线的m和c。同理,对图片中的直线来说,将直线中的每个点都变换到变换后空间,找出多条直线相交的点就可以找出变换前空间的直线。

图1是为了更好理解坐标变换的概念,但是在实际应用中是将xy空间变换到极坐标系,方程为ρ=xcos(θ)+ysin(θ)\rho=xcos(\theta)+ysin(\theta),如下图2。



图2 直线的极坐标系参数

其中r,即ρ\rho为原点到直线的垂直距离,θ\theta为与x轴的夹角。从上述极坐标方程可以看出,将该直线变换到ρθ\rho\theta坐标系后将是一系列不同初相、幅度,但是周期均为2π2\pi的正弦曲线,所有正弦曲线交点处的ρ和θ\rho和\theta将代表xy空间中的这条直线。

下图3为测试图像,是一张简单但是有代表性的图像。



图3 测试图像

以下代码先根据canny算子找出图片的边缘,将图片边缘经过霍夫变换,变换到ρθ\rho\theta空间,因为图3中有5条直线,为了演示方便,取前5个交点最多处。

img  = imread('line.jpg');
subplot(221), imshow(img), title('original image');
img_gray = rgb2gray(img);
% the canny edge of image
BW = edge(img_gray,'canny');
subplot(223), imshow(BW), title('image edge');
% the theta and rho of transformed space
[H,Theta,Rho] = hough(BW);
subplot(222), imshow(H,[],'XData',Theta,'YData',Rho,'InitialMagnification','fit'),...
title('rho\_theta space and peaks');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
% label the top 5 intersections
P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x = Theta(P(:,2));
y = Rho(P(:,1));
plot(x,y,'*','color','r');


边缘信息和相应的霍夫变换结果如下图4。



图4 霍夫变换结果

上述代码找到了5条直线对应的ρ和θ\rho和\theta,通过如下代码进行反变换在原图中标记出相应的直线。

% find lines and plot them
lines = houghlines(BW,Theta,Rho,P,'FillGap',5,'MinLength',7);
figure, imshow(img), 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','r');
end


最终结果如下图5。



图5 霍夫变换最终结果

参考网址

/article/6129728.html

/article/1391088.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: