Matlab实现Hough直线检测

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');



你可能感兴趣的:(数字图像处理)