一、实验目的
1.学会使用编程实现不同算法的边缘检测。
2.学会使用编程实现不同算法的图像分割。
3.能够根据实验结果分析各种算法的特点及其应用场合,培养处理实际图像的能力。
二、实验要求
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
三、实验内容(每一个内容编写一个*.m文件)
1.边缘检测:
(1)利用边缘检测函数edge ()对灰度图像(house.tif)进行边缘检测,检测算子分别选择'roberts'、'sobel'、'prewitt'、LOG、'Canny'(其他参数选择:default),比较不同检测算子对边缘检测的效果;
代码:
clc;
%利用边缘检测函数edge ()对灰度图像(house.tif)进行边缘检测,检测算子分别选择'roberts'、'sobel'、'prewitt'、LOG、'Canny'(其他参数选择:default),比较不同检测算子对边缘检测的效果;
h=imread("house.tif");%读入图像
hr=edge(h,"roberts");%参数为roberts
hs=edge(h,"sobel");%参数为sobel
hp=edge(h,"prewitt");%参数为prewitt
hl=edge(h,"log");%参数为log
hc=edge(h,"canny");%参数为canny
figure;
subplot(2,3,1),imshow(h);
title("原图")
subplot(2,3,2),imshow(hr);
title("参数为roberts")
subplot(2,3,3),imshow(hs);
title("参数为sobel")
subplot(2,3,4),imshow(hp);
title("参数为prewitt")
subplot(2,3,5),imshow(hl);
title("参数为log")
subplot(2,3,6),imshow(hc);
title("参数为canny")
结果:
(2)利用工具箱函数imfilter()和如图1所示四种不同方向的线检测模板w1/w2/w3/w4对图像(Fig0908(a).tif)进行边缘检测,比较不同方向的检测算子对边缘检测的效果;
-1 | -2 | -1 | -1 | 0 | 1 | 0 | 1 | 2 | -2 | -1 | 0 | |||
0 | 0 | 0 | -2 | 0 | 2 | -1 | 0 | 1 | -1 | 0 | 1 | |||
1 | 2 | 1 | -1 | 0 | 1 | -2 | -1 | 0 | 0 | 1 | 2 |
图1 w1(水平) w2(垂直) w3 (+45°) w4(-45°)
代码:
clear
%利用工具箱函数imfilter()和如图1所示四种不同方向的线检测模板w1/w2/w3/w4对图像(Fig0908(a).tif)进行边缘检测,比较不同方向的检测算子对边缘检测的效果
%读入图像(Fig0908(a).tif)
f=imread("Fig0908(a).tif");
w1=[-1 -2 -1;0 0 0;1 2 1]; %手动导入矩阵
w2=[-1 0 1;-2 0 2;-1 0 1];
w3=[0 1 2;-1 0 1;-2 -1 0];
w4=[-2 -1 0;-1 0 1;0 1 2];
fs=imfilter(f,w1);%w1(水平)
fc=imfilter(f,w2);%w2(垂直)
fz=imfilter(f,w3);%w3 (+45°)
ff=imfilter(f,w4);%w4(-45°)
figure;
subplot(2,3,1),imshow(f);
title("原图");
subplot(2,3,2),imshow(fs);
title("w1(水平)");
subplot(2,3,3),imshow(fc);
title("w2(垂直)");
subplot(2,3,4),imshow(fz);
title("w3 (+45°)");
subplot(2,3,5),imshow(ff);
title("w4(-45°)");
结果:
![]() |
2.对灰度图像(rice.tif)编程实现图像锐化增强(算子如图2所示):
(1)利用robert算子检测图像边缘,并采用门限法得到锐化增强图像(T=10,T=50);
代码:
clear
%利用robert算子检测图像边缘,并采用门限法得到锐化增强图像(T=10,T=50)
r=imread("rice.tif");
[ROW,COL]=size(r);
rd=double(r);
r10=r;
r50=r;
T1=10;
T2=50;
%定义robert算子
for i = 1:ROW-1
for j = 1:COL-1
Gx = ( rd(i+1,j+1) - r(i,j) ); %固定模板
Gy = ( rd(i,j+1) - r(i+1,j) );
if ( abs(Gx) + abs(Gy) ) >= T1 %门限法T=10;
r10(i, j) = abs(Gx) + abs(Gy); %差分
else
r10(i, j) = 0; %不符合设为0
end
if ( abs(Gx) + abs(Gy) ) >= T2 %门限法T=50;
r50(i, j) = abs(Gx) + abs(Gy);
else
r50(i, j) = 0;
end
end
end
m=(r-r10);%T=10
n=(r-r50);%T=50
figure;
subplot(1,3,1),imshow(r);
title("原图")
subplot(1,3,2),imshow(m);
title("T=10")
subplot(1,3,3),imshow(n);
title("T=50")
结果:
![]() |
(2)利用sobel算子检测图像边缘并得到锐化增强图像;
代码:
clear
%利用sobel算子检测图像边缘并得到锐化增强图像
r=imread("rice.tif");%导入图像
[ROW,COL]=size(r);
rd=double(r);
%定义sobel算子
sobel_x = [-1,0,1;-2,0,2;-1,0,1];
sobel_y = [-1,-2,-1;0,0,0;1,2,1];
for i = 1:ROW - 2
for j = 1:COL - 2
funBox = rd(i:i+2,j:j+2);
G_x = sobel_x .* funBox;
G_x = abs(sum(G_x(:)));
G_y = sobel_y .* funBox;
G_y = abs(sum(G_y(:)));
sobelxy = G_x * 0.5 + G_y * 0.5;
new_img(i+1,j+1) = sobelxy;
end
end
figure;
subplot(1,2,1),imshow(r);
title("原图")
subplot(1,2,2),imshow(new_img/255)
title("sobel算子的图像")
结果:
(3)利用Laplacian算子检测图像边缘,分H1和H2两种情况,并得到锐化增强图像;
代码:
clear
%利用Laplacian算子检测图像边缘,分H1和H2两种情况,并得到锐化增强图像
r=imread("rice.tif");
H1=[0 1 0;1 -4 1;0 1 0];%Laplacian算子 H1
H2=[1 1 1;1 -8 1;1 1 1];%Laplacian算子 H2
rl1=imfilter(r,H1);
rl2=imfilter(r,H2);
figure;
subplot(1,3,1),imshow(r);
title("原图")
subplot(1,3,2),imshow(rl1);
title("Laplacian算子 H1")
subplot(1,3,3),imshow(rl2);
title("Laplacian算子 H2")
结果:
(4)比较采用不同边缘检测算子锐化增强图像的不同效果。
Robert算子和Sobel算子主要强调了图像的水平和垂直边缘,而Laplacian算子则强调了图像的高频细节和边缘。
H1 H2
-1 | 0 | 0 | -1 | -1 | 0 | 1 | -1 | -2 | -1 | 0 | 1 | 0 | 1 | 1 | 1 | |||||
0 | 1 | 1 | 0 | -2 | 0 | 2 | 0 | 0 | 0 | 1 | -4 | 1 | 1 | -8 | 1 | |||||
-1 | 0 | 1 | 1 | 2 | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
图2 robert算子 sobel算子 Laplacian算子
3. 对灰度图像(Fig1018(a).tif)实现基于阈值处理的图像分割(1为必做内容,2-4为选做内容):
(1)利用函数graythresh ()和otsuthresh()找到全局阈值,对图像进行分割;
代码:
clear
%利用函数graythresh ()和otsuthresh()找到全局阈值,对图像进行分割
f=imread("Fig1018(a).tif");
qj1 = graythresh(f) ; %计算基于Otsu方法的灰度图像全局阈值
counts=imhist(f);
qj2 = otsuthresh(counts); %计算基于Otsu方法的灰度图像全局直方图阈值
[ROW,COL]=size(f);%图像的大小
rd=im2double(f);
for i=1:ROW %计算基于Otsu方法的灰度图像全局阈值
for j=1:COL
if rd(i,j)>qj1 %大于所设定的均值 则为目标
BW1(i,j)=0;
else
BW1(i,j)=1;
end
end
end
for i=1:ROW %计算基于Otsu方法的灰度图像全局直方图阈值
for j=1:COL
if rd(i,j)>qj2 %大于所设定的均值 则为目标
BW2(i,j)=0;
else
BW2(i,j)=1;
end
end
end
figure;
subplot(1,3,1),imshow(f);
title("原图")
subplot(1,3,2),imshow(BW1);
title("graythresh ()");
subplot(1,3,3),imshow(BW2);
title("otsuthresh()")
结果:
(2)采用迭代阈值选取方法,编程实现基于图像数据自动地选择阈值,对图像进行全局阈值分割;
代码:
clear
%采用迭代阈值选取方法,编程实现基于图像数据自动地选择阈值,对图像进行全局阈值分割
f=imread("Fig1018(a).tif");
f=im2double(f);
% 第一步:设置参数T0,并选择一个初始的估计阈值T1(取图像I像素值的最小值和最大值的平均值)
T0=0.01;
T1=(min(f(:))+max(f(:)))/2;
% 第二步:用阈值T1分割图像.将图像分成两部分:r1由灰度值大于T1的像素组成,r2是由灰度小于或等于T1的像素组成
r1=find(f>T1);% find函数返回素有非零元素的位置
r2=find(f<=T1);
% 第三步:计算r1和r2中所有像素的平均灰度值h1和h2以及新的阈值T2=(h1+h2)/2
T2=(mean(f(r1))+mean(f(r2)))/2;
% 第四步:若|T2-T1|<T0,则推出T2即为最优阈值;否则,将T2赋值给T1,并重复步骤2-4直到获取最优阈值
if abs(T2-T1)<T0
J=imbinarize(f,T2); % 使用imbinarize函数进行图像分割
else
while abs(T2-T1)>=T0
T1=T2;
r1=find(f>T1);
r2=find(f<=T1);
T2=(mean(f(r1))+mean(f(r2)))/2;
end
J=imbinarize(f,T2); % 使用imbinarize函数进行图像分割
end
figure;
subplot(1,2,1),imshow(f);
title('原始图像')
subplot(1,2,2),imshow(J);
title('迭代式阈值分割后的图像')
结果:
(3)使用Otsu阈值选取方法,编程实现对图像进行最佳全局阈值分割;
代码:
clear
%使用Otsu阈值选取方法,编程实现对图像进行最佳全局阈值分割
f=imread("Fig1018(a).tif");%导入图片
f=im2double(f);
% 函数graythresh()采用Ostu算法获取图像(既可以是灰度也可以RGB)的最优阈值,调用格式为level=graythresh(I),level大小介于[0,1之间
T=graythresh(f);
J=im2bw(f,T);
figure;
subplot(121),imshow(f);
title('原始图像');
subplot(122),imshow(J);
title('Otsu阈值分割后的图像');
结果:
(4)比较迭代法和Otsu法两种不同的阈值处理方法对图像进行分割的效果。
迭代法依赖于初始化阈值和停止准则的选择;Otsu法能够自适应地确定最佳阈值
四、问题与讨论
1.比较不同检测算子对灰度图像('house.tif')边缘检测的效果有什么不同?
Robert算子:Robert算子是一种基于局部差分算子的边缘检测方法,它通过计算相邻像素之间的差分来检测边缘。Robert算子对边缘的定位精度较高,能够检测到较细的边缘,但对噪声比较敏感,容易产生一些虚假边缘。
Sobel算子:Sobel算子是一种基于一阶导数的边缘检测方法,它通过计算图像中每个像素的一阶导数来检测边缘。Sobel算子对噪声的抑制能力较强,能够平滑图像并减少虚假边缘的产生。它对边缘的定位精度较Robert算子稍低,但能够检测到较粗的边缘,并且在处理具有复杂纹理或噪声较多的图像时表现较好。
Laplacian算子:Laplacian算子是一种基于二阶导数的边缘检测方法,它通过计算图像中每个像素的二阶导数来检测边缘。Laplacian算子对边缘的定位精度较高,能够检测到细线和孤立点等细节信息,但对噪声非常敏感,容易产生虚假边缘。因此,在使用Laplacian算子进行边缘检测时,通常需要先对图像进行平滑处理以减少噪声的影响。
2.比较不同方向的检测算子对边缘检测的效果有什么不同?
水平方向检测算子:
优点:对于水平边缘线(如文字、水平线等)的检测效果较好。
缺点:对于垂直边缘线(如建筑物的墙壁、横梁等)的检测效果较差。
垂直方向检测算子:
优点:对于垂直边缘线(如建筑物的墙壁、横梁等)的检测效果较好。
缺点:对于水平边缘线(如文字、水平线等)的检测效果较差。
+45度方向检测算子:
优点:对于斜向边缘线(如斜线、斜向纹理等)的检测效果较好,特别是在与边缘线方向一致时。
缺点:对于水平或垂直边缘线的检测效果较差。
-45度方向检测算子:
优点:与+45度方向检测算子类似,对于斜向边缘线(如斜线、斜向纹理等)的检测效果较好,特别是在与边缘线方向一致时。
缺点:同样对于水平或垂直边缘线的检测效果较差。
3.迭代法和Otsu法两种不同的阈值处理方法对图像进行分割的效果有什么不同?
迭代法:
优点:能够处理光照不均匀、噪声等情况下的图像;对于灰度分布不均匀的图像具有很好的效果。
缺点:计算量大,对计算机性能要求较高;灰度分布波动较大时,会出现过分割或欠分割问题。
Otsu法:
优点:不需要手动指定初始阈值,处理灰度直方图双峰的图像效果很好;计算简单、速度快。
缺点:对于非双峰结构的灰度直方图,容易出现误判;无法处理光照不均匀或对比度较低的图像。