图1 直线坐标系变换
那么,在mc空间中四条直线的交点处的m值和c值就对应xy空间中直线的m和c。同理,对图片中的直线来说,将直线中的每个点都变换到变换后空间,找出多条直线相交的点就可以找出变换前空间的直线。
图1是为了更好理解坐标变换的概念,但是在实际应用中是将xy空间变换到极坐标系,方程为
图2 直线的极坐标系参数
其中r,即
下图3为测试图像,是一张简单但是有代表性的图像。
图3 测试图像
以下代码先根据canny算子找出图片的边缘,将图片边缘经过霍夫变换,变换到
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条直线对应的
% 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 霍夫变换最终结果
参考网址
http://www.cnblogs.com/smartvessel/archive/2011/10/20/2218654.html
http://blog.csdn.net/jia20003/article/details/7724530