一.实验题目
边缘检测:分别用Roberts、 Prewitt 和 Sobel算子对下图进行边缘检测,并比较三种检测结果的异同。
二.实验分析
边缘检测的检测器主要有Sobel,Prewitt,Roberts,Canny等,边缘检测的
基本意图是使用下两个基本准则之一在图像中找到亮度快速变化的地方:
①找到亮度的一阶导数在幅度上比指定的阈值大的地方
②找到亮度的二阶导数有零交叉的地方。
由于求导比较的麻烦,因此,一般用掩膜来数字化地近似一阶导数Gx和Gy。
本实验完成方法很多,可以通过以下途径解决:①直接用edge函数
②用imfilter 模拟③直接进行模拟 。值得注意的是由于Roberts掩膜是2*2的,
一般选取3*3模板的右下角四个元素进行处理。
三.实验程序
% 代码一 直接通过edge函数检测
clear;clc;figure;
I=imread('images_chapter_10\Fig10.10(a).jpg');
subplot(2,2,1);imshow(I);title('orignal');
I1=edge(I,'sobel');
subplot(2,2,2);imshow(I1);title('sobel');
I2=edge(I,'prewitt');
subplot(2,2,3);imshow(I2);title('prewitt');
I3=edge(I,'roberts');
subplot(2,2,4);imshow(I3);title('roberts');
% 代码二 直接模拟
clear;clc;figure;
I=imread('images_chapter_10\Fig10.10(a).jpg');
subplot(2,2,1);imshow(I);title('orignal');
s1=[-1 -2 -1; 0 0 0; 1 2 1];
s2=[-1 0 1; -2 0 2; -1 0 1 ];
p1=[-1 -1 -1; 0 0 0 ;1 1 1];
p2=[-1 0 1;-1 0 1; -1 0 1 ];
r1=[-1 0 ;0 1];r2=[0 -1; 1 0];
[r,c]=size(I);I=double(I);
for u=1:r-2
for v=1:c-2
gx=sum(sum(I(u:u+2,v:v+2).*s1));
gy=sum(sum(I(u:u+2,v:v+2).*s2));
Is(u,v)=sqrt(gx*gx+gy*gy);
gx=sum(sum(I(u:u+2,v:v+2).*p1));
gy=sum(sum(I(u:u+2,v:v+2).*p2));
Ip(u,v)=sqrt(gx*gx+gy*gy);
gx=sum(sum(I(u+1:u+2,v+1:v+2).*r1));
gy=sum(sum(I(u+1:u+2,v+1:v+2).*r2));
Ir(u,v)=sqrt(gx*gx+gy*gy);
end
end
Is1=Is;Ip1=Ip;Ir1=Ir;
scale=0.4;
Is2=Is1>max(max(Is1))*scale;
Ip2=Ip1>max(max(Ip1))*scale;
Ir2=Ir1>max(max(Ir1))*scale;
subplot(2,2,2);imshow(Is2,[]);title('sobel');
subplot(2,2,3);imshow(Ip2,[]);title('prewitt');
subplot(2,2,4);imshow(Ir2,[]);title('roberts');
程序说明:将程序二的scale赋值为0.2,效果与程序一相同
四.实验结果