1.二值形态学腐蚀:
Z2中的集合A和B, A-B表示为B对A的腐蚀,即B对A的腐蚀是一个用z平移的B包含在A中的所有的点z的集合。
假定集合B是一个结构元,则腐蚀表达式等价于下面的表达式,其中,A c是A的补集,Φ是空集。
2.二值形态学膨胀:
A和B是Z2中的集合, A+B表示为B对A的膨胀。表达式是以B关于它的原点的映像,并且以z对映像进行平移为基础。
B对A的膨胀是所有位移z的集合,假定B是一个结构元,A是被膨胀的集合。
代码如下:
clc %清除命令窗口的内容
close all %关闭所有的Figure窗口
clear all %清除工作空间的所有变量
%% 二值形态学腐蚀和膨胀函数
function output = corrosion_expansion(A,input,element)
%当A=0时为二值形态学腐蚀,A=1时为二值形态学膨胀
%element采用3×3的结构元
[m,n] = size(input);%输入图像尺寸大小
P = zeros(m+2,n+2);
P(2:m+1,2:n+1) = input(:,:);
if (A ~=0 && A~=1)
error('请输入A的值为0或1,0为二值形态学腐蚀操作,1为二值形态学膨胀操作');
end
if (A == 0) %腐蚀
output = zeros(m,n);
for i = 2:m+1
for j = 2:n+1
if (element & P(i-1:i+1,j-1:j+1)) == element
output(i-1,j-1) = 1;
end
end
end
end
if (A == 1) %膨胀
output = ones(m,n);
for i = 2:m+1
for j = 2:n+1
if (element & P(i-1:i+1,j-1:j+1)) == zeros(3,3)
output(i-1,j-1) = 0;
end
end
end
end
end
3.边界抽取
使用形态学操作实现边界提取的思路:
(1)首先对图像A进行腐蚀,
(2)之后再使用A减去腐蚀后的结果即是提取到的边界
二值腐蚀算法:
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈。
把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。用公式表示为:
如图所示:
二值膨胀算法:
用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“或”操作。如果都为0,结果图像的该像素为0。否则为1。
结果:使二值图像扩大一圈
如图所示:
clc %清除命令窗口的内容
close all %关闭所有的Figure窗口
clear all %清除工作空间的所有变量
%%
I = imread('Fig0914(a).tif');
I1 = im2bw(I);
subplot(231),imshow(I),title('原图像');
subplot(232),imshow(I1),title('二值化后的图像');
element = [1,1,1;1,1,1;1,1,1];
I2 = corrosion_expansion(0,I1,element);
subplot(233),imshow(I2),title('腐蚀后的图像');
I3 = corrosion_expansion(1,I1,element);
subplot(234),imshow(I3),title('膨胀后的图像');
I4 = differencing(I1,I2);
subplot(235),imshow(I4),title('形态学提取边界');
%% 二值形态学腐蚀和膨胀函数
function output = corrosion_expansion(A,input,element)
%当A=0时为二值形态学腐蚀,A=1时为二值形态学膨胀
%element采用3×3的结构元
[m,n] = size(input);%输入图像尺寸大小
P = zeros(m+2,n+2);
P(2:m+1,2:n+1) = input(:,:);
if (A ~=0 && A~=1)
error('请输入A的值为0或1,0为二值形态学腐蚀操作,1为二值形态学膨胀操作');
end
if (A == 0) %腐蚀
output = zeros(m,n);
for i = 2:m+1
for j = 2:n+1
if (element & P(i-1:i+1,j-1:j+1)) == element
output(i-1,j-1) = 1;
end
end
end
end
if (A == 1) %膨胀
output = ones(m,n);
for i = 2:m+1
for j = 2:n+1
if (element & P(i-1:i+1,j-1:j+1)) == zeros(3,3)
output(i-1,j-1) = 0;
end
end
end
end
end
%% 图像交集、差集和补集函数
% 图像交集函数
function output = intersection(input1,input2)
[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
for j = 1:n
if input1(i,j)==1 && input2(i,j) == 1
output(i,j) = 1;
end
end
end
end
% 图像差集函数
function output = differencing(input1,input2)
[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
for j = 1:n
if input1(i,j)==1 && input2(i,j)==0
output(i,j) = 1;
end
end
end
end
% 图像补集函数
function output = complementation(input1,input2)
[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
for j = 1:n
if input1(i,j)==1 || input2(i,j)==1
output(i,j) = 1;
end
end
end
end
实验结果:
对图像进行二值化处理,把f1中的非0值变成1,数值0值变成逻辑0,可以发现,在图像轮廓外出现了一些零散的尖锐点。
对二值化后的图像进行腐蚀,可以看出腐蚀后的图像轮廓相比原图像有一定的凹陷,二值图像中的尖锐点被消除,部分被细化。
对二值图像进行膨胀,膨胀后二值图像被粗化,可以明显观察到膨胀图像比原图像的线条粗很多,尖锐点也被放大,图像发生了膨胀。
形态学边界提取是先对二值图像进行腐蚀,然后计算原图像与腐蚀图像的差集。由实验结果可以发现,边界提取的结果能很好地表示图像的边界信息,完整地显示出了图像的轮廓。