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 仿真结果
4 参考文献
[1]唐佳林, 王镇波, 张鑫鑫. 基于霍夫变换的直线检测技术[J]. 科技信息, 2011(14):2.