灰度形态学基本运算

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灰度形态学基本运算相关的知识,希望对你有一定的参考价值。

参考技术A 与 二值形态学 相对应另一种形态学运算是灰度形态学。灰度形态学与二值形态学相比,不仅在图像本身的空间尺寸上有一个变化,而且图像本身的灰度值也会发上变化。

灰度形态学膨胀,在数学上的定义,可以用如下公式表示:

其中, 表示原始图像,而 表示对原始图像进行膨胀运算的结构化要素,为了与二值化膨胀的运算符号加以区别,我们用 表示灰度形态学膨胀运算。

根据公式,对灰度形态学可以简单理解为,对于原始图像F中 坐标的灰度值,分别向右移动 个单位,再加结构化元素 的值,再取其求得的最大值。

为了更加直观地了解灰度膨胀的运算过程,假设有一个一维的灰度分布列表和一个一维的结构化要素,其膨胀运算的过程可以如下图所示:

如上图所示,以 作为原点坐标,根据结构化元素的分布,先将原始图像 向左移动一个单位,每个灰度值再减3,记作 ,空位用 * 代替,再将原始图像向右移动一个单位,同样每个灰度值减去3,记作 ,余位用 * 补齐,最后,每一列再求取最大值,得到最后的结果,即是对原始图像 以结构化要素 进行灰度膨胀后的结果。可以看出,原始图像不仅在灰度值上发生了变化,而且空间尺寸变得更大。

灰度膨胀的另一个例子如下图所示,

一些灰度膨胀运算的结果如下图所示:

观察以上灰度膨胀效果图,可以看出灰度膨胀具有如下效果:

灰度腐蚀的运算,在数学上的定义,如下公式所示:

与灰度膨胀类似,灰度腐蚀的运算可以描述为将原始图像的像素点移动 个单位,再减去结构化元素 在坐标 处的值,求取集合中的最小值。灰度腐蚀的显著效果是不仅可以使得图像的尺寸变小,其灰度值也会变小。可以将灰度腐蚀的过程想象成一个雪人受到阳光照射而逐渐溶化的过程。

同样,为了更加深刻地理解灰度腐蚀的基本原理,与灰度膨胀一样,以一个简单的一维数据为例,介绍灰度腐蚀的计算过程,如下图所示:

更多的示例如下所示:

灰度腐蚀的效果图如下所示:

灰度腐蚀的效果,与灰度膨胀来对比,呈现出相反的特征,具体特征如下:

灰度形态学的腐蚀运算跟二值形态学的开运算一样,也是利用结构化元素,先对原始灰度图像进行腐蚀后,再进行膨胀的运算,用数学公式表述这个过程如下所示:

灰度开运算能够保留灰度图像中特定的强度的同时,削弱图像中的某种强度,如下图所示,用一个一维数据为例,将灰度开运算的过程当作一个用结构化元素从下往上 fit 原始数据的过程,图像中的一些 尖峰 无法 fit ,将会被抹去,从而得到削弱图像强度的效果。

灰度开运算的过程,如下图所示,可以看出,对原始图像进行灰度开运算后,原始图像的尺寸并没有发生改变,只是一些灰度值变小了。

如下图所示,是一个灰度开运算效果的具体实例,如红框所标的部分,通过灰度开运算,灰度图像中一些被暗色(黑)包围的较小的亮色(白)通过开运算杯抹去,而蓝框表示出的一些较大的亮色区域却被保留了下来。

如下图所示,是灰度开运算的另一个例子,可以看出,结构化元素的尺寸越大,灰度图像中被抹去的亮色区域也越大。

综合以上两个实例,可以看出,灰度开运算具有如下特点:

灰度闭运算的数学公式表述如下:

从数学公式的形式上,可以看出来,灰度闭运算与二值闭运算的计算过程非常相似,其基本的形态学运算灰度膨胀和腐蚀运算。与二值闭运算相比,灰度闭运算不改变图像本身的大小,而是会改变图像的灰度值。

为了更加形象的说明灰度闭运算的原理,以一个一维数据为例,如下图所示,可以将灰度闭运算看作是利用结构化元素对一副图像个上往下 fit 的过程, fit 的过程中,会进入一些“死区”(尺寸小于结化元素的区域),则“死区”数据会被填埋。

以数学计算的方式理解,灰度闭运算,其计算过程如下图所示:

可以看到灰度闭运算,并不会改变图像本身的尺寸,而是会对增加图像的像素值,也就是,灰度闭运算会使得图像变得更亮。

观察以下图片,可以看出灰度闭运算的效果,使得图片中被红色边框所标示的尺寸较小的亮色区域(像素值较大)的部分尺寸增加,而蓝色方框标示出的较大的亮色区域并未发生改变。

观察以下图片,可以看出,当灰度闭运算的结构化元素尺寸越大,所造成,原始灰度图像中被填埋的区域面积也越大。

通过以上分析,灰度闭运算具有如下效果:

最后,以一条曲线为例,比较四种灰度形态学算法的异同

形态学操作实现

数学形态学的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的基本运算有四个:腐蚀、膨胀、开和闭。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。本实验分别实现针对二值图像和灰度图像的四种形态学操作。

一、二值图像的腐蚀、膨胀、开、闭操作

