MATLAB的Hough变换及自编hough变换函数

任务一:Hough变换直线检测演示

在matlab中构建脚本m文件,执行下述语句,并对每句语句进行注释;熟悉hough、houghpeaks、houghlines函数的用法。

程序代码:

I=imread('chepai.jpg');

I=rgb2gray(I);

figure,imshow(I);

rotI=imrotate(I,14, 'crop');%旋转图像

BW=edge(rotI,'canny');%边缘检测图像

[H,T,R]=hough(BW);%H是函数返回的Hough变换矩阵 ,T和R分别是对应变换过来的极坐标(ρ,θ)中的θ和ρ

imshow(H,[],'XData',T,'YData',R,...

    'InitialMagnification','fit');%以极坐标的形式显示检测的直线

xlabel('\theta'),ylabel('\rho');

axis on,axis normal,hold on;

P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%选出hough变换中的五个极值点,筛选的阈值为最大值乘以0.3

x=T(P(:,2));y=R(P(:,1));

plot(x,y,'s','color','white');%将五个极值点标出来

lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);

%当两条线的距离小于5时,houghlines函数就会将这两条线合并成一条线,否则就保存。

figure,imshow(rotI),hold on

max_len=0;

%将检测到的直线和端点显示出来。

for k=1:length(lines)

    xy=[lines(k).point1;lines(k).point2];

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

    len=norm(lines(k).point1-lines(k).point2);

    if(len>max_len)

        max_len=len;

        xy_long=xy;

    end

end

%将最长的直线用蓝色表示。

plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');

运行结果:

MATLAB的Hough变换及自编hough变换函数_第1张图片  MATLAB的Hough变换及自编hough变换函数_第2张图片

MATLAB的Hough变换及自编hough变换函数_第3张图片  MATLAB的Hough变换及自编hough变换函数_第4张图片

任务二:自编hough变换函数

自编matlab函数文件执行Hough变换,实现上述hough(houghpeaks、houghlines)函数的与houghpeaks及houghlines的性能做对比分析。

程序代码:                

function [H,T,R] = my_hough(BW)

[m,n]=size(BW);

BW=imrotate(BW,14, 'crop');%旋转图像

theta_max=90;

rho_max=floor(sqrt(m^2+n^2))-1;

T=-theta_max:theta_max-1;

R=-rho_max:rho_max;

H=zeros(length(R),length(T));

for i=1:1:m

    for j=1:1:n

        if BW(i,j)>0

            x=j-1;

            y=i-1;%转换坐标系

            for theta=T

                rho=round((x*cosd(theta))+(y*sind(theta)));

                rho_index=rho+rho_max+1;

                theta_index=theta+theta_max+1;

                H(rho_index,theta_index)=H(rho_index,theta_index)+1;

            end

        end

    end

end

imshow(H,[],'XData',T,'YData',R,...

    'InitialMagnification','fit');%以极坐标的形式显示检测的直线

xlabel('\theta'),ylabel('\rho');

axis on,axis normal,hold on;

P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%选出hough变换中的五个极值点,筛选的阈值为最大值乘以0.3

x=T(P(:,2));y=R(P(:,1));

plot(x,y,'s','color','white');%将五个极值点标出来

lines=houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);

%当两条线的距离小于5时,houghlines函数就会将这两条线合并成一条线,否则就保存。

end

运行结果:

MATLAB的Hough变换及自编hough变换函数_第5张图片  MATLAB的Hough变换及自编hough变换函数_第6张图片

并与houghpeaks做对比分析。

你可能感兴趣的:(MATLAB,图像处理,matlab,开发语言)