数字图像边缘处理实验报告.docx
《数字图像边缘处理实验报告.docx》由会员分享,可在线阅读,更多相关《数字图像边缘处理实验报告.docx(9页珍藏版)》请在冰豆网上搜索。
数字图像边缘处理实验报告
数字图像处理实验报告
——图像分割实验
专业班级:
生医0901班
姓名:
李建鲁
学号:
0405090407
指导老师:
俞罡
2012年6月22日
一、实验目标
掌握图像分割的主流算法。
二、实验内容
1)实现边缘检测算法
2)实现Hough变换检测直线的算法
三、实验步骤
1)读入图像。
(设图像中有直线)
2)检测图像的边缘
3)实现Hough变换,检测出图像中的直线的方程
4)输出结果
四、实验代码和结果
Log算子:
f=imread('PH02412K.JPG');
f=im2double(f);
[m,n]=size(f);%自动确定图像大小,返回行数m和列数n
h=zeros(m,n);
fori=3:
m-2
forj=3:
n-2%图像原点在(1,1)处,所以模版从(3,3)处开始计算
g(i,j)=16*f(i,j)-f(i,j+2)-f(i-1,j+1)-2*f(i,j+1)-f(i+1,j+1)-f(i-2,j)-2*f(i-1,j)-2*f(i+1,j)-f(i+2,j)-f(i-1,j-1)-2*f(i,j-1)+f(i+1,j-1)-f(i,j-2);
%log算子
end
end
subplot(2,2,1);imshow(f);title('原始图像');
subplot(2,2,2);imshow(g);title('Log算子处理后图像');
s=f+g;
subplot(2,2,3);imshow(s);title('Log算子原始图像和处理后图像叠加');
实验截图:
Roberts算子:
f=imread('PH02412K.JPG');
f=im2double(f);
[m,n]=size(f);
h=zeros(m,n);
fori=2:
m-1
forj=2:
n-1
h(i,j)=abs(f(i+1,j-1)-f(i,j));
g(i,j)=abs(f(i,j-1)-f(i+1,j));
end
end
subplot(2,2,1);imshow(f);title('原始图像');
subplot(2,2,2);imshow(h);title('Roberts算子|G(x)|方向边缘');
subplot(2,2,3);imshow(g);title('Roberts算子|G(y)|方向边缘');
s=h+g;
subplot(2,2,4);imshow(s);title('Roberts算子|G(x)|+|G(y)|方向边缘');
实验截图:
Prewitt算子
f=imread('PH02412K.JPG');
f=im2double(f);
[m,n]=size(f);
h=zeros(m,n);
fori=2:
m-1
forj=2:
n-1
h(i,j)=abs(f(i-1,j-1)+f(i,j-1)+f(i+1,j-1)-f(i-1,j+1)-f(i,j+1)-f(i+1,j+1));
g(i,j)=abs(f(i+1,j+1)+f(i+1,j)+f(i+1,j-1)-f(i-1,j+1)-f(i-1,j)-f(i-1,j-1));
end
end
subplot(2,2,1);imshow(f);title('原始图像');
subplot(2,2,2);imshow(h);title('|G(x)|方向边缘');
subplot(2,2,3);imshow(g);title('|G(y)|方向边缘');
%s=h+g;
%subplot(2,2,4);imshow(s);title('|G(y)|方向边缘');
实验截图:
hough变换:
I=imread('PH01213K.JPG');f=rgb2gray(I);
f1=im2bw(f,200/255);
BW1=double(f1);
BW=edge(BW1,'sobel',0.4);
r_max=50;
r_min=10;step_r=10;step_angle=pi/12;p=0.7;
[m,n]=size(BW);
size_r=round((r_max-r_min)/step_r)+1;
size_angle=round(2*pi/step_angle);
hough_space=zeros(m,n,size_r);
[rows,cols]=find(BW);
ecount=size(rows);
fori=1:
ecount
forr=1:
size_r
fork=1:
size_angle
a=round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));
b=round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));
if(a>0&&a<=m&&b>0&&b<=n)
hough_space(a,b,r)=hough_space(a,b,r)+1;
end
end
end
end
max_para=max(max(max(hough_space)));
index=find(hough_space>=max_para*p);
length=size(index);
hough_circle=false(m,n);
fori=1:
ecount
fork=1:
length
par3=floor(index(k)/(m*n))+1;
par2=floor((index(k)-(par3-1)*(m*n))/m)+1;
par1=index(k)-(par3-1)*(m*n)-(par2-1)*m;
if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&&...
(rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5)
hough_circle(rows(i),cols(i))=true;
end
end
end
fork=1:
length
par3=floor(index(k)/(m*n))+1;
par2=floor((index(k)-(par3-1)*(m*n))/m)+1;
par1=index(k)-(par3-1)*(m*n)-(par2-1)*m;
par3=r_min+(par3-1)*step_r;
fprintf(1,'Center%d%dradius%d\n',par1,par2,par3);
para(:
k)=[par1,par2,par3];
end
subplot(2,3,1),imshow(I);title('原始图像');
subplot(2,3,2),imshow(f);title('灰度图像');
subplot(2,3,3),imshow(f1);title('二值图像');
subplot(2,3,4),imshow(BW);title('边缘检测');
subplot(2,3,5),imshow(hough_circle);title('Hough检测');
实验截图:
实验总结:
图像处理的第一步就是对所采集的图像进行读入,本次研究采集的图是24位真彩色的JPG格式的图像。
真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无符号整型存储,亮度值范围[0,255]。
在实验中我们开始因为遇到了sobel算子无法识别二值图像的问题,后来用了double解决问题。
MATLAB中图形图像文件的读取利用函数imread()完成。
Hough变换本来用于直线检测中,充分体现了Hough变换具有明了的几何解析性、一定的抗干扰能力以及易于实现并行处理等优点。
人们在对图像进行几何特征检测时,感兴趣的往往有直线,圆,椭圆等等。
自然而然地想到应用Hough变换。
这里不再赘述hough变换检测直线。
Hough变换是基于通过提取分布于目标圆周上的参数及点的特征值的来检测圆或圆弧的。
为了检测目标外形,对图像上的每点定义一个参数空间的映射。
Hough变换通过在参数空间找寻特征(峰值或最大值点)得到位于图像空间中的特征(目标形状)来转换问题。
对于已知半径的圆Hough变换可以检测任意已知表达形式的曲线,关键在于选择合适的参数空间。
我们可以根据曲线的表达形式决定其参数空间。
当检测某一已知半径的圆时,可以使用与原图像空间相同的空间作为其参数空间。
则原图像空间中的一个圆对应参数空间中的一个点,参数空间的一个点对应图像空间中一个圆,原图像空间中在同一圆上的点,它们的参数相同即a,b相同,它们在参数空间对应的圆就会过同一点(a,b),因此,将原图像中的所有点变换到参数空间之后,依据参数空间中点的聚集度就可判断出原图像空间中有无近似于圆的图形。
对于未知半径的圆,在一个xy平面图像中确定一个圆至少需要三个元素,即圆心的x轴和y轴坐标,圆的半径,因此Hough变换检测圆的目的就是检测出图像中各个圆的圆心坐标以及圆的半径。
其基本思想是将原图像空间中边缘点映射至参数空间中,再将参数空间中得到的全部坐标点元素所对应的累加值进行统计,并根据此累加值来判断圆的大小和圆心的位置。
例如,在xy平面上的方程为(x-a)2+(y-b)2=r2其中点(a,b)为圆心坐标,r为圆半径,点(x,y)为圆周上的一点,将其转换为参数坐标系(a,b,r),方程为(a-x)2+(b-y)2=r2,可看出次方程为圆锥面,对于原图像中任意确定的一个点在参数空间都有一个三维锥面与其对应。
在Hough变换检测圆时,可以利用梯度信息在很大程度上加快圆检测的速度。
对圆周而言,其梯度方向只有背离圆心或者指向圆心,当梯度指向圆心,圆心就在梯度的延长线上,而当梯度背离圆心,圆心则在梯度的反向延长线上。
所以,边缘梯度信息的加入可以预估圆心的位置,这样可以使算法的运算量明显减少,并且可以有效抑制虚假局部最大值。
圆心位置可以用极坐标方程形式表达:
a=x-r·cos(θ(x,y)),a=y-r·sin(θ(x,y))或者a=x+r·cos(θ(x,y)),a=y+r·sin(θ(x,y)),边缘像素(x,y)处的梯度方向为θ(x,y)。
前一组公式是梯度方向背离圆心,后一组为梯度方向指向圆心。
以前一种情况为例,边缘图像中每个边缘像素点(x,y)都可以算出其相应的梯度方向θ(x,y)。
通过前一个公式可算出圆心坐标(a0,b0),对于参数空间可能的半径r0,其相应的参数空间累加器单元加一,最后找到累加器的局部最大值,就得到一个圆。
本次设计涉及的知识较为广泛,设计中采用的图像预处理也比较简单,对最后的检测成果存在一定程度上的影响,从结果图像与圆图像的对比可以看出原图像中有些较暗的地方没有检测出来。
识别的精确度较低。
设计程序循环计算较多,导致识别时间的延长,同时也耗费了大量的存储空间,这一点对实际应用存在较大的影响,需要较多改进。