hough变换提取直线(Matlab实现)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Hough变换提取直线之袁州冬雪创作
一、实验方针
实现用Hough变换检测直线的算法
二、实验内容
1、读入图像
选取有较多直线及部分曲线以作对比的图像作为实验素材,这里我们必须使用黑色图像(有些看似灰度图像的实际属性也是黑色图像),原因下面有详解.
2、检测图像边沿
如果一个像素落在图像中某一个物体的鸿沟上,那末它的邻域将成为一个灰度级变更的带.对这种变更最有用的两个特征是灰度的变更率和方向,他们分别用梯度向量的幅度和方向来暗示.
边沿检测算子检查每一个像素的邻域并对灰度变更率停止量化,通常也包含方向的确定.有若干种算子可使用,大多数是基于方向导数掩模求卷积的方法.
如Roberts算子,Sobel算子,Prewitt算子,Log算子等.这里采取Log算子提取图像边沿,再用均值滤波去除边沿图像噪声.
3、实现Houg变换,检测出图像中的直线
Hough变换是一种操纵图像的全局特征将特定形状的边沿毗连起来,形成持续平滑边沿的一种方法.它通过将源图像
上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别.
这里先对边沿图像停止二值化处理,然后再用hough变换提取直线,最后用红色标识表记标帜之.因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果欠好),只能给黑色图像赋颜色,故最初输入时请使用黑色图像.
4、Matlab代码如下:
f=imread('3.png');%读入黑色图像,注意不克不及使用灰度图像
o=f; %保存黑色原图
f=rgb2gray(f);%将黑色图像转换为灰度图像,
f=im2double(f);
figure();
subplot(2,2,1);imshow(o);title('原图');
[m,n]=size(f);%得到图像矩阵行数m,列数n
for i=3:m2
for j=3:n2%处理范畴较大,所以从图像(3,3)开端,在(m2,n2)竣事
l(i,j)=f(i2,j)f(i1,j1)2*f(i1,j)f(i1,j+1
)f(i,j2)2*f(i,j1)+16*f(i,j)2*f(i,j+1)f(
i,j+2)f(i+1,j1)2*f(i+1,j)f(i+1,j+1)f(i+
2,j);%LoG算子
end
end
subplot(2,2,2);imshow(l);title('LoG算子提取图像边沿');
[m,n]=size(l);
for i=2:m1
forj=2:n1
y(i,j)=l(i1,j1)+l(i1,j)+l(i1,j+1)+l(i,j1)+l(i,j )+l(i,j+1)+l(i+1,j1)+l(i+1,j)+l(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变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]
a=180; %角度的值为0到180度
d=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值s=zeros(a,2*d); %存储每一个(a,p)个数
z=cell(a,2*d); %用元胞存储每一个被检测的点的坐标
for i=1:m
for j=1:n%遍历图像每一个点
if(q(i,j)==255)%只检测图像边沿的白点,其余点不检测
for k=1:a
p =
round(i*cos(pi*k/180)+j*sin(pi*k/180
));%对每一个点从1到180度遍历一遍,
取得颠末该点的所有直线的p值(取整)
if(p > 0)%若p大于0,则将点存储在(d,2d)空间
s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加一
z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标
else
ap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间
s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一
z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标
end
end
end
end
end
for i=1:a
for j=1:d*2 %检查每一个累加器单元中存储数量
if(s(i,j) >70) %将提取直线的阈值设为70
lp=z{i,j};%提取对应点坐标
for k=1:s(i,j)%对知足阈值条件的累加器单
元中(a,p)对应的所有点停
止操纵
o(lp(1,k),lp(2,k),1)=255; %每一个点R
分量
=255,G分
量=0,B分
量=0
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变换提取直线');
5、实验成果
附:两个参数的调节
1.二值化图像的细节多少可以通过对二值化的阈值调节来
节制,阈值越大,细节越少.
2.最后提取直线的阈值越小,可被赋红色的直线的越多,但更多的无关细节也能够被赋红色;阈值越大,可被赋红色的直线的越少,同时无关细节也会减少.
通过对这个两个参数的适当调节可使提取直线的效果更好.。

相关文档
最新文档