形态学图像处理和图像分割MATLAB实验

一、实验目的

  1. 理解腐蚀和膨胀的原理,掌握开运算、闭运算及形态学的边界提取。
  2. 掌握孤立点检测、线检测和边缘检测的方法。
  3. 掌握全局阈值处理的方法。

二、实验内容

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(AB)

其中, 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);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51143578/article/details/130669836