(转+改)Hough变换--直线检测

1、霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体。该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆.

2、对于普通的二维直角坐标系,通过点(x0,y0)的直线可以用y0 = kx0+b来表示,但是对于垂直于X轴的斜率无限大,因此这种方式不能表示所有的直线。所以呢,我们 需要转换坐标用rol-theta极坐标系来表示:ρ=xCosθ+ySinθ(ρ为原点到直线的距离)

(转+改)Hough变换--直线检测_第1张图片

从上述极坐标方程可以看出,将该直线变换到ρθ坐标系后将是一系列不同初相、幅度,但是周期均为2π的正弦曲线,所有正弦曲线交点处的ρθ将代表xy空间中的这条直线。

3、对应函数

检测函数

[H, theta, rho] = hough(BW)

[H, theta, rho] = hough(BW,ParameterName, ParameterValue)

 

BW:二值图

ParameterName:'RhoResolution'或'Theta'

RhoResolution-指定在累计数组中(检测极值)的检测间隔?默认为1

Theta-指定检测的角度范围(不超过-90~90度)以及间隔,例如-90:0.5:89.5,默认-90:1:89

H:累计数组

Theta:H对应的θ,实际上H的大小就是Rho×Theta

Rho:H对应的ρ

峰值提取 

peaks = houghpeaks(H,numpeaks)

peaks = houghpeaks(...,param1, val1, param2, val2)

 

H:累计数组;

Numpeaks:指定需要检测的峰值个数;

Param1:可以是'Threshold'或'NHoodSize'

'Threshold'-指定峰值的域值,默认是0.5*max(H(:))

'NHoodSize'-是个二维向量[m,n],检测到一个峰值后,将峰值周围[m,n]内元素置零。

 

画直线段

lines = houghlines(BW,theta, rho, peaks)

lines = houghlines(...,param1, val1, param2, val2)

 

BW:二值图

Theta、rho、peaks:分别来自函数hough和houghpeaks

Lines:结构数组,大小等于检测到的直线段数,每个单元包含

Point1、point2:线段的端点

Theta、rho:线段的theta和rho


close all;  
clear;  
I  = imread('line2.tif');  
I = rgb2gray(I);
figure;  
subplot(2,2,1);  
imshow(I); title('original image');


BW = edge(I,'canny');%Canny方法提取图像边界,返回二值图像  
subplot(2,2,2); imshow(BW);title('Canny Edge');

[H,T,R] = hough(BW);%计算二值图像的标准霍夫变换,H为霍夫变换矩阵,T,R为计算霍夫变换的角度和半径值  
%[H,T,R] = hough(BW,'Theta',-20:0.5:75);
subplot(2,2,3); 
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');%hough变换的图像  
xlabel('theta'), ylabel('rho');  title('Hough');
axis on,axis square,hold on;  


P  = houghpeaks(H,3);%提取2个极值点  
x = T( P(:,2) );   
y = R( P(:,1) );  
plot(x,y,'s','color','white');%标出极值点 

lines=houghlines(BW,T,R,P);%提取线段  
subplot(2,2,4);  imshow(I), hold on;  title('Draw Lines');
for k = 1:length(lines)  
   xy = [lines(k).point1; lines(k).point2];  %2 74;2 430
   plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');%画出线段  
   plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');%起点  
   plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');%终点  
end  

测试结果:

(转+改)Hough变换--直线检测_第2张图片

(转+改)Hough变换--直线检测_第3张图片

第一幅图中得到的边缘有个断裂的地方,不清楚是不是由于原图的原因,,,

这里简单了解了霍夫直线检测的原理,后面继续学习圆检测以及多边形检测。


参考:http://www.cnblogs.com/Ponys/p/3146753.html

           

你可能感兴趣的:(Matlab,MATLAB,直线检测)