Matlab实现Hough直线检测
Hough变换是实现数字图像处理中几何形状识别的基本方法,基本原理是XY轴的直线到极坐标的变换。将直线转换为极坐标的点。原理未动,代码先行:
rgb2gray函数功能:将真彩色图像转换为灰度图像。
im2double 把图像数据类型转换为双精度浮点类型。如果输入图像是双精度浮点类型(double)的,返回的图像和源图像相同。如果源图像不是双精度浮点类型的,该函数将返回和源图像相同但数据类型为double类型的图像。
LoG边缘检测算子首先对图像做高斯滤波,然后再求其拉普拉斯(Laplacian)二阶导数。本文高斯滤波的模板为:
f=imread('guangshan_1.jpg');o=f;
f=rgb2gray(f);f=im2double(f);
figure();subplot(2,2,1);imshow(o);title('原图');
[m,n]=size(f);
for i=3:m-2
for j=3:n-2
I(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)-f(i,j+2)...
-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j); %log算子
end
end
subplot(2,2,2);imshow(I);title('LOG算子提取图像边缘');
%均值滤波
[m,n]=size(I);
for i=2:m-1
for j=2:n-1
y(i,j)=I(i-1,j-1)+I(i-1,j)+I(i-1,j+1)+I(i,j-1)+I(i,j)+I(i,j+1)+I(i+1,j-1)+I(i+1,j)+I(i+1,j+1);
y(i,j)=y(i,j)/9;
%LoG算子提取边缘后,对结果进行均值滤波以去除噪声,为下一步hough变换提取直线作准备
end
end
subplot(2,2,3);imshow(y);title('均值滤波器处理后');
%二值化
q=im2uint8(y); %把图像数据类型转换为无符号八位整型
[m,n]=size(q);
for i=1:m
for j=1:n
if q(i,j)>80;%设置二值化的阈值为80
q(i,j)=255;%对图像进行二值化处理,使图像边缘更加突出清晰
else
q(i,j)=0;
end
end
end
subplot(2,2,4);imshow(q);title('二值化处理后');
%Hough变换检测直线,使用(theta,p)参数空间,theta∈[0,180],p∈[0,2dis]
theta=180; %角度的值为0到180度
dis=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值 round为四舍五入
s=zeros(theta,2*dis); %存储每个(theta,p)个数
z=cell(theta,2*dis);
for i=1:m
for j=1:n %遍历图像的所有点
if (q(i,j)==255) %只检测边缘的白点
for k=1:theta
p=round(i*cos(pi*k/180)+j*sin(pi*k/180));
%对每个点从1到180度遍历
if(p>0)
s(k,dis+p)=s(k,dis+p)+1; %累加
z{k,dis+p}=[z{k,dis+p},[i,j]'];
else
ap=abs(p)+1;
s(k,ap)=s(k,ap)+1; %累加
z{k,ap}=[z{k,ap},[i,j]'];
end
end
end
end
end
%显示效果
for i=1:theta
for j=1:dis*2
if(s(i,j)>70)
lp=z{i,j};
for k=1:s(i,j)
o(lp(1,k),lp(2,k),1)=255;
o(lp(1,k),lp(2,k),2)=0;
o(lp(1,k),lp(2,k),3)=0;
end
end
end
end
figure,imshow(o),title('Hough');