Advertisement

形态学图像处理

阅读量:

1.二值形态学腐蚀:

在Z²空间中定义了两个点集A和B,在离散数学中我们通常使用运算符来描述它们之间的关系。具体来说,在代数结构中我们定义了运算符"-"作为集合间的差集运算。按照这个定义,在离散数学理论框架下我们可以将运算结果表述为:对于给定的两个点集A和B,在离散数学运算体系中我们称这样的差集运算结果为由B对A施加腐蚀操作所得的结果集。这个结果集是由满足特定条件的所有整数坐标点所组成的几何体。具体来说,在离散数学理论框架下我们可以将该结果集描述为:所有位于被腐蚀区域内的整数坐标点构成的新几何体。

设集合B为一种结构单元,则腐蚀运算等价于以下表达式:其中A^c表示A的补集,Φ为空集。

2.二值形态学膨胀:

在Z2空间中,集合A与集合B分别定义为两个非空子集。运算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减去腐蚀后的结果即是提取到的边界

二值腐蚀算法:

基于3×3尺寸的结构元素遍历图像中的每个像素点,并对每个像素及其周围形成3×3邻域范围内的区域对应的二值图进行逻辑与运算。若运算结果均为1,则结果图像是在该位置设置为1;否则将该位置设为0。

结果:使二值图像减小一圈。

将结构元素B沿向量a进行平移操作后得到Ba。若平移后的Ba完全包含在X中,则我们记录满足条件的该a点。所有满足上述条件的所有a点构成的集合被定义为X经B腐蚀后的结果(Erosion)。用公式表示为:

如图所示:

二值膨胀算法:

通过3 \times 3尺寸的结构元素遍历图像中的每个像素,并对该像素及其覆盖区域进行二值图像的逻辑或运算。若全部为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

实验结果: ​​​​​​​

将图像通过二值化处理转换为只有黑白像素的图像,并将其中所有数值不为零的部分标记为1;与此同时(或及),并将数值为零的部分设置为逻辑零。经过上述处理后,在图像轮廓之外出现了若干个分散的锐利点

对经过二值化的图像实施腐蚀操作后得到的结果图中可以看到,在腐蚀处理后与原图相比出现了部分凹陷区域。其中的突兀边缘已被平滑处理,并且线条得到了一定的细化处理

采用膨胀运算处理二值图像后会使其呈现出一种粗化的特征;经过该过程处理后可直观观察到膨胀后的图像是将原始图中各条线段的宽度显著增加;同时可察觉到细节结构如尖锐点等均得到了一定的放大;整个过程体现了输出结果较输入结果进行了形态学上的扩张

数学形态学中的边界提取过程包括两个主要步骤:首先是对目标区域进行侵蚀操作;接着通过计算原始区域与其侵蚀后结果之间的差异来确定边界信息。通过实验结果可以看出,在实际应用中这种边界提取算法能够有效地反映目标区域的边缘特征,并且其提取效果能够充分地反映出目标区域的轮廓形状。

全部评论 (0)

还没有任何评论哟~