文章目录
- 一、实验目的
- 二、实验内容
- 1. 开运算和闭运算实验。
- 2. 用形态学处理提取边界。
- 4. 全局阈值处理。
一、实验目的
- 理解腐蚀和膨胀的原理,掌握开运算、闭运算及形态学的边界提取。
- 掌握孤立点检测、线检测和边缘检测的方法。
- 掌握全局阈值处理的方法。
二、实验内容
1. 开运算和闭运算实验。
图1(a)显示了一幅被噪声图像污染的指纹图像,图1(b)给出了结构元,请自编程序,实现以下运算:
(1) 用图1(b)所示的结构元对图1(a)进行腐蚀。
(2) 对图1(a)进行开运算。
(3) 对开运算的结果进行膨胀处理。
(4) 对开运算的结果进行闭运算处理。
(5) 分析实验结果。
答:
%%
%对污染的指纹图像进行腐蚀运算
clear all;close all;clc
f=imread('1.tif');%f 240x317
[M, N]=size(f);
f1=zeros(M,N);
figure;imshow(f)
se=ones(3); %结构元素为 3×3 时
[m, n]=size(se);
sx=floor(m/2); %取整
sy=floor(n/2);
f = padarray(f,[sx sy]); %对 f 进行零填充
[M, N]=size(f); %获取填充后 f 的大小
for i=sx+1:M-sx
for j=sy+1:N-sy
fblock=f(i-sx:i+sx,j-sy:j+sy);
andresult=se&fblock; %与运算
if (andresult==se)
f1(i-sx,j-sy)=1;
else
f1(i-sx,j-sy)=0;
end
end
end
subplot(1,4,1); imshow(f1);title('腐蚀运算结果');
%%
%%对污染的指纹图像进行开运算,即腐蚀之后进行膨胀运算
f1 = padarray(f1,[sx sy]);
f2=zeros(238,315); %开运算的结果
for i=sx+1:M-sx
for j=sy+1:N-sy
fblock=f1(i-sx:i+sx,j-sy:j+sy);
andresult=se&fblock;
As=sum(sum(andresult));
if As>0
f2(i-sx,j-sy)=1;
else
f2(i-sx,j-sy)=0;
end
end
end
subplot(1,4,2);imshow(f2);title('开运算结果');
%%
%对开运算的结果进行膨胀处理。
f2 = padarray(f2,[sx sy]);
f3=zeros(238,315); %开运算的结果继续膨胀
for i=sx+1:M-sx
for j=sy+1:N-sy
fblock=f2(i-sx:i+sx,j-sy:j+sy);
andresult=se&fblock;
As=sum(sum(andresult));
if As>0
f3(i-sx,j-sy)=1;
else
f3(i-sx,j-sy)=0;
end
end
end
subplot(1,4,3); imshow(f3);title('开运算后膨胀结果');
%%
%对开运算的结果进行闭运算
f3 = padarray(f3,[sx sy]);
f4=zeros(238,315); %存储开运算后闭运算结果
for i=sx+1:M-sx
for j=sy+1:N-sy
fblock=f3(i-sx:i+sx,j-sy:j+sy);
andresult=se&fblock; %与运算
if (andresult==se)
f4(i-sx,j-sy)=1;
else
f4(i-sx,j-sy)=0;
end
end
end
subplot(1,4,4); imshow(f4);title('开运算后闭运算结果');
2. 用形态学处理提取边界。
图2(a)给出了一幅简单的二值图像,图2(b)给出了结构元,请按照式(1),对图2(a)进行处理。
β ( A ) = A − ( A ⊖ B ) \beta (A)=A-(A\ominus B) β(A)=A−(A⊖B)
其中, B B B 是结构元。先通过 B B B 对 A A A 腐蚀,再执行 A A A 和腐蚀结果之间的差,即可得到集合 A A A 的边界。
答:
close all; clear all; clc;
f=imread('2.tif');
%先腐蚀
se=ones(3);%结构元
[m, n]=size(se);
sx=floor(m/2); %取整
sy=floor(n/2);
f_padded = padarray(f,[sx sy]); %对 f 进行零填充
[M, N]=size(f_padded); %获取填充后 fp 的大小
for i=sx+1:M-sx
for j=sy+1:N-sy
fblock=f_padded(i-sx:i+sx,j-sy:j+sy);
andresult=se&fblock; %与运算
if (andresult==se)
f1(i-sx,j-sy)=1;
else
f1(i-sx,j-sy)=0;
end
end
end
%后做差
fe=f-f1;
figure,imshow(fe)
4. 全局阈值处理。
图6给出了一幅带噪声的指纹图像,请进行以下运算:
(1) 求图6的直方图。
(2) 用
T
=
m
T=m
T=m (平均图像灰度)开始,并令
Δ
T
=
0.01
\Delta T=0.01
ΔT=0.01,应用“实验讲义”中给出的迭代算法得到全局阈值。
(3) 用(2)中得到的全局阈值对图像进行分割。
答:
clear all;close all;clc
f=imread('4.tif');
imhist(f);
f=im2double(f);
T=mean(f(:));%当前阈值
t=0;%下一次阈值
while abs(T-t)>0.01%当T与t相差过大
G1=f>T;%逻辑判断,f>T的部分为1,反之为0,注意G1会是logical类型的变量
t=0.5*mean(f(G1))+0.5*mean(f(~G1));
T=t;
end
%显式的使用find
% index=find(f>T);
% f(index)=1;
% index=find(f<T);
% f(index)=0;
% imshow(f);
%使用逻辑索引来改善速度,不需要显式的使用find
f(f>T)=1;
f(f<=T)=0;
imshow(f);