您的当前位置:首页数字图像处理实验报告(图像边缘检测)

数字图像处理实验报告(图像边缘检测)

2021-07-11 来源:爱问旅游网


实 验 报 告

实验名称 课程名称

实验三 图像边缘检测 数字图像处理

姓名

成绩

班级

学号

日期

地点

备注:

1、实验目的

(1)了解并掌握使用微分算子进行图像边缘检测的基本原理;

(2)编写程序使用 Laplacian 算子(二阶导数算子)实现图像锐化,进一步理解图像 锐化的实质;

(3)掌握使用不同梯度算子(一阶导数算子)进行图像边缘检测的原理、方法,根据 实验结果分析各种算子的工作效果;

(4)总结实验过程(实验报告,左侧装订):方案、编程、调试、结果、分析、结论。

2、实验环境

(1)Windows XP/7 (2)Matlab 7.1/7.14

3、实验方法

本次实验要求对256×256大小,256级灰度的数字图像lena.img进行处理。

(1)对该图像进行锐化处理,要求采用Laplacian算子进行锐化,分1和2两种情况, 按如下不同情况进行处理:

① g1(m,n)f(m,n)f

② g2(m,n)4f (m,n)[f(m1,n)f (m1,n)f (m,n1)f(m,n1)]

I、要对图像进行处理,要先读取该图像,实验代码如下:

close all; clear all;

fid=fopen('lena.img','r');

image=fread(fid,[256,256],'uint8'); fclose(fid);

II、读取图像后,对该图像的每一像素(不考虑图像的边界部分)进行遍历,根据公式①(公式①相当于做差分)对每一灰度进行计算,将所得的结果存入一矩阵g1中(矩阵g1初始化为该图像的矩阵),代码如下(仅以ɑ=1为例):

g1=image; a=1;

[x,y]=size(image); for i=2:(x-1)

for j=2:(y-1) g1(i,j)=(1+4*a)*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1));

end end

III、根据公式②对图像的每一个像素(不考虑图像的边界部分)进行计算,将所得之

存入矩阵g2中(g2初始化值为该图像的矩阵值),具体方法与上一步类似,代码如下(仅以ɑ=1为例):

g2=image; a=1;

[x,y]=size(image); for i=2:(x-1) for j=2:(y-1)

g2(i,j)=4*a*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1)); end end

(2)分别利用 Roberts、Prewitt 和 Sobel 边缘检测算子,对原图像进行边缘检测,显 示处理前、后图像。

I 、同(1)中I,不再赘述。

II、对图像进行边缘检测,要对图像的每一像素(不考虑图像的边界部分)的灰度进行遍历,分别用公式对图像的水平和垂直方向的边缘进行检测,并分别存储,在进行合成。采用不同的算子时,变换的公式有所不同。在合成时可以采用三种算法(街区法、棋盘法、欧式几何法),本次实验中均又采用,所以得到三层图像。代码如下(仅以街区法的Roberts算子为例):

[x,y]=size(image); g1=image; gh1=image; gv1=image; for i=2:(x-1) for j=2:(y-1)

gh1(i,j)=image(i,j)-image(i-1,j-1); gv1(i,j)=image(i,j-1)-image(i-1,j); g1(i,j)=abs(gh1(i,j))+abs(gv1(i,j)); end end

4、实验结果分析

(1)、图像锐化

图像锐化结果如图a和图b(注:图a为情况①结果;图b为情况②结果):

图a

图b

由图a和图b对比可知,图像的锐化实质就是原图像与梯度信息进行叠加,相对于原图像而言,图像的边缘信息得到了加强。由图b中不同ɑ值所得图像对比可知,ɑ越大,边界越

清晰,同时对比图a中不同ɑ值所得图像可知,ɑ的大小决定梯度信息与原图像叠加时所占的比例。

(2)、图像边缘检测

街区法、棋盘法、欧式距离法的不同检测算子结果分别入图c、图d和图e:

图c

图d

图e

由图c、图d和图e对比可知,采用街区法所得的边界清晰度最高,欧式几何法其次,棋盘法最差。对比同一张图中的不同子图可知,Sobel算子的性能更好,Prewitt算子其次,

Roberts算子最差。

5、实验结论

