[关闭]
@lutingting 2016-11-07T08:52:04.000000Z 字数 5512 阅读 12149

Hough变换原始形式-直线检测

数字图像处理 图像特征提取


注意,本文在总结过程中,参考了许多其他绘图,每种情况下使用的符号不太一致,所以,每个小节使用的符号都仅以各小节图像为主,不要混淆!

1.直角坐标系与极坐标系中的直线表示

1.1 直角坐标系与极坐标系 中的点的表示及它们之间相互关系

极坐标系(polar coordinates)是指在平面内由极点O、极轴L和极径r组成的坐标系,下图就展示了一个极坐标系,图中两个红点是要利用极坐标表示的两个点,黑色点是极坐标系的极点
image_1b0kghrthmdmt6vik08p71ma09.png-19kB

那么,极坐标系和直角坐标系之间什么关系呢?

1.2 直角坐标系与极坐标系中的直线

image_1b0kh3q0chf21r9ufib11rutl2u.png-263.3kB

在极坐标系下,应该如何表示直线方程呢?如上图所示,有一直线L,点P是直线L上任意一点,其对应的直角坐标为(x,y),该点的极坐标为,该直线距 离原点距离为ρ:

即直线的极坐标方程! 也就是说,每一组参数(坐标原点到直线的距离)和(垂线 与x轴正方向的夹角 )将唯一确定了一条直线!并且,在极坐标系下,直线的方程就是一个点

2.利用Hough变换检测直线

2.1 线到点的Hough变换

2.1.1 通俗解释

下面的例子形象地展示了如何利用Hough变换进行直线检测的过程,这里应该注意,图像中的一条直线其实就仅仅对应于极坐标系下(参数空间)的一个点:

2.2 Hough变换检测直线的实现

2.2.1 赵小川教程中的例子

2.2.2 matlab自带hough变换相关函数

matlab自带了Hough变换的相关函数:


1. 读取图像并得到边缘图像

  1. % 读取matlab自带的图像gantrycrane,并提取边缘
  2. RGB = imread('gantrycrane.png');
  3. I = rgb2gray(RGB);
  4. BW = edge(I,'canny'); %提取边缘
  5. subplot(1,2,1);imshow(RGB);title('原始图像');
  6. subplot(1,2,2);imshow(BW);title('边缘图像');

image_1b0kmu16j6i5ius1hu11thp1nuv9.png-68.9kB

2. 利用Hough函数对输入图像边缘进行hough变换

  1. % 对原始图像边缘进行hough变换,指定参数的分别率(取样间隔),区间利用默认值
  2. [H,T,R] = hough(BW,'RhoResolution',0.5,'ThetaResolution',0.5);

3.显示hough变换的结果,即显示矩阵H(即bins)

  1. % 显示hough变换的结果
  2. figure;
  3. imshow(imadjust(mat2gray(H)),'XData',T,'YData',R,...
  4. 'InitialMagnification','fit');
  5. title('Limited Theta Range Hough Transform of Gantrycrane Image');
  6. xlabel('\theta'), ylabel('\rho');
  7. axis on, axis normal;
  8. colormap(hot)

image_1b0mkkvvrk1d1vcfqfd1ng59tom.png-110.7kB

这里应该注意,在进行hough变换时,并没有对参数区间进行限制,那么,如果按照下面方式对theta区间进行限制,会得到什么结果呢?
[H,T,R] = hough(BW, 'Theta', 44:0.5:46);
image_1b0mkrrka1bn81ol41c84pgh1u3e13.png-30.4kB
这里可以看到,由于hough变换时,限制了的范围,所以,得到的H矩阵只对应了[44:0.5:46]这个范围内的参数,具体地,的取值为[44,44.5,45,45.5,46];

4.显示hough变换结果中的极值点
将hough变换矩阵中的前10个峰值提取出

  1. % 显示霍夫变换矩阵中的极值点
  2. P = houghpeaks(H,10,'threshold',ceil(0.3*max(H(:)))); % 从霍夫变换矩阵H中提取50个极值点
  3. x = T(P(:,2));%极值点的theta值,即P的第二列存放的是极值点的theta
  4. y = R(P(:,1));%极值点的rho值,即P的第二列存放的是极值点的rho
  5. hold on;plot(x,y,'s','color','black');

image_1b0ml09a0smk1e511g9ia5kc7d1g.png-115.2kB
image_1b0kv8rso7sk2kk3281ueo1d4t2n.png-10.5kB
其中的P的第一列存放的是提取到的极值点的rho的index,第二列存放的是提取到的极值点的theta的index

5.将提取得到的极值点变换回原图像,得到提取的直线

  1. % 找原图中的直线
  2. lines = houghlines(BW,T,R,P,'FillGap',18,'MinLength',80);

注意到,这里面涉及几个参数:

6.在原图像中绘制得到的直线

  1. % 绘制提取得到的直线
  2. figure, imshow(I), hold on
  3. max_len = 0;
  4. for k = 1:length(lines)
  5. % 绘制第k条直线
  6. xy = [lines(k).point1; lines(k).point2];
  7. plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
  8. % 绘制第k条直线的起点(黄色)、终点(红色)
  9. plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
  10. plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
  11. % 计算第k条直线的长度,保留最长直线的端点
  12. len = norm(lines(k).point1 - lines(k).point2);
  13. if ( len > max_len)
  14. max_len = len;
  15. xy_long = xy;
  16. end
  17. end
  18. title('提取到的直线');

image_1b0mlg6dm1v5t160nbuo1i57dao1t.png-115.9kB

  1. % 以红色线高亮显示最长的线
  2. plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');

image_1b0mlkbm0h8deqe1ok2dkq1k3s2n.png-120kB

3.Hough变换的优缺点

优点:

缺点:

Hough变换利用的是一种投票思想


Reference

  1. stackoverflow=explain hough transformation.http://stackoverflow.com/questions/4709725/explain-hough-transformation
  2. Polar and Cartesian Coordinates. https://www.mathsisfun.com/polar-cartesian-coordinates.html
  3. 百度百科.http://baike.baidu.com/link?url=mSklh9U7fzEEBhsSzfU1rkB4LOKwyptqZREe6KSd1VoNddlX4KVw92d644BVODlklByXHBv2V0fsemww4pD61q
  4. http://www.nabla.hr/Z_MemoHU-015.htm
  5. hough变换是如何检测出直线和圆的? http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/
  6. 现代数字图像处理技术提高及应用案例详解(MATLAB版). 赵小川

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注