实验结果:

二、灰度图像的腐蚀、膨胀、开、闭操作

实验结果:

代码:(下载链接)

%本实验完成对二值图像和灰度图像的腐蚀、膨胀、开、闭操作
close all;
clear all;
grayI = imread(\'rice.png\');
binI=im2bw(grayI,0.5);%转二值图
se = [0,1,0;1,1,1;0,1,0]; %结构元
binIerode  = myimerode(binI,se,\'binary\');
binIdilate = myimdilate(binI,se,\'binary\');
binIopen   = myimopen(binI,se,\'binary\');
binIclose  = myimclose(binI,se,\'binary\');
grayIerode = myimerode(grayI,se,\'gray\');
grayIdilate= myimdilate(grayI,se,\'gray\');
grayIopen  = myimopen(grayI,se,\'gray\');
grayIclose = myimclose(grayI,se,\'gray\');
figure;
subplot(2,3,1);imshow(binI);title(\'原始二值图\');
subplot(2,3,2);imshow(binIerode);title(\'腐蚀结果\');
subplot(2,3,3);imshow(binIdilate);title(\'膨胀结果\');
subplot(2,3,4);imshow(binIopen);title(\'开结果\');
subplot(2,3,5);imshow(binIclose);title(\'闭结果\')
figure;
subplot(2,3,1);imshow(grayI);title(\'原始灰度图\');
subplot(2,3,2);imshow(uint8(grayIerode));title(\'腐蚀结果\');
subplot(2,3,3);imshow(uint8(grayIdilate));title(\'膨胀结果\');
subplot(2,3,4);imshow(uint8(grayIopen));title(\'开结果\');
subplot(2,3,5);imshow(uint8(grayIclose));title(\'闭结果\');
 
View Code
function O=myimclose(I,se,type)
%%闭操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:闭操作结果
O=myimerode(myimdilate(I,se,type),se,type);
View Code
function O=myimopen(I,se,type)
%开操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:开操作结果
O=myimdilate(myimerode(I,se,type),se,type);
View Code
function O=myimerode(I,se,type)
%%腐蚀操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:腐蚀操作结果
O=zeros(size(I));
[r,c]=size(I);
[m,n]=size(se);
lm=floor((m-1)/2);
ln=floor((n-1)/2);
rm=m-lm-1;
rn=n-ln-1;
orgm=lm+1;%结构元原点
orgn=ln+1;
if(strcmp(type,\'binary\'))%二值图像
    for i=1:r
        for j=1:c
            indexr=max(1,i-lm):min(r,i+rm);%边界处理
            indexc=max(1,j-ln):min(c,j+rn);
            if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))==sum(sum(se(indexr-i+orgm,indexc-j+orgn))))
                O(i,j)=1;
            end
        end
    end
end
if(strcmp(type,\'gray\'))%灰度图像
    I=double(I);
    for i=1:r
        for j=1:c
            indexr=max(1,i-lm):min(r,i+rm);%边界处理
            indexc=max(1,j-ln):min(c,j+rn);
            O(i,j)=min(min(I(indexr,indexc)-se(indexr-i+orgm,indexc-j+orgn)));
        end
    end
end
View Code
function O=myimdilate(I,se,type)
%%膨胀操作
%I:输入图像(二值或灰度)
%se:结构元
%type:图像类型(gray、binary)
%O:膨胀操作结果
se=reflect(se);%结构元反射
O=zeros(size(I));
[r,c]=size(I);
[m,n]=size(se);
lm=floor(m/2);%区别于erode
ln=floor(n/2);
rm=m-lm-1;
rn=n-ln-1;
orgm=lm+1;%结构元原点
orgn=ln+1;
if(strcmp(type,\'binary\'))%二值图像
    for i=1:r
        for j=1:c
            indexr=max(1,i-lm):min(r,i+rm);%边界处理
            indexc=max(1,j-ln):min(c,j+rn);
            if(sum(sum(se(indexr-i+orgm,indexc-j+orgn)&I(indexr,indexc)))>=1)
                O(i,j)=1;
            end
        end
    end
end
if(strcmp(type,\'gray\'))%灰度图像
    I=double(I);
    for i=1:r
        for j=1:c
            indexr=max(1,i-lm):min(r,i+rm);%边界处理
            indexc=max(1,j-ln):min(c,j+rn);
            O(i,j)=max(max(I(indexr,indexc)+se(indexr-i+orgm,indexc-j+orgn)));
        end
    end
end

function newse=reflect(se)
%%结构元反射操作
%se:输入结构元
%newse:反射后结构元
[m,n]=size(se);
newse=zeros(m,n);
for i=1:m
    for j=1:n
        newse(i,j)=se(m+1-i,n+1-j);
    end
end
View Code

 

以上是关于灰度形态学基本运算的主要内容,如果未能解决你的问题,请参考以下文章

youcans 的 OpenCV 例程200篇137. 灰度开运算和灰度闭运算原理

youcans 的 OpenCV 例程200篇137. 灰度开运算和灰度闭运算原理

图像识别路面裂缝识别含GUI源码

OpenCV图像处理二十数学形态学方法(下)

图像识别路面裂缝识别含GUI源码

图像识别路面裂缝识别含GUI源码