本次实验是对图像进行锐化和边缘检测,通过这次实验,我对数字图像处理中图像的锐化和边缘检测有了更加深刻的了解。加深了图像锐化和边缘检测的原理,掌握了图像边缘检测的不同方法。学会了使用Laplacian算子(二阶导数算子)实现图像锐化的程序编写;掌握了使用不同梯度算子(一阶导数算子)进行图像边缘检测的原理、方法。

6、源代码

(1)图像锐化(g1)

close all; clear all;

fid=fopen('lena.img','r');

image=fread(fid,[256,256],'uint8'); fclose(fid); subplot(221);

imshow(uint8(image),[]); title('原图像');

%采用拉普拉斯算子 g1=image; a=1;

[x,y]=size(image); for i=2:(x-1) for j=2:(y-1)

g1(i,j)=(1+4*a)*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1));

end end

subplot(222);

imshow(uint8(g1),[]); title('a=1时g1的图像'); g1=image; a=2;

[x,y]=size(image); for i=2:(x-1) for j=2:(y-1)

g1(i,j)=(1+4*a)*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1));

end end

subplot(223);

imshow(uint8(g1),[]); title('a=2时g1的图像');

(2)图像锐化(g2)

close all; clear all;

fid=fopen('lena.img','r');

image=fread(fid,[256,256],'uint8'); fclose(fid); subplot(221);

imshow(uint8(image),[]); title('原图像');

%采用拉普拉斯算子 g2=image; a=1;

[x,y]=size(image); for i=2:(x-1) for j=2:(y-1)

g2(i,j)=4*a*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1));

end end

subplot(222);

imshow(uint8(g2),[]); title('a=1时g2的图像'); g2=image; a=2;

[x,y]=size(image); for i=2:(x-1) for j=2:(y-1)

g2(i,j)=4*a*image(i,j)-a*(image(i+1,j)+image(i-1,j)+image(i,j+1)+image(i,j-1));

end end

subplot(223);

imshow(uint8(g2),[]); title('a=2时g2的图像');

(3)边缘检测

close all; clear all;

fid=fopen('lena.img','r');

image=fread(fid,[256,256],'uint8'); fclose(fid);

figure('Name','街区法','NumberTitle','off'); subplot(221);

imshow(uint8(image),[]); title('原图像'); [x,y]=size(image); g1=image; gh1=image; gv1=image; for i=2:(x-1) for j=2:(y-1)

gh1(i,j)=image(i,j)-image(i-1,j-1); gv1(i,j)=image(i,j-1)-image(i-1,j); g1(i,j)=abs(gh1(i,j))+abs(gv1(i,j)); end end

subplot(222);

imshow(uint8(g1),[]); title('Roberts算子'); g2=image; gh2=image; gv2=image; for i=2:(x-1) for j=2:(y-1)

gh2(i,j)=((image(i+1,j-1)+image(i+1,j)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i-1,j)+image(i-1,j+1))/3);

gv2(i,j)=((image(i-1,j+1)+image(i,j+1)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i,j-1)+image(i+1,j-1))/3);

g2(i,j)=abs(gh2(i,j))+abs(gv2(i,j)); end end

subplot(223);

imshow(uint8(g2),[]); title('Prewitt算子'); g3=image; gh3=image; gv3=image; for i=2:(x-1) for j=2:(y-1)

gh3(i,j)=(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1))/4;

gv3(i,j)=(image(i-1,j+1)+2*image(i,j+1)+image(i+1,j+1)-image(i-1,j-1)-2*image(i,j-1)-image(i+1,j-1))/4;

g3(i,j)=abs(gh3(i,j))+abs(gv3(i,j)); % g3(i,j)=max(gh3(i,j),gv3(i,j));

% g3(i,j)=sqrt(gh3(i,j)*gh3(i,j)+gv3(i,j)*gv3(i,j)); end end

subplot(224);

imshow(uint8(g3),[]); title('Sobel算子'); % subplot(235)

% imshow(uint8(gh3),[]); % title('检测水平边界'); % subplot(236);

% imshow(uint8(gv3),[]); % title('检测竖直边界');

figure('Name','棋盘法','NumberTitle','off'); subplot(221);

