1、 实 验 报 告 实验名称 实验三 图像边缘检测 课程名称 数字图像处理 姓名 成绩 班级 学号 日期 地点 备注: 1、 实验目得 (1)了解并掌握使用微分算子进行图像边缘检测得基本原理; (2)编写程序使用 Laplacian 算子(二阶导数算子)实现图像锐化,进一步理解图像 锐化得实质; (3)掌握使用不同梯度算子(一阶导数算子)进行图像边缘检测得原理、方法,根据 实验结果分析各种算子得工作效果; (4) 总结实验过程(实验报告,左侧装订):方案、编程、调试、结果、分析、结论。 2、 实验环境 (1)Wi
2、ndows XP/7 (2)Matlab 7、1/7、14 3、实验方法 本次实验要求对256×256大小,256级灰度得数字图像lena、img进行处理。 (1)对该图像进行锐化处理,要求采用Laplacian算子进行锐化,分a=1与a=2两种情况, 按如下不同情况进行处理: ① g1(m,n)=f(m,n)-aÑf ② g2(m,n)=4af (m,n)-a[f(m-1,n)+f (m+1,n)+f (m,n-1)+f(m,n+1)] I、要对图像进行处理,要先读取该图像,实验代码如下: close all; clear all; fid=fopen(’len
3、a、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
4、+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(
5、i,j-1)); end end (2)分别利用 Roberts、Prewitt 与 Sobel 边缘检测算子,对原图像进行边缘检测,显 示处理前、后图像。 I 、同(1)中I,不再赘述。 II、对图像进行边缘检测,要对图像得每一像素(不考虑图像得边界部分)得灰度进行遍历,分别用公式对图像得水平与垂直方向得边缘进行检测,并分别存储,在进行合成。采用不同得算子时,变换得公式有所不同。在合成时可以采用三种算法(街区法、棋盘法、欧式几何法),本次实验中均又采用,所以得到三层图像。代码如下(仅以街区法得Roberts算子为例): [x,y]=size(image); g1=im
6、age; 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对比可知,图像得锐化实
7、质就就是原图像与梯度信息进行叠加,相对于原图像而言,图像得边缘信息得到了加强。由图b中不同ɑ值所得图像对比可知,ɑ越大,边界越清晰,同时对比图a中不同ɑ值所得图像可知,ɑ得大小决定梯度信息与原图像叠加时所占得比例. (2) 、图像边缘检测 街区法、棋盘法、欧式距离法得不同检测算子结果分别入图c、图d与图e: 图c 图d 图e 由图c、图d与图e对比可知,采用街区法所得得边界清晰度最高,欧式几何法其次,棋盘法最差。对比同一张图中得不同子图可知,Sobel算子得性能更好,Prewitt算子其次,Roberts算子最差。 5、 实验结论 本次实验就是对图像进行锐化与边缘检
8、测,通过这次实验,我对数字图像处理中图像得锐化与边缘检测有了更加深刻得了解.加深了图像锐化与边缘检测得原理,掌握了图像边缘检测得不同方法。学会了使用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),
9、[]); 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(ima
10、ge); 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],’u
11、int8’); 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),[]);
12、 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(
13、'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);
14、 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)
15、-((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; g
16、h3=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)=a
17、bs(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(g
18、v3),[]); % 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
19、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)
20、/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(ui
21、nt8(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*ima
22、ge(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’); subpl
23、ot(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(
24、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
25、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(
26、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算子’);






