hough变换理解

hough变换概念

在计算机中,经常需要将一些特定的形状图形从图片中提取出来,如果直接用像素点来搜寻非常困难,这时候需要将图像从像素按照一定的算法映射到参数空间。hough变化提供了一种从图像像素信息到参数空间的变换方法。对于像直线,圆,椭圆这样的规则曲线hough是一种常用的算法。hough变化最大的优点在于特征边缘描述中间隔的容忍性并且该变换不受图像噪声的影响。

hough变换原理

hough变换是一种将图像上的点映射到累加的参数空间,实现对已知解析式曲线的识别。

参数空间

由于直线斜率k存在无穷大的情况,这里hough变换将原图像空间转换到极坐标系表示的参数空间。即直线y=kx+b每一个点都代表一条直线。
如图所示:
这里写图片描述

参数空间的累加投票

在进行hough变换前,先需要将图像的边缘图像提取出来,在边缘图像的基础上进行hough变换。经过边缘图像每一个点的直线有很多,如下图:这里写图片描述
经过某一点的直线在参数空间的表示像一条正弦曲线。
在边缘图像中,只有表示边缘的像素点才有可能构成直线。现在回到参数空间,在参数空间H(ρ,θ)看作为一个累加器,一个表示直线信息的累加器。设置某一阈值,超过阈值的参数点所代表的直线表明图像中存在这一直线。

hough变换示例

RGB= imread('lines.png');
imshow(RGB),title('original image');
I = rgb2gray(RGB);
BW = edge(I, 'canny');  %  用canny算法提取边缘图像
figure,imshow(BW),title('edge image');
[H, T, R]=hough(BW);  % 计算得到的H为参数矩阵,T为限定直线的角度,R为直线到原点的值
figure, imshow(imadjust(mat2gray(H)), 'XData', T, ...   % 绘制hough变换的图
'YData', R, 'InitialMagnification', 'fit'),title('hough image');
xlabel('\theta'), ylabel('\rho');
axis on; axis normal; hold on;
colormap(hot);
peaks = houghpeaks(H,4);  % 该算法用来提取指定数目的峰值点,也是就是寻找直线
figure, imshow(BW);
hold on;
lines = houghlines(BW, T, R, peaks, 'FillGap',30, 'MinLength',30);

max_len = 0;
for k=1:length(lines)
xy = [lines(k).point1; lines(k).point2];
   plot(xy(:,1),xy(:,2),'LineWidth',3,'Color','b');
   plot(xy(1,1),xy(1,2),'x','LineWidth',3,'Color','yellow');
   plot(xy(2,1),xy(2,2),'x','LineWidth',3,'Color','red');

   len = norm(lines(k).point1 - lines(k).point2);
   if ( len > max_len)
      max_len = len;
      xy_long = xy;
   end
end

这里写图片描述

参考文献:《数字图像处理matlab版》-左飞
《数字图像处理第三版》 http://blog.csdn.net/poem_qianmo/article/details/26977557
https://en.wikipedia.org/wiki/Hough_transform
http://homepages.inf.ed.ac.uk/rbf/HIPR2/hough.htm

猜你喜欢

转载自blog.csdn.net/zqx951102/article/details/82770732