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

运行结果:

 

 

任务二:自编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

运行结果:

 

并与houghpeaks做对比分析。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值