一、实验目的
1.学会使用编程实现不同算法的边缘检测。
2.学会使用编程实现不同算法的图像分割。
3.能够根据实验结果分析各种算法的特点及其应用场合,培养处理实际图像的能力。
二、实验要求
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
三、实验内容与步骤
1.边缘检测:
(1)利用边缘检测函数edge ()对灰度图像(house.tif)进行边缘检测,检测算子分别选择'roberts'、'sobel'、'prewitt'、LOG、'Canny'(其他参数选择:default),比较不同检测算子对边缘检测的效果;
完整代码:
A = imread('house.tif');
B1=edge(A,'roberts');
B2=edge(A,'sobel');
B3=edge(A,'prewitt');
B4=edge(A,'log');
B5=edge(A,'canny');
figure(1)
subplot(2,3,1);imshow(A);title('原图像');
subplot(2,3,2);imshow(B1);title('roberts算子边缘检测图');
subplot(2,3,3);imshow(B2);title('sobel算子边缘检测图');
subplot(2,3,4);imshow(B3);title('prewitt算子边缘检测图')
subplot(2,3,5);imshow(B4);title('log算子边缘检测图');
subplot(2,3,6);imshow(B5);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°)
完整代码:
A = 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 ];
A1=imfilter(A,w1);
A2=imfilter(A,w2);
A3=imfilter(A,w3);
A4=imfilter(A,w4);
subplot(3,2,[1,2]);imshow(A);title('原图像');
subplot(3,2,3);imshow(A1);title('w1(水平)');
subplot(3,2,4);imshow(A2);title('w2(垂直)');
subplot(3,2,5);imshow(A3);title('w3(+45°)');
subplot(3,2,6);imshow(A4);title('w4(-45°)');
运行结果:
2.对灰度图像(rice.tif)编程实现图像锐化增强(算子如图2所示):
(1)利用robert算子检测图像边缘,并采用门限法得到锐化增强图像(T=10,T=50);
完整代码:
A = imread('rice.tif')
[x,y] = size(A);
B =double(A);
robert10 = A;
robert50 = A;
A1 = 10;
A2 = 50;
for i=1:x-1
for j=1:y-1
C = ( B(i+1,j+1) - A(i,j) );
D = ( B(i,j+1) - A(i+1,j) );
if ( abs(C) + abs(D) ) >= A1
robert10(i, j) = abs(C) + abs(D);
else
robert10(i, j) = 0;
end
if ( abs(C) + abs(D) ) >= A2
robert50(i, j) = abs(C) + abs(D);
else
robert50(i, j) = 0;
end
end
end
A3 = A-robert10;
A4 = A-robert50;
subplot(1,3,1);imshow(A);title('原图像');
subplot(1,3,2);imshow(A3);title('robert算子(T=10)');
subplot(1,3,3);imshow(A4);title('robert算子(T=50)');
运行结果:
(2)利用sobel算子检测图像边缘并得到锐化增强图像;
完整代码:
A = imread('rice.tif');
s1 = [-1,0,1;-2,0,2;-1,0,1];
s2 = [-1,-2,-1;0,0,0;1,2,1];
a = imfilter(A,s1);
b = imfilter(A,s2);
A1 = abs(a)+abs(b);
A2 = (A+A1)/2;
subplot(2,3,2);imshow(A);title('原图像');
subplot(2,3,4);imshow(a);title('图像的x梯度');
subplot(2,3,5);imshow(b);title('图像的y梯度');
subplot(2,3,6);imshow(A2);title('图像的sobel梯度');
运行结果:
(3)利用Laplacian算子检测图像边缘,分H1和H2两种情况,并得到锐化增强图像;
完整代码:
A = imread('rice.tif');
H1 = [0,1,0;1,-4,1;0,1,0];
H2 = [1,1,1;1,-8,1;1,1,1];
A1 = imfilter(A,H1);
A2 = imfilter(A,H2);
A3 = fspecial('laplacian',0);
A4 = imfilter(A,A3,'replicate');
A5 = A-A4;
subplot(2,3,2);imshow(A);title('原图像');
subplot(2,3,4);imshow(A1);title('laplacian算子(H1)');
subplot(2,3,5);imshow(A2);title('laplacian算子(H2)');
subplot(2,3,6);imshow(A5);title('MATLAB自带函数锐化');
运行结果:
3. 对灰度图像(Fig1018(a).tif)实现基于阈值处理的图像分割(1为必做内容,2-4为选做内容):
(1)利用函数graythresh ()和otsuthresh()找到全局阈值,对图像进行分割;
(2)采用迭代阈值选取方法,编程实现基于图像数据自动地选择阈值,对图像进行全局阈值分割;
(3)使用Otsu阈值选取方法,编程实现对图像进行最佳全局阈值分割;
(4)比较迭代法和Otsu法两种不同的阈值处理方法对图像进行分割的效果。
完整代码:
A = imread('Fig1018(a).tif');
subplot(2,2,[1,2]);imshow(A);title('原图像');
A1 = graythresh(A) ;
a=imhist(A);
A2 = otsuthresh(a);
[x,y]=size(A);
A3=im2double(A);
for i=1:x
for j=1:y
if A3(i,j)>A1
B(i,j)=0;
else
B(i,j)=1;
end
end
end
subplot(2,2,3);imshow(B);title("graythresh");
for i=1:x
for j=1:y
if A3(i,j)>A2
B2(i,j)=0;
else
B2(i,j)=1;
end
end
end
subplot(2,2,4);imshow(B2);title("otsuthresh");
运行结果: