当前位置:文档之家› 图像处理作业-hough变换的边缘提取

图像处理作业-hough变换的边缘提取

图像处理期末作业
姓名:***
学号:**********
院系:信自院通信系
专业:信号与信息处理
用Hough变换提取边界直线
Hough变换是1962年由Paul Hough提出来的。

它所实现的是一种从图像空间到参数空间的映射关系。

它具有一系列的优点。

例如,由于根据局部度量来计算全面描述参数,因而对于区域边界被噪声干扰或者其他目标遮盖而引起边界发生瞬间间断的情况,它具有很好的容错性和鲁棒性。

原理
Hough变换是图像处理中从图像中识别几何形状的基本方法之一。

Hough 变换是一种利用表决原理的参数估计技术。

其基本原理在于利用图像空间和Hough参数空间的点与线的对偶性,把图像空间中的检测问题转换到参数空间。

通过在参数空间里进行简单的累加统计,然后在Hough参数空间寻找累加器峰值的方法检测直线。

Hough变换的实质是将图像空间内具有一定关系的像元进行聚类,寻找能把这些像元用某一解析形势联系起来的参数空间累计对应点。

在参数空间不超过二维的情况下,这种变换效果理想。

将原始图像空间的给定的曲线表达形式变为参数空间的一个点,这样就把原始图像中给定曲线的检测问题转化为寻找参数空间的峰值问题,也即是把检测整体特性转化为检测局部特性。

比如直线、椭圆、圆、弧线等。

简而言之,Hough 变换思想是:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。

这样在原始坐标系下的各个点的投影到参数坐标系下之后,看参数坐标系下没有聚集点,这样的聚集点就对应了原始坐标系下的直线。

如果参数空间中使用直线方程,当图像空间直线斜率为无穷大时,会使累加器尺寸和变很大,从而是计算复杂程度过大,为解决这一问题,采用极坐标方程,变换方程如图1所示。

θ
ρsin
θ
=
cos y
x+
根据这个方程,原图像空间中的点对应新参数空间中的一条正弦曲线,即点-正弦曲线对偶。

检测直线的具体过程就是让θ取遍可能的值,然后计算ρ的值,
再根据θ和ρ的值对累加数组累加,从而得到共线点的个数。

下面介绍一下关于θ和ρ取值范围的确定。

设被检测的直线在第一象限,右上角坐标为),(n m ,则第一象限中直线的位置情况如图1所示
图1 检测位置图
由图可见,当直线从与x 轴重合处逆时针旋转时,θ的值开始由︒0增大,直到︒180,所以θ的取值范围为︒︒-1800。

由直线极坐标方程可知)sin(22φθρ++=y x ,其中)(sin 221y x x +=-φ,所以当且仅当x 和y 都达到最大且︒±=+90φθ时(根据φ来调整θ的值),22max n m +==ρρ,即ρ的取值范围是),(2222n m n m ++-。

由θ和ρ的取值范围和它们的分辨率可以确定累加器的大小,从而检测直线。

利用Hough 变换,不仅可以检测直线,也可以检测曲线,实际上,只要是能够写得出方程的图像,都可以用Hough 变换检测,以圆周的检测为例,圆的一般方程是:
222)()(r b y a x =-+-
式中有三个参数a ,b 和r ,所以需要在参数空间建立一个三维累加数组A 。

其元素可以写为),,(r b a A 。

让a 和b 依次变化而根据圆的一般方程计算r ,并对
a
)
b
A累加,可见这个过程与检测直线上的点相同,只是空间多了一维,复杂,
,
(r
性也随之增加。

Hough变换的实现流程
利用Hough变换检测图像中直线的一般步骤应该首先对图像二值化,然后进行边缘检测,接着对边缘检测的结果做Hough变换,最后得到直线检测的结果。

具体流程如下:Array
图2 Hough变换流程图
图3 图像的Hough变换提取边缘直线(同一副图像不同阈值对比)
Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连接平滑边缘的一种方法,它将源于图像上的点映射到用于累加的参数空间,实现对已知解析式曲线的识别。

这里先对边缘图像进行二值化处理,然后用Hough变换提取直线,最后用红色标记出来。

因为处理过程中需要使用灰度图像,但最后无法给灰度图像赋颜色,所以最初输入要求为彩色图像。

由实验结果可知,Hough可提取图像的边缘曲线。

在这里需要说明的有三点:1,二值化图像的细节多少可以通过对二值化的阈值调节来控制,阈值越大,细节越少。

2,最后提取直线的阈值越小,可被赋红色的直线越多,但更多无关的细节也可能被提取出来,阈值越大,可被赋红色的直线越少,同时无关细节也减少。

3,通过对着两个参数的适当调节可使提取直线的效果更好。

附录
程序代码:
clc
clear
f=imread('house.jpg');%读入彩色图像,注意不能使用灰度图像
o=f; %保留彩色原图
f=rgb2gray(f);%将彩色图像转换为灰度图像,
f=im2double(f);
figure();
subplot(231);imshow(o);title('原图');
[m,n]=size(f);%得到图像矩阵行数m,列数n
for i=3:m-2
for j=3:n-2%处理领域较大,所以从图像(3,3)开始,在(m-2,n-2)结束
l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)-f(i,j+2)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j);%LoG算子
end
end
subplot(232);
imshow(l);
title('LoG算子提取图像边缘');
%均值化滤波处理
[m,n]=size(l);
for i=2:m-1
for j=2:n-1
y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l(i+1,j-1)+l(i+1,j)+l(i+1, j+1);
y(i,j)=y(i,j)/9; %LoG算子提取边缘后,对结果进行均值滤波以去除噪
声,为下一步hough变换提取直线作准备
end
end
subplot(233);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(234);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)相应的累加器单元加1
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) >35) %将提取直线的阈值设为35
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
subplot(235)
imshow(o);title('hough变换提取边界直线');。

相关主题