imshow(uint8(image),[]); title('原图像'); [x,y]=size(image); g1=image; gh1=image; gv1=image; for i=2:(x-1) for j=2:(y-1)

gh1(i,j)=image(i,j)-image(i-1,j-1); gv1(i,j)=image(i,j-1)-image(i-1,j); % g1(i,j)=abs(gh1(i,j))+abs(gv1(i,j)); g1(i,j)=max(gh1(i,j),gv1(i,j)); end end

subplot(222);

imshow(uint8(g1),[]); title('Roberts算子'); g2=image; gh2=image; gv2=image; for i=2:(x-1) for j=2:(y-1)

gh2(i,j)=((image(i+1,j-1)+image(i+1,j)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i-1,j)+image(i-1,j+1))/3);

gv2(i,j)=((image(i-1,j+1)+image(i,j+1)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i,j-1)+image(i+1,j-1))/3);

% g2(i,j)=abs(gh2(i,j))+abs(gv2(i,j)); g2(i,j)=max(gh2(i,j),gv2(i,j)); end end

subplot(223);

imshow(uint8(g2),[]); title('Prewitt算子'); g3=image; gh3=image; gv3=image; for i=2:(x-1) for j=2:(y-1)

gh3(i,j)=(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1))/4;

gv3(i,j)=(image(i-1,j+1)+2*image(i,j+1)+image(i+1,j+1)-image(i-1,j-1)-2*image(i,j-1)-image(i+1,j-1))/4;

g3(i,j)=abs(gh3(i,j))+abs(gv3(i,j)); g3(i,j)=max(gh3(i,j),gv3(i,j));

% g3(i,j)=sqrt(gh3(i,j)*gh3(i,j)+gv3(i,j)*gv3(i,j)); end end

subplot(224);

imshow(uint8(g3),[]); title('Sobel算子');

figure('Name','欧式几何法','NumberTitle','off'); subplot(221);

imshow(uint8(image),[]); title('原图像'); [x,y]=size(image); g1=image; gh1=image; gv1=image; for i=2:(x-1) for j=2:(y-1)

gh1(i,j)=image(i,j)-image(i-1,j-1); gv1(i,j)=image(i,j-1)-image(i-1,j); % g1(i,j)=abs(gh1(i,j))+abs(gv1(i,j)); % g1(i,j)=max(gh1(i,j),gv1(i,j));

g1(i,j)=sqrt(gh1(i,j)*gh1(i,j)+gv1(i,j)*gv1(i,j)); end

end

subplot(222);

imshow(uint8(g1),[]); title('Roberts算子'); g2=image; gh2=image; gv2=image; for i=2:(x-1) for j=2:(y-1)

gh2(i,j)=((image(i+1,j-1)+image(i+1,j)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i-1,j)+image(i-1,j+1))/3);

gv2(i,j)=((image(i-1,j+1)+image(i,j+1)+image(i+1,j+1))/3)-((image(i-1,j-1)+image(i,j-1)+image(i+1,j-1))/3);

% g2(i,j)=abs(gh2(i,j))+abs(gv2(i,j)); % g2(i,j)=max(gh2(i,j),gv2(i,j));

g2(i,j)=sqrt(gh2(i,j)*gh2(i,j)+gv2(i,j)*gv2(i,j)); end end

subplot(223);

imshow(uint8(g2),[]); title('Prewitt算子'); g3=image; gh3=image; gv3=image; for i=2:(x-1) for j=2:(y-1)

gh3(i,j)=(image(i+1,j-1)+2*image(i+1,j)+image(i+1,j+1)-image(i-1,j-1)-2*image(i-1,j)-image(i-1,j+1))/4;

gv3(i,j)=(image(i-1,j+1)+2*image(i,j+1)+image(i+1,j+1)-image(i-1,j-1)-2*image(i,j-1)-image(i+1,j-1))/4;

% g3(i,j)=abs(gh3(i,j))+abs(gv3(i,j)); % g3(i,j)=max(gh3(i,j),gv3(i,j));

g3(i,j)=sqrt(gh3(i,j)*gh3(i,j)+gv3(i,j)*gv3(i,j)); end end

subplot(224);

imshow(uint8(g3),[]); title('Sobel算子');

因篇幅问题不能全部显示,请点此查看更多更全内容