clc;
clear all;
close all;
%读入图像,并转换为double型,该计算针对的是二值图像,所以加入图像时需注意
%膨胀测试图像
I=im2double(imread('D:\Gray Files\9-11.tif'));
%获得图像大小
[M,N]=size(I);
%存放膨胀后的图像
J=zeros(M,N);
%============================开操作和闭操作================================
%-----------------------------开操作过程-----------------------------------
%结构元素
n=3;
B=ones(n,n);
n_B=length(find(B==1));
%这里需要B对其原点进行翻转,因为B是对称的,所以翻转后的结果与其本身相同
l_m=floor(n/2);
l_n=floor(n/2);
%将原始图像进行扩展,这里采用了镜像扩展,以进行图像边缘计算
%腐蚀操作
I_pad=padarray(I,[l_m,l_n],'symmetric');
for x=1:M
for y=1:N
%从扩展图像中取出子图像
Block=I_pad(x:x+2*l_m,y:y+2*l_n);
%将结构元素与子图像点乘,即逻辑“与”操作
c=B.*Block;
%比较结构元素与c中的1的数量,如果一样多,则该点的值为1
ind=find(c==1);
if length(ind)==n_B
J(x,y)=1;
end
end
end
subplot(221)
imshow(J,[]);
%膨胀操作
I=J;
J=zeros(M,N);
I_pad=padarray(I,[l_m,l_n],'symmetric');
for x=1:M
for y=1:N
%从扩展图像中取出子图像
Block=I_pad(x:x+2*l_m,y:y+2*l_n);
%将结构元素与子图像点乘,即逻辑“与”操作
c=B.*Block;
%比较结构元素与c中的0的数量,如都为0,则该点的值为0,否则为1
ind=find(c==0);
if length(ind)~=n_B
J(x,y)=1;
end
end
end
subplot(222)
imshow(J,[]);
%-----------------------------闭操作过程-----------------------------------
%膨胀操作
I=J;
J=zeros(M,N);
I_pad=padarray(I,[l_m,l_n],'symmetric');
for x=1:M
for y=1:N
%从扩展图像中取出子图像
Block=I_pad(x:x+2*l_m,y:y+2*l_n);
%将结构元素与子图像点乘,即逻辑“与”操作
c=B.*Block;
%比较结构元素与c中的0的数量,如都为0,则该点的值为0,否则为1
ind=find(c==0);
if length(ind)~=n_B
J(x,y)=1;
end
end
end
subplot(223)
imshow(J,[]);
%腐蚀操作
I=J;
J=zeros(M,N);
I_pad=padarray(I,[l_m,l_n],'symmetric');
for x=1:M
for y=1:N
%从扩展图像中取出子图像
Block=I_pad(x:x+2*l_m,y:y+2*l_n);
%将结构元素与子图像点乘,即逻辑“与”操作
c=B.*Block;
%比较结构元素与c中的1的数量,如果一样多,则该点的值为1
ind=find(c==1);
if length(ind)==n_B
J(x,y)=1;
end
end
end
subplot(224)
imshow(J,[]);