0
点赞
收藏
分享

微信扫一扫

【图像检测】基于霍夫变换实现直线识别(拟合角平分线)附matlab代码

1 简介

直线检测是数字图像处理的重要内容,在道路识别,建筑物识别,医学图像分析等领域都有十分重要的应用。通过对已经获得的图像进行边缘检测,然后用Hough变换对边缘检测进行直线检测。该方法简单,受直线中的间隙和噪声影响较小。在Matlab环境下对该方法进行了仿真实验,并对图像中直线目标进行了检测,结果表明用该方法对图像中直线目标进行检测是快速有效的。

2 部分代码

function chengxu()

%第1步

close all

I=imread('1.jpg');  %读取图像

I=rgb2gray(I);    %彩色图像转换成灰度图


% I=im2bw(I);      %二值化

I=edge(double(I)); %检测图像的边缘

figure

imshow(I)          %显示边缘检测的结果


%第2步


[m,n]=size(I);     %计算图像的尺寸


M=3;             %定义X方向分割的块数

N=3;             %定义Y方向分割的块数

mm=floor(m/M);   %子块行的长度

nn=floor(n/N);   %子块列的长度

count=1;         %计数器

figure

for i=1:M

    for j=1:N

        A=I((i-1)*mm+1:i*mm,(j-1)*nn+1:j*nn);    %分割原图像,得到一个子块

        subplot(M,N,count)

        imshow(A)               %显示一个子块

        zuoshangjiao=[(i-1)*mm+1 (j-1)*nn+1];  %子块左上角的坐标

        [x,y,k,b]=zikuai(A,zuoshangjiao);      %得到子块里白色像素点拟合得到的直线的斜率k和截距b(调用zikuai函数)

        X{count}=x;       %保存子块里所有白色像素的x坐标

        Y{count}=y;       %保存子块里所有白色像素的y坐标

        K(count)=k;       %保存子块里拟合得到的直线的斜率k

        B(count)=b;       %保存子块里拟合得到的直线的截距b

        count=count+1;    %计数器加1,进行下一个子块的计算

    end

end


%第3步

KK=K(~isnan(K));   %去掉K中的NaN(白色像素点少于10的子块)

BB=B(~isnan(B));   %去掉B中的NaN(白色像素点少于10的子块)


mean_K=mean(KK);   %求所有斜率的平均值

mean_B=mean(BB);   %求所有截距的平均值


figure

subplot(2,1,1)

plot(KK,'-o')

title('各子块拟合得到的直线k值')

subplot(2,1,2)

plot(BB,'-o')

title('各子块拟合得到的直线b值')



%绘制角平分线

xx0=[1 m];

yy0=[1 n];


YY1=K01*xx0+B01;  %角平分线1

YY2=K02*xx0+B02;  %角平分线2

plot(xx0,YY1);    %绘制角平分线1

plot(xx0,YY2);    %绘制角平分线2


view([90 90])

end



3 仿真结果

【图像检测】基于霍夫变换实现直线识别(拟合角平分线)附matlab代码_拟合

【图像检测】基于霍夫变换实现直线识别(拟合角平分线)附matlab代码_直线检测_02

【图像检测】基于霍夫变换实现直线识别(拟合角平分线)附matlab代码_直线检测_03

4 参考文献

[1]唐佳林, 王镇波, 张鑫鑫. 基于霍夫变换的直线检测技术[J]. 科技信息, 2011(14):2.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

【图像检测】基于霍夫变换实现直线识别(拟合角平分线)附matlab代码_直线检测_04




举报

相关推荐

0 条评论