图像处理形态学分析_形态学图像处理分析 - CSDN
  • 继膨胀、腐蚀、开运算和闭运算之后的有一...1,结构元素是形态学变换中的基本元素,是为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,也可以称为收集图像结构信息的探针。结构元素有许多的种类,如圆形、...

    继膨胀、腐蚀、开运算和闭运算之后的有一个基本操作就是击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。在研究图像中的目标物体与图像背景之间的关系上,HMT能够取得很好的效果。所以常被用于解决目标图像识别和模式识别等领域。

    1,结构元素是形态学变换中的基本元素,是为了探测图像的某种结构信息而设计的特定形状和尺寸的图像,也可以称为收集图像结构信息的探针。结构元素有许多的种类,如圆形、方形、线型等,还有二值的和灰度值的,模糊集中的等等多种结构元素。在击中击不中变换中将结构元素分解成两个,一个定义为前景结构元素,一个定义为背景结构元素,定义如下:B=(E,F),     其中E的F交集为空集

    2,HMT的标准变换的定义就是:

                                

      腐蚀操作的结果就是结构元素S平移x但任包含在输入图像A内部的所有结构元素的原点集合,对于HMT变换,当且仅当结构元素E平移到某一点可以填入A的内部,且F平移到该点时可以填入A的外部时,该点才能在HMT变换的结果中输出。由于需要精确的匹配,因此该算法对识别的要求很高,但是对于实际的图像,往往含有各种未知的噪声,即会出现误差,所以实际的意义不是很大

    它的原理就是使用腐蚀;如果要在一幅图像A上找到B形状的目标,我们要做的是:

    首先,建立一个比B大的模板W;使用此模板对图像A进行腐蚀,得到图像假设为Process1;

    其次,用B减去W,从而得到V模板(W-B);使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;

    然后,Process1与Process2取交集;得到的结果就是B的位置。这里的位置可能不是B的中心位置,要视W-B时对齐的位置而异;

      其实很简单,两次腐蚀,然后交集,结果就出来了;

    HMT是基于多个物体分开的假设,才有背景结构元素的,在某些情况,我们只对某个物体的模式匹配感兴趣, 此时HMT简化为腐蚀。

    一些形态学算法

    1.边界提取 原图与腐蚀结果做差

    2.空洞填充 从第一个边界内的0点膨胀,不断迭代

    3.连通分量提取 ,从连通分量区域内第一个1值开始膨胀,不断迭代。

    4.凸壳C(A),其实就是包含一个集合A的最小区域,可通过算法限制其各个方向的生长,保证凸性需要最小尺寸。通过Bi结构元,让每个结构元腐蚀集合A,直到收敛,而后对i个结构元的结果取并集。

    5.细化/粗化,细化是A-(B对A的HMT),粗化则是A+B对A的HMT.但实际中,并不按此公式来做,而是先对问题集的背景细化,再对结果求补。

    6.骨架S(A)

    7.裁剪,是对骨架和细化操作的补充。不断删除寄生分支的终点来抑制分支。

    8.形态学重建,包括测地腐蚀重建和测地膨胀重建。所谓测地腐蚀或者膨胀,实际上是利用模板限制标记图像的生长。最终会收敛。形成膨胀/腐蚀形态学重建。所以有用的地方是,重建开/闭操作,填充空洞,边界清除等。

    一些灰度级形态学算法

    1.平滑,利用开操作抑制亮细节,闭操作抑制暗细节

    2.梯度,即膨胀-腐蚀

    3.顶帽 原图像-开,底帽变换 闭-原图像,常用来删除物体,而非拟合物体。

    4.粒度测定,即表面积随着SE增大而减小

    5.纹理分割,即先闭消除小点,后开,消除大点。

    灰度级形态学重建

    与二值类似。只是交集取小值,并集取大值。
    --------------------- 
    作者:EasonApp 
    来源:CSDN 
    原文:https://blog.csdn.net/App_12062011/article/details/39577609 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 图像处理——形态学

    千次阅读 2017-06-05 15:53:00
    形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。 基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换 几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密...
    形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。

    基本的算法:膨胀腐蚀,开操作,闭操作,击中击不中变换

    几种算法进行组合,就可以实现一些非常复杂的功能,而且逻辑严密。

    这里给出形态学的一般原理,以及用形态学进行边界提取,角点提取好骨架提取的原代码

    一    引言
            数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于数学形态学的图像处理系统。1982年出版的专著《Image Analysis and Mathematical Morphology》是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。
            数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。

    二    数学形态学的定义和分类
            数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。

    (1)二值形态学
            数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。
            基本的形态运算是腐蚀和膨胀。
            在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为:
           
            用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
            可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。

    (2)灰度数学形态学
            二值数学形态学可方便地推广到灰度图像空间。只是灰度数学形态学的运算对象不是集合,而是图像函数。以下设f(x,y)是输入图像,b(x,y)是结构元素。用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:

    对灰度图像的膨胀(或腐蚀)操作有两类效果:
    (1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);
    (2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。用b对f进行开启和闭合运算的定义为:

    (3)模糊数学形态学
            将模糊集合理论用于数学形态学就形成了模糊形态学。模糊算子的定义不同,相应的模糊形态运算的定义也不相同。在此,选用Shinba的定义方法。模糊性由结构元素对原图像的适应程度来确定。用有界支撑的模糊结构元素对模糊图像的腐蚀和膨胀运算按它们的隶属函数定义为:

     

    其中,x,y∈Z2代表空间坐标,ua,ub分别代表图像和结构元素的隶属函数。从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在[0,1]的区间内。模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。

     

    三 数学形态学在图像处理中的主要应用

    近年来,数学形态学在图像处理方面得到了日益广泛的应用。下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等方面的应用做简要介绍。

    (1)       边缘检测

    边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。对于二值图像,边缘检测是求一个集合A的边界,记为B(A):

     

    对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g:

    数学形态学运算用于边缘检测,存在着结构元素单一的问题。它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构元素的逻辑组合检测出不同方向的边缘。

    梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。

    边缘检测源代码:

    [cpp] view plain copy
    1. /******************************************************************** 
    2. 形态学基本操作采用二值图像  
    3. ***********************************************************************/  
    4. #include<cv.h>  
    5. #include <highgui.h>  
    6. int main(){  
    7.     IplImage * image,*image2,*image3;  
    8.     image = cvLoadImage("E:\\image\\mapleleaf.tif", 0);  
    9.     cvNamedWindow("image",1);  
    10.     cvShowImage("image",image);  
    11.       
    12.   
    13.     /*边界提取*/  
    14.    image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    15.     image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    16.    int  i , j ;  
    17.    int left,right, up , down;  
    18.    int n = 2;//窗口大小为5*5  
    19.    int r,s,flag;  
    20.    unsigned char * ptr, *dst;  
    21.    for (i = 0 ; i< image->height; i++)  
    22.    {  
    23.        for (j = 0 ; j< image->width; j++)  
    24.        {  
    25.            //窗口设定  
    26.            left = j - n;  
    27.            right = j +n;  
    28.            up = i -n;  
    29.            down = i+n;  
    30.            //窗口出界处理  
    31.            if(left< 0){left = 0;}  
    32.            if(right >= image->width){right = image->width-1;}  
    33.            if(up< 0){up =0;}  
    34.            if(down >= image->height){down = image->height -1;}  
    35.   
    36.            //腐蚀处理  
    37.            dst = (unsigned char *)image2->imageData + image2->widthStep*i + j;  
    38.            flag = 1;  
    39.            for (r = up;r <= down;r++)  
    40.            {  
    41.                for (s = left ; s<= right; s++)  
    42.                {  
    43.                   ptr = (unsigned char *)image->imageData + r*image->widthStep + s;  
    44.   
    45.                   if(*ptr != 255){  
    46.                         flag = 0;  
    47.                   }  
    48.                }  
    49.            }  
    50.            if (flag == 1)  
    51.            {  
    52.                *dst = 255;  
    53.            }  
    54.            else{  
    55.                *dst = 0;  
    56.            }  
    57.   
    58.        }  
    59.    }  
    60.    cvSub(image,image2,image3,0);  
    61.    cvNamedWindow("image3",1);  
    62.    cvShowImage("image3",image3);  
    63.    cvSaveImage("mapleleafboard.bmp", image3);  
    64.    cvWaitKey(0);  
    65.     cvReleaseImage(&image);  
    66.     cvReleaseImage(&image2);  
    67.     cvReleaseImage(&image3);  
    68.     cvDestroyAllWindows();  
    69.     return 0 ;  
    70. }  
    原图:

    

    边界提取:


     

    (2)       图像分割

    基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集X1,X2,…,XN,即:

    对目标X的分割过程可按下面的方法完成:首先求出X的最大内接“圆”X1,然后将X1从X中减去,再求X-X1的最大内接“圆”X2,…,依此类推,直到最后得到的集合为空集为止。下面以二值图像为例,介绍用数学形态学方法求解子集X1,X2,…,XN的过程。

    设B为结构元素,B可以是圆、三角形、正方形等简单的几何基元,那么“简单”形状集合Xi可以用下面的公式来定义:

    式中ni为一整数,用上式定义Xi分割目标,有时会产生分割过程不唯一的现象。为此可采用下面公式来定义简单集合Xi

    其中Li为一个点或一条线,当Li为点时,则与(12)式定义等价。(13)式定义的简单形状Xi可由niB沿线Li移动而产生。即将“产生器”niB的中心沿“脊骨”Li移动产生。如果niB为圆,则得到的Xi称Blum带。它具有一些特殊的性质,如Xi的边界是光滑的,Xi的最大圆与其边界相切,Xi的脊骨与产生器都是唯一的等等。

    有了简单形状集合Xi的定义,则目标X可按下面方法分割。首先按式(14)求出X的最大内切结构元素Xi

    数学形态学用于图像分割的缺点是对边界噪声敏感。为了改善这一问题,刘志敏等人提出了基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法,并使用该算法对二值图像进行了分割,取得了较好的效果。邓世伟等人提出一种基于数学形态学的深度图像分割算法。作者首先利用形态学算子获得分别含有阶跃边缘与屋脊边缘的凸脊和凹谷图像,然后利用控制区域生长过程得到最终的分割结果。与传统方法相比,该方法速度快,抗噪性能好。

     

    (3)       形态骨架提取

    形态骨架描述了物体的形状和方向信息。它具有平移不变性、逆扩张性和等幂性等性质,是一种有效的形状描述方法。二值图像A的形态骨架可以通过选定合适的结构元素B,对A进行连续腐蚀和开启运算来求取,设S(A)代表A的骨架,定义为:

    蒋刚毅等人运用数学形态学方法,对交通标志的内核形状提取形态骨架函数,将其作为用于模式匹配的形状特征。A的形态骨架函数SKF(A)表示为:

    SKF(X)中值较大的点对应大的n,并代表了形态骨架的主要成分,即表达了形状的主体结构;而SKF(X)中值较小的点对应小的n,是形态骨架的细节成分,与形状的边缘信息相联系。

    形态骨架函数完整简洁地表达了形态骨架的所有信息,因此,根据形态骨架函数的模式匹配能够实现对不同形状物体的识别。算法具有位移不变性,因而使识别更具稳健性。

     骨架提取原代码:

    [cpp] view plain copy
    1. /************************************************************************/  
    2. /* 骨架提取*/  
    3. /************************************************************************/  
    4. #include<cv.h>  
    5. #include <highgui.h>  
    6. int main(){  
    7.     IplImage* image = cvLoadImage("E:\\image\\bone.tif",0);  
    8.     cvNamedWindow("image",1);  
    9.     cvNamedWindow("image2",1);  
    10.     cvNamedWindow("image3",1);  
    11.     cvNamedWindow("image4",1);  
    12.     cvNamedWindow("image5",1);  
    13.     cvNamedWindow("image6",1);  
    14.   
    15.     cvNamedWindow("result",1);  
    16.     cvShowImage("image", image);  
    17.     //cvWaitKey(0);  
    18.     //当前图片image2  当前被腐蚀后的图片image3 被腐蚀开操作之后的图片 image5   
    19.     //image4 作为开操作的中间值 作差后的图片image6  并之后的图片result    
    20.     IplImage *image2, *image3 , *image4, *image5,*image6,*result;  
    21.     image2 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    22.     image3 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    23.     image5 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    24.     image4 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    25.     image6 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    26.     result = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);  
    27.       
    28.     //循环标志 flag  
    29.     bool flag = true;  
    30.     //腐蚀判断标志 flag2  
    31.     bool flag2  = true;  
    32.     int i,j,r,s;  
    33.     unsigned char * ptr,*dst;  
    34.     unsigned char B[9] = {255 ,255,255,255,255,255,255,255,255};  
    35.     //对result进行赋值 全部为0   
    36.     for (i = 0 ; i< result->height; i++)  
    37.     {  
    38.         for (j = 0 ; j< result->width ; j++)  
    39.         {  
    40.             dst = (unsigned char *)(result->imageData + result->widthStep *i +j);  
    41.             *dst = 0;  
    42.         }  
    43.     }  
    44.     image2 = cvCloneImage(image);  
    45.     cvShowImage("image2", image2);  
    46.     //cvWaitKey(0);  
    47.     while (flag)  
    48.     {  
    49.         //flag = false;  
    50.         cvShowImage("image2",image2);  
    51.         //进行腐蚀操作,开环操作 作差 并  
    52.         for (i = 0 ; i< image3->height; i++)  
    53.         {  
    54.             for (j = 0 ; j< image3->width ; j++)  
    55.             {  
    56.             dst =  (unsigned char *)(image3->imageData + i*image3->widthStep + j);  
    57.                 if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 ))  
    58.                 {  
    59.                     *dst = 0;  
    60.                     //break;  
    61.                 }  
    62.                 else{  
    63.                 flag2 = true;  
    64.                 for (r = i-1 ; r<= i+1 ; r++)  
    65.                 {  
    66.                     for (s = j -1 ; s<= j+1 ; s++)  
    67.                     {  
    68.                         ptr  = (unsigned char *)(image2->imageData + r*image2->widthStep + j);  
    69.                         if(*ptr != 255){  
    70.                             flag2 =false;  
    71.                         }  
    72.                     }  
    73.                 }  
    74.                   
    75.                 if (flag2)  
    76.                 {  
    77.                     *dst = 255;  
    78.                 }  
    79.                 else {*dst = 0;}  
    80.                 }  
    81.             }  
    82.         }  
    83.         cvShowImage("image3",image3);  
    84.           
    85.   
    86.     //开操作 先腐蚀 后膨胀   
    87.         for (i = 0 ; i< image4->height; i++)  
    88.         {  
    89.             for (j = 0 ; j< image4->width ; j++)  
    90.             {  
    91.                 dst =  (unsigned char *)(image4->imageData + i*image4->widthStep + j);  
    92.                 if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 ))  
    93.                 {  
    94.                     *dst = 0;  
    95.                     //break;  
    96.                 }  
    97.                 else{  
    98.                 flag2 = true;  
    99.                 for (r = i-1 ; r<=  i+1 ; r++)  
    100.                 {  
    101.                     for (s = j -1 ; s<= j+1 ; s++)  
    102.                     {  
    103.                         ptr  = (unsigned char *)(image3->imageData + r*image3->widthStep + s);  
    104.                         if(*ptr != 255){  
    105.                             flag2 =false;  
    106.                         }  
    107.                     }  
    108.                 }  
    109.                   
    110.                 if (flag2)  
    111.                 {  
    112.                     *dst = 255;  
    113.                 }  
    114.                 else {*dst = 0;}  
    115.                 }  
    116.             }  
    117.         }  
    118.         cvShowImage("image4",image4);  
    119.         //膨胀操作  
    120.         for (i = 0 ; i< image5->height; i++)  
    121.         {  
    122.             for (j = 0 ; j< image5->width ; j++)  
    123.             {  
    124.                 dst =  (unsigned char *)(image5->imageData + i*image5->widthStep + j);  
    125.                 if ((i == 0 )|| (j == 0) ||( i == image5->height -1 ) || (j == image5->width -1 ))  
    126.                 {  
    127.                     *dst = 0;  
    128.                     //break;  
    129.                 }  
    130.                 else{  
    131.                 flag2 = false;  
    132.                 for (r = i-1 ; r<= i+1 ; r++)  
    133.                 {  
    134.                     for (s = j -1 ; s<= j+1 ; s++)  
    135.                     {  
    136.                         ptr  = (unsigned char *)(image4->imageData + r*image4->widthStep + s);  
    137.                         if(*ptr == 255){  
    138.                             flag2 = true;  
    139.                         }  
    140.                     }  
    141.                 }  
    142.                   
    143.                 if (flag2)  
    144.                 {  
    145.                     *dst = 255;  
    146.                 }  
    147.                 else {*dst = 0;}  
    148.                 }  
    149.             }  
    150.         }  
    151.             cvShowImage("image5",image5);  
    152.   
    153.   
    154.      //作差  
    155.       cvSub(image3,image5,image6,0);  
    156.       //并运算  
    157.       for (i = 0 ; i< result->height; i++)  
    158.       {  
    159.           for (j = 0 ; j< result->width ; j++)  
    160.           {  
    161.               dst = (unsigned char *)(result->imageData + result->widthStep *i +j);  
    162.               ptr = (unsigned char *)(image6->imageData + image6->widthStep *i +j);  
    163.               if (*ptr == 255)  
    164.               {  
    165.   
    166.                   *dst = 255;  
    167.               }  
    168.           }  
    169.       }  
    170.         cvShowImage("image6",image6);  
    171.       //将腐蚀后的图像复制给当前图像image2  
    172.      image2 =  cvCloneImage(image3);  
    173.   
    174.       //循环标志判定  
    175.       flag = false;  
    176.       for (i = 0 ; i< image2->height; i++)  
    177.       {  
    178.           for (j = 0 ; j< image2->width ; j++)  
    179.           {  
    180.                
    181.               ptr = (unsigned char *)(image2->imageData + image2->widthStep *i +j);  
    182.               if (*ptr == 255)  
    183.               {  
    184.                   flag = true;  
    185.               }  
    186.           }  
    187.       }  
    188.       cvShowImage("result", result);  
    189.       cvWaitKey(40);  
    190.     }  
    191.       
    192.     cvShowImage("image2", image2);  
    193.     cvShowImage("image3", image3);  
    194.     //cvShowImage("image4", image4);  
    195.     //cvShowImage("image5", image5);  
    196.     //cvShowImage("image6", image6);  
    197.     cvShowImage("result",result);  
    198.     cvSaveImage("E:\\image\\bonegujia.bmp",result);  
    199.     cvWaitKey(0);  
    200.     cvReleaseImage(&image);  
    201.     cvDestroyAllWindows();  
    202.     return 0;  
    203. }  

    原图:


    提取的骨架:


    DNA原图:


    骨架:


    形态学算法对于提取交叉的物体,会产生断裂,一般会在提取之后紧跟连接操作。




    角点提取源代码:采用击中击不中变换

    [cpp] view plain copy
    1. /******************************************************************** 
    2. 形态学基本操作采用二值图像 形态学方法在边界获取和形状检测中有很多应用 寻找角点 
    3. ***********************************************************************/  
    4. #include<cv.h>  
    5. #include <highgui.h>  
    6. int main(){  
    7.     IplImage * image,*image2,*image3,*image4,*result;  
    8.     image = cvLoadImage("E:\\image\\jiaodian.bmp", 0);  
    9.     cvNamedWindow("image",1);  
    10.     cvShowImage("image",image);  
    11.   
    12.   
    13.     /*击中击不中变换 寻找角点*/   
    14.     /************************************************************************/  
    15.     /*   最终结果为(79, 85 )和 (129 ,134)两个符合要求的角点  在结果图像中可以看到两个白点*/  
    16.     /************************************************************************/  
    17.     image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    18.     image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    19.     image4 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    20.     result = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);  
    21.   
    22.     int  i,j,r,s ;  
    23.     unsigned char B1[9] ={ 255,255,255,255,0,0,255,0,0};  
    24.     unsigned char B2[9] = {0,0,0,0,255,255,0,255,255 };  
    25.     int flag;  
    26. //iamge2 是对image进行求补的结果  
    27.     unsigned char *ptr, *dst,*ptr2;  
    28.     for (i = 0 ; i< image2->height; i++)  
    29.     {  
    30.         for (j = 0 ; j< image2->width; j++)  
    31.         {  
    32.             ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;  
    33.             dst = (unsigned char*)image2->imageData + i*image2->widthStep + j;  
    34.             *dst = 255- (*ptr);  
    35.   
    36.         }  
    37.     }  
    38.   
    39.     //对源图像进行腐蚀  
    40.     for (i = 0 ; i< image3->height; i++)  
    41.     {  
    42.         for (j = 0 ; j< image3->width; j++)  
    43.         {  
    44.             flag = 1;  
    45.             dst = (unsigned char*)image3->imageData + i*image3->widthStep +j;  
    46.             //边界判断  
    47.             if (( i == 0) || (j == 0) || (i == image3->height-1) || (j == image3->width -1 ))  
    48.             {  
    49.                 *dst = 0;  
    50.             }  
    51.             else{  
    52.                     for (r = i -1 ; r<= i+1; r++)  
    53.                     {  
    54.                         for (s = j-1 ; s <= j +1 ; s++)  
    55.                         {  
    56.                             ptr = (unsigned char*)image->imageData + r * image->widthStep+ s;  
    57.                             if (*ptr != B1[3*(r-i+1) + s-j+1])  
    58.                             {  
    59.                             flag = 0;  
    60.                             break;  
    61.                             }  
    62.                         }  
    63.                     }  
    64.                     if (flag == 1)  
    65.                     {  
    66.                         ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;  
    67.                         *dst = 255;  
    68.                     }  
    69.                     else{  
    70.                         *dst = 0;  
    71.                     }  
    72.   
    73.                 }  
    74.   
    75.         }  
    76.     }  
    77.   
    78.     //显示腐蚀结果  
    79.   
    80.     for (i = 0 ; i< image2->height; i++)  
    81.     {  
    82.         for (j = 0 ; j< image2->width; j++)  
    83.         {  
    84.             ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;  
    85.             ptr2 = (unsigned char*)image3->imageData + i*image3->widthStep + j;  
    86.             if (*ptr2  == 255)  
    87.             {  
    88.                 printf("x, %d  y: %d   %d\n",j, i, *ptr2 - *ptr);  
    89.             }  
    90.               
    91.         }  
    92.     }  
    93.     //对补图像进行腐蚀  
    94.     for (i = 0 ; i< image4->height; i++)  
    95.     {  
    96.         for (j = 0 ; j< image4->width; j++)  
    97.         {  
    98.             flag = 1;  
    99.             dst = (unsigned char*)image4->imageData + i*image4->widthStep +j;  
    100.             //边界判断  
    101.             if (( i == 0) || (j == 0) || (i == image4->height-1) || (j == image4->width -1 ))  
    102.             {  
    103.                 *dst = 0;  
    104.             }  
    105.             else{  
    106.                 for (r = i -1 ; r<= i+1; r++)  
    107.                 {  
    108.                     for (s = j-1 ; s <= j +1 ; s++)  
    109.                     {  
    110.                         ptr = (unsigned char*)image2->imageData + r * image2->widthStep+ s;  
    111.                         if ((*ptr) != B2[3*(r- i+1) + s-j +1])  
    112.                         {  
    113.                             flag = 0;  
    114.                         }  
    115.                     }  
    116.                 }  
    117.                 if (flag == 1)  
    118.                 {  
    119.                     ptr = (unsigned char*)image2->imageData + i * image2->widthStep+ j;  
    120.                     *dst = 255;  
    121.                 }  
    122.                 else{  
    123.                     *dst = 0;  
    124.                 }  
    125.   
    126.             }  
    127.   
    128.         }  
    129.     }  
    130.     //显示腐蚀结果  
    131.   
    132.     for (i = 0 ; i< image4->height; i++)  
    133.     {  
    134.         for (j = 0 ; j< image4->width; j++)  
    135.         {  
    136.             ptr = (unsigned char*)image2->imageData + i * image->widthStep+ j;  
    137.             ptr2 = (unsigned char*)image4->imageData + i*image3->widthStep + j;  
    138.             if (*ptr2  == 255)  
    139.             {  
    140.                 printf("x, %d  y: %d   %d\n",j,i, *ptr2 - *ptr);  
    141.             }  
    142.   
    143.         }  
    144.     }  
    145.     //二者求交集  
    146.     for (i = 0 ; i< result->height; i++)  
    147.     {  
    148.         for (j = 0 ; j< result->width; j++)  
    149.         {  
    150.             ptr = (unsigned char *)image3->imageData + image3->widthStep * i + j;  
    151.             ptr2 = (unsigned char *)image4->imageData + image4->widthStep * i + j;  
    152.             dst = (unsigned char *)result->imageData +  result->widthStep*i + j;  
    153.             if (((*ptr) == 255) && ((*ptr2) == 255))  
    154.             {  
    155.                 *dst = 255;  
    156.                 printf("x : %d\n" , j);  
    157.                 printf("y : %d\n" , i);  
    158.   
    159.             }  
    160.             else{  
    161.                   
    162.                 *dst = 0;  
    163.             }  
    164.   
    165.         }  
    166.     }  
    167.     cvNamedWindow("image3",1);  
    168.     cvNamedWindow("image4",1);  
    169.     cvNamedWindow("result",1);  
    170.     cvShowImage("image3",image3);  
    171.     cvShowImage("image4",image4);  
    172.     cvShowImage("result",result);  
    173.     //cvSaveImage("mapleleafboard.bmp", image3);  
    174.     cvWaitKey(0);  
    175.     cvReleaseImage(&image);  
    176.     cvReleaseImage(&image2);  
    177.     cvReleaseImage(&image3);  
    178.     cvDestroyAllWindows();  
    179.     return 0 ;  
    180. }  
    原图:


    提取的角点:


    如果要提取十字型角点只需换用十字型的模板即可

    (4)       噪声滤除

    对图像中的噪声进行滤除是图像预处理中不可缺少的操作。将开启和闭合运算结合起来可构成形态学噪声滤除器。

    对于二值图像,噪声表现为目标周围的噪声块和目标内部的噪声孔。用结构元素B对集合A进行开启操作,就可以将目标周围的噪声块消除掉;用B对A进行闭合操作,则可以将目标内部的噪声孔消除掉。该方法中,对结构元素的选取相当重要,它应当比所有的噪声孔和噪声块都要大。

    对于灰度图像,滤除噪声就是进行形态学平滑。实际中常用开启运算消除与结构元素相比尺寸较小的亮细节,而保持图像整体灰度值和大的亮区域基本不变;用闭合运算消除与结构元素相比尺寸较小的暗细节,而保持图像整体灰度值和大的暗区域基本不变。将这两种操作综合起来可达到滤除亮区和暗区中各类噪声的效果。同样的,结构元素的选取也是个重要问题。


     

     

    四 选取结构元素的方法

    分析表明,各种数学形态学算法的应用可分解为形态学运算和结构元素选择两个基本问题,形态学运算的规则已由定义确定,于是形态学算法的性能就取决于结构元素的选择,亦即结构元素决定着形态学算法的目的和性能。因此如何自适应地优化确定结构元素,就成为形态学领域中人们长期关注的研究热点和技术难点。目前较多采用多个结构元素对图像进行处理的方法。

     

    (1)       多结构元素运算

    在许多形态学应用中,往往只采用一个结构元素,这通常不能产生满意的结果。在模式识别中,如果要提取某个特定的模式,只采用一个结构元素,那么,只有与结构元素形状、大小完全相同的模式才能被提取,而与此结构元素表示的模式即使有微小差别的其他模式的信息都不能获取。

    解决此问题的一个有效方法之一就是将形态学运算与集合运算结合起来,同时采用多个结构元素,分别对图像进行运算,然后将运算后的图像合并起来,即多结构元素形态学运算。

     

    (2)       用遗传算法选取结构元素

    遗传算法的思想来源于自然界物竞天择、优胜劣汰、适者生存的演化规律和生物进化原理,并引用随机统计理论而形成,具有高效并行全局优化搜索能力,能有效地解决机器学习中参数的复杂优化和组合优化等难题。

    近年来不少国外学者已进行了这方面的探索与研究,Ehrgardt设计了形态滤波的遗传算法,用于二值图像的去噪和根据二值纹理特性消除预定目标;Huttumen利用遗传算法构造了软式形态滤波器及其参数优化的设计方法,以实现灰度图像的降噪功能。余农、李予蜀等人用遗传算法在自然景象的目标检测与提取方面进行了研究,通过自适应优化训练使结构元素具有图像目标的形态结构特征,从而赋予结构元素特定的知识,使形态滤波过程融入特有的智能,以实现对复杂变化的图像具有良好的滤波性能和稳健的适应能力。其实质是解决滤波器设计中知识获取和知识精炼的机器学习问题。

     

    五 数学形态学存在的问题与进一步的研究方向

    数学形态学是一门建立在集论基础之上的学科,是几何形状分析和描述的有力工具。近年来,数学形态学在数字图像处理、计算机视觉与模式识别等领域中得到了越来越广泛的应用,渐渐形成了一种新的数字图像分析方法和理论,引起了国内外相关领域研究人员的广泛关注。目前,数学形态学存在的问题及研究方向主要集中在以下几个方面:

    (1)            形态运算实质上是一种二维卷积运算,当图像维数较大时,特别是用灰度形态学、软数学形态学、模糊形态学等方法时,运算速度很慢,因而不适于实时处理。

    (2)            由于结构元素对形态运算的结果有决定性的作用,所以,需结合实际应用背景和期望合理选择结构元素的大小与形状。

    (3)             软数学形态学中关于结构元素核心、软边界的定义,及对加权统计次数*的选择也具有较大的灵活性,应根据图像拓扑结构合理选择,没有统一的设计标准。

    (4)           为达到最佳的滤波效果,需结合图像的拓扑特性选择形态开、闭运算的复合方式。

    (5)            对模糊形态学,不同的模糊算子会直接影响模糊形态学的定义及其运算结果。

    (6)           有待进一步将数学形态学与神经网络、模糊数学结合研究灰度图像、彩色图像的处理和分析方法。

    (7)            有待进一步研究开发形态运算的光学实现及其它硬件实现方法。

    (8)            有待将形态学与小波、分形等方法结合起来对现有图像处理方法进行改进,进一步推广应用。所以如何实现灰度形态学、软数学形态学、模糊软数学形态学的快速算法,如何改善形态运算的通用性,增强形态运算的适应性,并结合数学形态学的最新应用进展,将其应用到图像处理领域,丰富和发展利用数学形态学的图像处理与分析方法,成为数学形态学今后的发展方向。

     

    六 结论

    数学形态学对图像的处理具有直观上的简明性和数学上的严谨性,在定量描述图像的形态特征上具有独特的优势,为基于形状细节进行图像处理提供了强有力的手段。建立在集合理论基础上的数学形态学,主要通过选择相应的结构元素采用膨胀、腐蚀、开启、闭合#种基本运算的组合来处理图像。数学形态学在图像处理中的应用广泛,有许多实用的算法,但在每种算法中结构元素的选取都是一个重要的问题。


    文章转自:http://blog.csdn.net/renshengrumenglibing/article/details/7177695


    展开全文
  • 数字图像处理第九章数字图像处理---形态学图像处理(一)预备知识1.1 预备知识1.1.1 集合理论中的基本概念1.2 二值图像、集合及逻辑算子(二)膨胀和腐蚀2.1 膨胀2.2 结构元的分解2.3 strel函数2.4 腐蚀(三) 膨胀...

    数字图像处理—形态学图像处理

    同样的,暂时对书上已经写得很清楚的知识点不再重复赘述,主要做一些总结,思考以及知识点的梳理和扩展。

    (一)预备知识

    介绍一下形态学中的一些基本概念。

    1. 用数学形态学(也称图像代数)表示以形态为基础对图像进行分析的数学工具
    2. 基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析识别的目的
    3. 形态学图像处理的数学基础和所用语言是集合论
    4. 形态学图像处理的应用可以简化图像数据, 保持它们基本的形状特性,并除去不相干的结 构
    5. 形态学图像处理的基本运算有4个:膨胀、 腐蚀、开操作和闭操作

    1.1 集合理论中的基本概念

    介绍一下比较陌生的几个概念,其他的看书就好:

    1. 所有像素坐标的集合均不属于集合A,记为AcA^c,由下式给出:
      在这里插入图片描述
      这个集合称为集合A的补集

    2. 集合B的反射,定义为:

      即关于原集合原点对称 .

    3. 集合A平移到点z=(z1,z2),表示为(A)z,定义为:

    1.2 二值图像、集合及逻辑算子

    二值图像

    二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机变量,一共有N个像素,那么二值图有2的N次方种变化,而8位灰度图有255的N次方种变化,8为三通道RGB图像有255255255的N次方种变化。也就是说同样尺寸的图像,二值图像保存的信息更少。二值图像(binary image),即图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。

    二值图像集合

    如果A和B是二值图像,那么C=A∪B仍是二值图像。这里,如 果 A 和B中相应的像素不是前景像素就是背景像素,那么 C中的这个像素就是前景像素。以第一种观点,函数 C由下式给出:
    在这里插入图片描述
    另一方面,运用集合的观点,C由下式给出:
    在这里插入图片描述
    集合运算

    1. A为图像集合,B为结构元素(集合)。
    2. 数学形态学运算时B对A进行操作。
    3. 结构元素要有1个原点(即结构元素参与形态学运算的参考点),可以是中心像素,原则上可选任何像素。
      注意:原点可以包含在结构元素中,也可以不包含在结构元素中,但运算的结果常不相同。

    编码

    f = imread('D:\数字图像处理\第九章学习\Fig0903(a).tif');
    g = imread('D:\数字图像处理\第九章学习\Fig0903(b).tif');
    subplot(2,3,1), imshow(f);title('(a)二值图像 A:');
    subplot(2,3,2), imshow(g);title('(b)二值图像 B:');
    subplot(2,3,3), imshow(~f);title('(c)A的补集~A:');
    subplot(2,3,4), imshow(f|g);title('(d) A和B的并集 A|B:');
    subplot(2,3,5), imshow(f&g);title('(e)A和B的交集 A & B:');
    subplot(2,3,6), imshow(f&~g);title('(f)A和B的差集 A&~B');
    

    代码运行效果如下
    在这里插入图片描述
    分析

    图像(d)是 “ UTK”和 “ GT” 图像的并集,包括来自两幅图像的所有前景像素。相反,两幅图像的交集(图(e))显示了字母 “ UTK”和 “ GT”中重叠的像素。最后,集合的差集图像(图(f))显示了 “ UTK”中除去 “ GT” 像素后的字母。

    (二)膨胀和腐蚀

    2.1 膨胀

    膨胀:膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。(实际就是将结构元素的原点与二值图像中的1重叠,将二值图像中重叠部分不是1的值变为1,完成膨胀)。

    公式

    A和B是两个集合,A被B膨胀定义为:

    公式解释:

    1. B的反射进行平移与A的交集不为空。
    2. B的反射:相对于自身原点的映象。
    3. B的平移:对B的反射进行位移

    图解

          

    (a)集合A    (b)结构元素B (黑色为原点所在)

          

    (c)结构元素B的映像    (d)图中两种阴影部分(深色为扩大的部分)合起来为A+B

    注意

    1. 膨胀运算只要求结构元素的原点在目标图像的内部平移,换句话说,当结构元素在目标图像上平移时,允许结构元素中的非原点像素超出目标图像的范围
    2. 膨胀运算具有扩大图像和填充图像中比结果元素小的成分的作用,因此在实际应用中可以利用膨胀运算连接相邻物体和填充图像中的小孔和狭窄的缝隙

    膨胀举例

    膨胀函数

    D = imdilate(A,B)

    图像膨胀的应用:桥接文字裂缝

    编码:

    A = imread('D:\数字图像处理\第九章学习\Fig0906(a).tif');
    B = [0 1 0; 1 1 1; 0 1 0];   %指定结构元素由0和1组成的矩阵
    A2 = imdilate(A, B);    %二值图像
    subplot(1,2,1), imshow(A);title('(a)包括断开文本的输入图像:');
    subplot(1,2,2), imshow(A2);title('(b)膨胀后图像:');
    

    在这里插入图片描述
    图片中字体的加粗,且填充了字母中的小孔和狭窄的缝隙。

    2.2 结构元的分解

    公式
    在这里插入图片描述
    公式理解

    B膨胀A等同于B1先膨胀A,再用B2膨胀之前的结果。

    举例

    下面是由1组成的5x5数组的膨胀:
    在这里插入图片描述
    这个结构元能够分解为值为 1 的 5 元素行矩阵和值为 1 的 5 元素列矩阵:

    在这里插入图片描述
    分析

    在原结构元中,元素个数为 25; 但在行列分解后,总元素数目仅为 10。这意味着首先用 行结构元膨胀,再用列结构元膨胀,能够比 5x5 的数组膨胀快 2.5 倍。在实践中,速度的增长稍微慢一些,因为在每个膨胀运算中总有些其他开销。然而,由分解执行获得的速度方面的增 长仍然有很大意义。

    2.3 strel函数

    工具箱函数 strel 用于构造各种形状和大小的结构元。

    基本语法

    se = strel(shape, parameters)

    shape用于指定希望形状的字符串,parameters是描述形状信息的参数列表。

    具体例子参考课本,是基础语法。

    2.4 腐蚀

    腐蚀:与膨胀相反,对二值图像中的对象进行“收缩”或“细化”。(实际上将结构元素的原点覆盖在每一个二值图像的1上,只要二值图像上有0和结构元素的1重叠,那么与原点重叠的值为0)同样由集合与结构元素完成。

    公式

    A和B是两个集合,A被B腐蚀定义为:

    公式解释:

    1. A被 B 腐蚀是包含在A中的B由z平移的所有点z的集合。
    2. B包含在A中的声明相当于B不共享A背景的任何元素。

    图解
         

    (a)集合A(阴影部分)   (b)结构元素B(阴影部分,深色部分为原点)(c)阴影部分合起来为A-B

    注意

    1. 当结构元素中原点位置不为1(也即原点不属于结构元素时),也要把它看作是1,也就是说,当在目标图像中找与结构元素B相同的子图像时,也要求子图像中与结构元素B的原点对应的那个位置的像素的值是1。
    2. 腐蚀运算要求结构元素必须完全包括在被腐蚀图像内部:换句话说,当结构元素在目标图像上平移时,结构元素中的任何元素不能超过目标图像范围。
    3. 腐蚀运算的结果不仅与结构元素的形状选取有关,而且还与原点位置的选取有关
    4. 腐蚀运算具有缩小图像和消除图像中比结构元素小的成分的作用,因此在实际应用中,可以利用腐蚀运算去除物体之间的粘连,消除图像中的小颗粒噪声

    腐蚀举例

    腐蚀函数

    A2 = imerode(A, se)

    图像腐蚀应用:消除图像细节部分

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0908(a).tif');
    se = strel('disk', 10);
    g = imerode(f, se);
    se = strel('disk', 5);
    g1 = imerode(f, se);
    g2 = imerode(f, strel('disk', 20));
    subplot(2,2,1), imshow(f);title('(a)原始图像的尺寸为480x480像素:');
    subplot(2,2,2), imshow(g);title('(b)用半径为10的圆形腐蚀:');
    subplot(2,2,3), imshow(g1);title('(c)用半径为5的圆形腐蚀:');
    subplot(2,2,4), imshow(g2);title('(d)用半径为20的圆形腐蚀');
    

    分析

    假设要除去图a中的细线,但想保留其他结构,可以选取足够小的结构元来匹配中心方块,但较粗的边缘线因太大而无法匹配全部线。图b几乎成功去掉了模板中的细线,图c中一些引线还没有去掉,图d中引线都被去掉了,但是边缘引线也丢失了,所以选取合适的结构元很重要。

    (三) 膨胀与腐蚀的结合

    3.1 开操作和闭操作

    开操作

    1. 使图像的轮廓变得光滑,断开狭窄的间断和消除细的突出物。
    2. 使用结构元素B对集合A进行开操作,定义为:

      先用B对A腐蚀,然后用B对结果膨胀。
    3. 与开操作等价的数学表达式为:
    4. A o B 的边界通过B中的点完成。
    5. B在A的边界内转动时,B中的点所能到达的A的边界的最远点。
    6. A o B 是 A的子集合。
    7. 如果C是D的子集,则 C o B是 D o B的子集。
    8. (A o B) o B = A o B

    闭操作

    1. 同样使图像的轮廓变得光滑,但与开操作相反,它能消除狭窄的间断和长细的鸿沟,消除小的孔洞,并填补轮廓线中的裂痕。
    2. 使用结构元素B对集合A进行闭操作,定 义为:

      先用B对A膨胀,然后用B对结果腐蚀。
    3. A . B的边界通过B中的点完成 。
    4. B在A的边界外部转动 :
    5. A 是 A . B的子集合。
    6. 如果C 是 D 的子集 , 则C . B 是 D . B的子集。
    7. (A . B) . B = A . B

    工具箱函数

    开操作:

    C = imopen(A, B)

    闭操作:

    C = imclose(A, B)

    A为二值图像,B为0,1矩阵组成,并且是指定结构元素。

    函数imopen 和 imclose 的应用

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0910(a).tif');
    se = strel('square', 40);
    fo = imopen(f, se);
    fc = imclose(f, se);
    foc = imclose(fo, se);
    subplot(2,2,1), imshow(f), title('(a)原图');
    subplot(2,2,2), imshow(fo), title('(b)开操作');
    subplot(2,2,3), imshow(fc), title('(c)闭操作');
    subplot(2,2,4), imshow(foc), title('(d) (b)的闭操作结果');
    

    分析

    1. 图(a)中的图像设计了一些用于演示开操作和闭操作的特征,比如细小突起、细的桥接点、几个弯口、孤立的小洞、 小的孤立物和齿状边缘。
    2. 图 (b)显示了结果。注意,从图中可以看出,细的突出和外部点的边缘的不规则部分被去除掉了,细的桥接和小的孤立物也被去除了。
    3. 图 ©中的结果: 这里,细的弯口、内部的不规则边缘和小洞都被去除了。先做开操作的闭操作的结果有平滑效果.
    4. 图 (d)显示了平滑过的物体。

    噪声滤波器

    先开操作再闭操作,构成噪声滤波器。

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0911(a).tif');
    se = strel('square', 6);
    fo = imopen(f, se);
    foc = imclose(fo, se);
    subplot(1,3,1), imshow(f), title('(a)带噪声的指纹图像');
    subplot(1,3,2), imshow(fo), title('(b)图像的开操作');
    subplot(1,3,3), imshow(foc), title('(c)先用开操作,再用闭操作');
    

    在这里插入图片描述
    分析

    1. 图(a)是受噪声污染的指纹二值图像,噪声为黑色背景上的亮元素和亮指纹部分的暗元素。
    2. 图(b)所示的图像。发现,对图像进行开操作可以去除噪声点,但是这种处理在指纹的纹脊上又引入一些缺口
    3. 图( c )显示了最终结果。在这个结果中,大多数噪声被消除了,开运算的闭运算可以给指纹填充缺口,但是指纹纹路并没有完全恢复 。

    3.2 击中或击不中变换

    击中击不中变换(HMT),HMT变换可以同时探测图像的内部和外部。研究解决目标图像识别模式识别等领域,在处理目标图像和背景的关系上能够取得更好的效果。

    作用:形状检测的基本工具。

    公式

    A中对B进行的匹配(击中)表示为:

    B1是由与一个对象相联系的B元素构成的集合,B1是由与一个对象相联系的B元素构成的集合。

    图解

    工具箱函数

    C = bwhitmiss(A, B1, B2)

    其中的 C为结果,A为输入图像,B1、B2表示结构元素。

    定位图像中物体左上角的像素

    编码:

    f = imread('D:\数字图像处理\第九章学习\Fig0913(a).tif');
    B1 = strel([0 0 0;0 1 1; 0 1 0]);
    B2 = strel([1 1 1;1 0 0;1 0 0]);
    g = bwhitmiss(f,B1,B2);
    subplot(1,2,1), imshow(f), title('(a)原始图像');
    subplot(1,2,2), imshow(g), title('(b)击中、击不中变换的结果');
    

    分析

    1. 图(a)显示了包括各种尺寸的正方形图像。我们要定位有东、南相邻像素(这些 “击中”)和没有东北、北、西北、西和西南相邻像素(这些 “击不中”)的前景像素。这些要求导致以下B1,B2两个结构元。这两个结构元都不包括东南邻域像素,这称为不关心像素。用函数 bwhitmiss 来计算变换。
    2. 图 (b)中的每个单像素点都是图 (a)中物体左上角的像素。图 (b)中是放大后的像素,以便更清晰。bwhitmiss的替代语法可以把Bl 和 B2 组合成间隔矩阵。只要 B1等于 1 或-1,B2 等于 1, 间隔矩阵就等于 1。对于不关心像素,间隔矩阵等于 0。

    3.3 bwmorph函数

    工具箱函数 bwmorph 执行许多以膨胀、腐蚀和查找表运算相结合为基础的形态学操作, 调用语法为:

    g = bwmorph(f, operation, n);

    f 是输入的二值图像,operation 是指定所希望运算的字符串,n 是指定重复次数的正整数。

    细化

    f = imread('D:\数字图像处理\第九章学习\Fig0911(a).tif');
    g1 = bwmorph(f, 'thin',1);
    g2 = bwmorph(f, 'thin',2);
    ginf = bwmorph(f,'thin', Inf);
    subplot(1,4,1),imshow(f);title('(a)指纹图像:');
    subplot(1,4,2),imshow(g1);title('(b)细化一次后的指纹图像:');
    subplot(1,4,3),imshow(g2);title('(c)细化两次后的图像:');
    subplot(1,4,4),imshow(ginf);title('(d)一直细化到稳定状态的图像:');
    

    在这里插入图片描述
    骨骼化

    f = imread('D:\数字图像处理\第九章学习\Fig0916(a).tif');
    fs = bwmorph(f,'skel',Inf);
    for k = 1:5
        fa = fs & ~endpoints(fs);
    end
    subplot(1,3,1),imshow(f);title('(a)骨头图像:');
    subplot(1,3,2),imshow(fs);title('(b)使用函数 bwmorph 得到的骨豁:');
    subplot(1,3,3),imshow(fa);title('(c)使用函数 endpoint 裁剪后的骨豁:');
    

    在这里插入图片描述
    分析:骨骼化(Gonzalez和 Woods[2008])是另一种减少二值图像中的物体为一组细“笔画”的方法, 这些细骨豁仍保留原始物体形状的重要信息。当 operation 置为 'skel '时,函数 bwmorph 执行骨骼化。令 f 代表图(a)中类似骨头的图像,为了计算骨骼,调用 bwmorph, 令 n=Inf,图(b)显示了骨骼化的结果,与物体的基本形状相似。骨骼化和细化经常产生短的无关的“毛刺” ,有时这被叫做寄生成分。清除(或除去)这些“毛刺”的处理称为裁剪。方法是反复确认并去除端点。通过 5 次去除端点的迭代,得以后处理骨骼化图像 fs,图(c )显示了结果。

    (四)标记连通分量

    工具箱函数

    [L, num] = bwlabel (f, conn)

    f 是输入二值图像,coon指定希望的连接方式(不是4连接就是8连接),输出L叫做标记矩阵,函数num则给出找到的连通分量总数。

    计算和显示连通分量的质心:

    f = imread('D:\数字图像处理\第九章学习\Fig0917(a).tif');
    imshow(f);title('(a)标注连通分量原始图像:');
    [L,n]=bwlabel(f);        %L为标记矩阵,n为找到连接分量的总数
    [r,c]=find(L==3);        %返回第3个对象所有像素的行索引和列索引 
    rbar=mean(r);
    cbar=mean(c);
    figure,imshow(f);title('(b)标记所有对象质心后的图像:');
    hold on            %保持当前图像使其不被刷新
    for k=1:n
       [r,c]=find(L==k);
       rbar=mean(r);
       cbar=mean(c);
       plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k',...
            'MarkerFaceColor','k','MarkerSize',10);
       plot(cbar,rbar,'Marker','*','MarkerFaceColor','w'); %其中的marker为标记
    end
    

    (五)形态学重建

    概述:重构是一种涉及到两幅图像和一个结构元素的形态学变换。一幅图像,即标记,是变换的开始点。另一幅图像是掩膜,用来约束变换过程。结构元素用于定义连接性。

    定义:若G是掩膜,f为标记,则从f重构g可以记为RgR_g(f),由下列的迭代过程定义:

    1. 将h1初始化为标记图像f。
    2. 创建结构元素 :B = ones(3)。
    3. 重复

      直到

      其中,标记f必须是g的一个子集。

    函数

    out = imreconstruct(marker,mask)

    masker是标记,mask是掩膜。

    5.1 通过重建进行开操作

    在形态学开操作中,腐蚀典型地去除小的物体,且随后的膨胀趋向于恢复保留的物体形状。 然而,这种恢复的精确度取决于形状和结构元之间的相似性。本节讨论的方法,通过重建进行开操作能准确地恢复腐蚀之后的物体形状。用结构元B对图像 G通过重建进行开操作可定义为 :
    在这里插入图片描述

    f = imread('D:\数字图像处理\第九章学习\Fig0917(a).tif');
    subplot(3,2,1),imshow(f);title('(a)重构原始图像');
    fe=imerode(f,ones(51,1));%竖线腐蚀
    subplot(3,2,2),imshow(fe);title('(b)使用竖线腐蚀后的结果');
    fo=imopen(f,ones(51,1));%竖线做开运算
    subplot(3,2,3),imshow(fo);title('(c)使用竖线做开运算结果');
    fobr=imreconstruct(fe,f);%fe做标记
    subplot(3,2,4),imshow(fobr);title('(d)使用竖线做重构开运算');
    ff=imfill(f,'holes');%对f进行孔洞填充
    subplot(3,2,5),imshow(ff);title('(e)对f填充孔洞后的图像');
    fc=imclearborder(f,8);%清除边界,2维8邻接
    subplot(3,2,6),imshow(fc);title('(f)对f清除边界后的图像');
    

    在这里插入图片描述
    分析

    1. 传统开运算中,腐蚀去除掉小对象,随后的膨胀恢复原始对象形状,但受元素结构影响,恢复的往往不是很精确。
    2. 重构则能精确恢复原始图像。

    5.2 填充孔洞

    令I表示二值图像,假设我们选择标记图像F,除了图像边缘外,其余部分都为 0, 边缘部分设值为 1-I:
    在这里插入图片描述
    函数

    g = imfill(f,‘holes’);

    5.3 清除边界物体

    定义标记图像F为:
    在这里插入图片描述
    其中,/是原始图像,然后以/作为模板图像,重建
    在这里插入图片描述
    得到一幅图像H, 其中仅包含与边界接触的物体。

    函数

    g = imclearborder(f,conn)

    f 是输入图像,g 是结果。conn 的值不是 4 就是 8(默认)。 物体更亮且与图像边界相连接的结构。

    (六)灰度级形态学

    6.1 膨胀和腐蚀

    灰度图像的形态学梯度定义为膨胀运算与腐蚀运算的结果之间的差值。

    膨胀定义

    1. 使用结构元素b对f的灰度膨胀定义为:

      其中,DfD_fDbD_b分别是f和b的定义域,f和b是函数而不是二值形态学情况中的集合。

    2. 当结构元素b是平坦的,即b(x,y)在其定义域内都为0时:
      在这里插入图片描述

    腐蚀定义

    1. 使用结构元素b对f的灰度腐蚀定义为:
      在这里插入图片描述
      其中,DfD_fDbD_b分别是f和b的定义域。

    2. 当结构元素b是平坦的,即b(x,y)在其定义域内都为0时:
      在这里插入图片描述

    膨胀和腐蚀操作

    编写代码:

    f = imread('D:\数字图像处理\第九章学习\Fig0923(a).tif');
    se=strel('square',3);  %构造了一个平坦的3x3的结构元素
    gd=imdilate(f,se);    %对原图像进行膨胀操作
    ge=imerode(f,se);     %对原图像进行腐蚀操作
    morph_grad=imsubtract(gd,ge); %从膨胀的图像中减去腐蚀过得图像产生一个形态学梯度。
    subplot(3,2,1);imshow(f,[]);title('(a)原始图像');
    subplot(3,2,2),imshow(gd,[]);title('(b)膨胀的图像');
    subplot(3,2,3),imshow(ge,[]);title('(c)腐蚀的图像');
    subplot(3,2,4),imshow(morph_grad,[]);title('(d)形态学梯度');
    

    在这里插入图片描述
    分析

    1. 膨胀得到的图像比原图像更明亮,并且减弱或消除小的,暗的细节部分。即比原图像模糊。
    2. 腐蚀得到的图像更暗,并且尺寸小,明亮的部分被削弱 。

    6.2 开操作和闭操作

    图像开运算

    1. 在灰度图像中,开操作的表达式与二值图像拥有相同的形式。
    2. 把一幅图像看做是一个三维表明,其亮度值代表xy平面上的高度值,则当结构元素b在f下面活动时,结构元素的任何部分的最高值构成了开运算的结果。
    3. 先进行腐蚀操作可以除去小的亮的图像细节,但这样会使图像变暗,接下来进行膨胀操作增强图像的整体亮度。

    图像闭运算

    1. 在灰度图像中,闭操作的表达式与二值图像拥有相同的形式。
    2. 当结构元素b在f的上面活动时,结构元素的任何部分的最低值构成了闭运算的结果 。
    3. 先通过膨胀操作除去图像中的暗细节,同时增加图像的亮度,接下来对图像进行腐蚀,而不会将膨胀操作除去的部分重新引入图像中。

    用开操作和闭操作做形态学平滑

    f = imread('D:\数字图像处理\第九章学习\Fig0925(a).tif');
    subplot(3,2,1),imshow(f);  
    title('(a)木钉图像原图');   
    se=strel('disk',5);     %disk其实就是一个八边形  
    fo=imopen(f,se);        %经过开运算  
    subplot(3,2,2),imshow(f);  
    title('(b)使用半径5的disk开运算后的图像');   
    foc=imclose(fo,se);  
    subplot(3,2,3),imshow(foc);  
    title('(c)先开后闭的图像'); 
    focd=imclose(f,se);  
    subplot(3,2,4),imshow(focd);  
    title('(d)原始图像的闭操作'); 
    foce=imopen(focd,se);  
    subplot(3,2,5),imshow(foce);  
    title('(e)先闭后开的图像'); 
    fasf=f;  
    for i=2:5  
        se=strel('disk',i);  
        fasf=imclose(imopen(fasf,se),se);  
    end  
    subplot(3,2,6),imshow(fasf);  
    title('(f)使用开闭交替滤波后图像'); 
    
    
    

    在这里插入图片描述
    分析

    1. 图 (b)显示了开操作的图像 fo, 在这里,我们看到,亮区域己经被调低了(平滑),木钉上的暗条文几乎没有受影响。
    2. 图 (c )显示了开操作的闭操作 foe。现在我们注意到,暗区域已经被平滑得很好了,结果是整个图像得到全部平滑。这种过程通常叫做开-闭滤波。先开运算后闭运算构成噪声滤波器,用来平滑图像并去除噪声。
    3. 图 (d)显示了原始图像的闭操作结果。木钉上的暗条文已经被平滑掉了,主要留下了亮的细节(注意背景中的亮条文)。
    4. 图 (e)显示了这些条文的平滑和木钉表面的进一步平滑效果。最终结果是原始图像得到全部平滑。
    5. 图(f)是交替顺序滤波,交替顺序滤波的一种形式是用不断增大的一系列结构元执行开-闭滤波,刚开始用小的结构元,增加大小,直到与图 (b)和©中结构元的大小相同为止。交替顺序滤波与单个开-闭滤波相比,处理图像更平滑一些。

    非均匀背景的补偿

    f = imread('D:\数字图像处理\第九章学习\Fig0926(a).tif');
    g = f>=(255*graythresh(f));
    se=strel('disk',100);
    fo=imopen(f,se);
    f2=imsubtract(f,fo); 
    g1 = f2>=(255*graythresh(f2));
    subplot(2,3,1),imshow(f);  
    title('(a)原始图像');  
    subplot(2,3,2),imshow(g);  
    title('(b)经过阈值处理后的图像');   
    subplot(2,3,3),imshow(f);  
    title('(c)原图开运算后的图像');  
    subplot(2,3,4),imshow(f2);  
    title('(d)原图减去开运算');  
    subplot(2,3,5),imshow(g1);  
    title('(e)最终结果');  
    

    在这里插入图片描述
    分析

    1. 图 (a) :显示了一幅米粒的图像f,图像下部的背景比上部的黑。这样的话,对不平坦的亮度进行阈值处理会很困难。
    2. 图 (b) "是阈值处理方案,图像顶端的米粒被很好地从背景中分离开来,但是图像底部的米粒没有从背景中正确地提取出来。
    3. 图(c ):对图像进行开操作,可以产生对整个图像背景的合理估计。
    4. 图(d) :把图(c )从原始图像中减去,生成一幅拥有合适的均勾背景的米粒图像.
    5. 图(e):显示了新的经阈值处理后的图像。注意,改进效果超过了图 (b)。

    粒度测定 :

    颗粒分析:形态学技术可以用与间接地度量颗粒的大小分布,但不能准确地识别每一个颗粒。对于形状规则且亮于背景大的颗粒,基本方法是应用不断增大尺寸的形态学开运算。

    f = imread('D:\数字图像处理\第九章学习\Fig0926(a).tif');
    sumpixels=zeros(1,36);  
    for k=0:35  
        se=strel('disk',k);  
        fo=imopen(f,se);  
        sumpixels(k+1)=sum(fo(:));  
    end    
    %可以看到,连续开运算之间的表面积会减少  
    plot(0:35,sumpixels),xlabel('k'),ylabel('surface area');  
    title('(a)表面积和结构元素半径之间的关系');  
    figure,plot(-diff(sumpixels));%diff()函数为差分或者近似倒数,即相邻2个之间的差值  
    xlabel('k'),ylabel('surface area reduction');  
    title('(b)减少的表面积和结构元素半径之间的关系'); 
    

    分析

    1. (a)连续开运算之间的表面积会减小。
    2. (b)图峰值表明出现了大量的有着这种半径的对象。

    6.3 重建

    重建

    1. h极小值变换:标记图像是由掩膜挑选ing减去常量所得。
    2. 开运算重建:先腐蚀后重建。
    3. 闭运算重建:对图像求补、计算其开操作重建并对结果求补。

    重建移去复杂的背景

    f = imread('D:\数字图像处理\第九章学习\Fig0930(a).tif');
    subplot(3,3,1),imshow(f);  
    title('(a)原图像');    
    f_obr=imreconstruct(imerode(f,ones(1,71)),f);  
    subplot(3,3,2),imshow(f_obr);  
    title('(b)重建的开操作');   
    f_o=imopen(f,ones(1,71));    
    subplot(3,3,3),imshow(f_o);  
    title('(c)开操作');    
    f_thr=imsubtract(f,f_obr);    %顶帽重构
    subplot(3,3,4),imshow(f_thr);  
    title('(d)重建的顶帽操作');  
    f_th=imsubtract(f,f_o)    %标准顶帽运算,方便比较
    subplot(3,3,5),imshow(f_th);  
    title('(e)顶帽操作');  
    g_obr=imreconstruct(imerode(f_thr,ones(1,11)),f_thr);  
    subplot(3,3,6),imshow(g_obr);  
    title('(f)用水平线对(b)经开运算后重建图');   
    g_obrd=imdilate(g_obr,ones(1,2));  
    subplot(3,3,7),imshow(g_obrd);  
    title('(g)使用水平线对(f)进行膨胀');  
    f2=imreconstruct(min(g_obrd,f_thr),f_thr);  
    subplot(3,3,8),imshow(f2);  
    title('(h)最后的重建结果');  
    

    在这里插入图片描述
    分析

    为了消除每个键盘上方的水平反射光,利用这些反射比图像中任何文本字符都要宽的这个事实。用长水平线的结构元执行重建的开操作,重建的开操作(f_obr) 显示于图(b)中。为了进行对比,图(c )显示了标准的开操作 (f_o) 。重建的开操作在提取水平的相邻键之间的背景方面的确较好。从原始图像中减去重建的开操作被称为顶帽重建 , 结果示于图 (d)中。消除图 (d)中键右边的垂直反射光。这可以通过用短的水平线执行重建的开操作来完成,在这个结果中(见图 (f)),垂直的反射光不见了。但是,包括字母的垂直的细笔画也不见了。我们利用了那些已被错误消除的字母非常接近第一次膨胀(见图 (g))后还存在的其他字符这一事实,以 f_thr 作为模板,以 min(g_obrd,f_thr) 作为标记,图 (h)显示了最后的结果。注意,背景上键盘的阴影和反射光都成功去除了。

    展开全文
  • 数字图像处理中的形态学

    千次阅读 2013-06-26 10:16:08
     数字图像处理中的形态学 (摘自某文献,因为贴图的数目有限制,后面的公式图片没有能够上,电脑重装后文档已经找不... 数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的

     转载自:http://blog.csdn.net/sunny3106/article/details/1745485

                      数字图像处理中的形态学

    (摘自某文献,因为贴图的数目有限制,后面的公式图片没有能够上,电脑重装后文档已经找不到了,囧)

    一    引言
            数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了基于数学形态学的图像处理系统。1982年出版的专著《Image Analysis and Mathematical Morphology》是数学形态学发展的重要里程碑,表明数学形态学在理论上趋于完备及应用上不断深入。数学形态学蓬勃发展,由于其并行快速,易于硬件实现,已引起了人们的广泛关注。目前,数学形态学已在计算机视觉、信号处理与图像分析、模式识别、计算方法与数据处理等方面得到了极为广泛的应用。
            数学形态学可以用来解决抑制噪声、特征提取、边缘检测、图像分割、形状识别、纹理分析、图像恢复与重建、图像压缩等图像处理问题。该文将主要对数学形态学的基本理论及其在图像处理中的应用进行综述。

    二    数学形态学的定义和分类
            数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。

    (1)二值形态学
            数学形态学中二值图像的形态变换是一种针对集合的处理过程。其形态算子的实质是表达物体或形状的集合与结构元素间的相互作用,结构元素的形状就决定了这种运算所提取的信号的形状信息。形态学图像处理是在图像中移动一个结构元素,然后将结构元素与下面的二值图像进行交、并等集合运算。
            基本的形态运算是腐蚀和膨胀。
            在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用B(x)代表结构元素,对工作空间E中的每一点x,腐蚀和膨胀的定义为:
          
            用B(x)对E进行腐蚀的结果就是把结构元素B平移后使B包含于E的所有点构成的集合。用B(x)对E进行膨胀的结果就是把结构元素B平移后使B与E的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。
            可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。

    (2)灰度数学形态学
            二值数学形态学可方便地推广到灰度图像空间。只是灰度数学形态学的运算对象不是集合,而是图像函数。以下设f(x,y)是输入图像,b(x,y)是结构元素。用结构元素b对输入图像y进行膨胀和腐蚀运算分别定义为:

    对灰度图像的膨胀(或腐蚀)操作有两类效果:
    (1)如果结构元素的值都为正的,则输出图像会比输入图像亮(或暗);
    (2)根据输入图像中暗(或亮)细节的灰度值以及它们的形状相对于结构元素的关系,它们在运算中或被消减或被除掉。灰度数学形态学中开启和闭合运算的定义与在二值数学形态学中的定义一致。用b对f进行开启和闭合运算的定义为:

    (3)模糊数学形态学
            将模糊集合理论用于数学形态学就形成了模糊形态学。模糊算子的定义不同,相应的模糊形态运算的定义也不相同。在此,选用Shinba的定义方法。模糊性由结构元素对原图像的适应程度来确定。用有界支撑的模糊结构元素对模糊图像的腐蚀和膨胀运算按它们的隶属函数定义为:

     

    其中,x,y∈Z2代表空间坐标,ua,ub分别代表图像和结构元素的隶属函数。从(7),(8)式的结果可知,经模糊形态腐蚀膨胀运算后的隶属函数均落在[0,1]的区间内。模糊形态学是传统数学形态学从二值逻辑向模糊逻辑的推广,与传统数学形态学有相似的计算结果和相似的代数特性。模糊形态学重点研究n维空间目标物体的形状特征和形态变换,主要应用于图像处理领域,如模糊增强、模糊边缘检测、模糊分割等。

     

    三 数学形态学在图像处理中的主要应用

    近年来,数学形态学在图像处理方面得到了日益广泛的应用。下面主要就数学形态学在边缘检测、图像分割、图像细化以及噪声滤除等方面的应用做简要介绍。

    (1)       边缘检测

    边缘检测是大多数图像处理必不可少的一步,提供了物体形状的重要信息。对于二值图像,边缘检测是求一个集合A的边界,记为B(A):

     

    对于灰度图像,边缘检测是求一幅图像的形态学梯度,记为g:

    数学形态学运算用于边缘检测,存在着结构元素单一的问题。它对与结构元素同方向的边缘敏感,而与其不同方向的边缘(或噪声)会被平滑掉,即边缘的方向可以由结构元素的形状确定。但如果采用对称的结构元素,又会减弱对图像边缘的方向敏感性。所以在边缘检测中,可以考虑用多方位的形态结构元素,运用不同的结构元素的逻辑组合检测出不同方向的边缘。

    梁勇等人构造了8个方向的多方位形态学结构元素,应用基本形态运算,得到8个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。

     

    (2)       图像分割

    基于数学形态学的图像分割算法是利用数学形态学变换,把复杂目标X分割成一系列互不相交的简单子集X1,X2,…,XN,即:

    对目标X的分割过程可按下面的方法完成:首先求出X的最大内接“圆”X1,然后将X1从X中减去,再求X-X1的最大内接“圆”X2,…,依此类推,直到最后得到的集合为空集为止。下面以二值图像为例,介绍用数学形态学方法求解子集X1,X2,…,XN的过程。

    设B为结构元素,B可以是圆、三角形、正方形等简单的几何基元,那么“简单”形状集合Xi可以用下面的公式来定义:

    式中ni为一整数,用上式定义Xi分割目标,有时会产生分割过程不唯一的现象。为此可采用下面公式来定义简单集合Xi

    其中Li为一个点或一条线,当Li为点时,则与(12)式定义等价。(13)式定义的简单形状Xi可由niB沿线Li移动而产生。即将“产生器”niB的中心沿“脊骨”Li移动产生。如果niB为圆,则得到的Xi称Blum带。它具有一些特殊的性质,如Xi的边界是光滑的,Xi的最大圆与其边界相切,Xi的脊骨与产生器都是唯一的等等。

    有了简单形状集合Xi的定义,则目标X可按下面方法分割。首先按式(14)求出X的最大内切结构元素Xi

    数学形态学用于图像分割的缺点是对边界噪声敏感。为了改善这一问题,刘志敏等人提出了基于图像最大内切圆的数学形态学形状描述图像分割算法和基于目标最小闭包结构元素的数学形态学形状描述图像分割算法,并使用该算法对二值图像进行了分割,取得了较好的效果。邓世伟等人提出一种基于数学形态学的深度图像分割算法。作者首先利用形态学算子获得分别含有阶跃边缘与屋脊边缘的凸脊和凹谷图像,然后利用控制区域生长过程得到最终的分割结果。与传统方法相比,该方法速度快,抗噪性能好。

     

    (3)       形态骨架提取

    形态骨架描述了物体的形状和方向信息。它具有平移不变性、逆扩张性和等幂性等性质,是一种有效的形状描述方法。二值图像A的形态骨架可以通过选定合适的结构元素B,对A进行连续腐蚀和开启运算来求取,设S(A)代表A的骨架,定义为:

    蒋刚毅等人运用数学形态学方法,对交通标志的内核形状提取形态骨架函数,将其作为用于模式匹配的形状特征。A的形态骨架函数SKF(A)表示为:

    SKF(X)中值较大的点对应大的n,并代表了形态骨架的主要成分,即表达了形状的主体结构;而SKF(X)中值较小的点对应小的n,是形态骨架的细节成分,与形状的边缘信息相联系。

    形态骨架函数完整简洁地表达了形态骨架的所有信息,因此,根据形态骨架函数的模式匹配能够实现对不同形状物体的识别。算法具有位移不变性,因而使识别更具稳健性。

     

    (4)       噪声滤除

    对图像中的噪声进行滤除是图像预处理中不可缺少的操作。将开启和闭合运算结合起来可构成形态学噪声滤除器。

    对于二值图像,噪声表现为目标周围的噪声块和目标内部的噪声孔。用结构元素B对集合A进行开启操作,就可以将目标周围的噪声块消除掉;用B对A进行闭合操作,则可以将目标内部的噪声孔消除掉。该方法中,对结构元素的选取相当重要,它应当比所有的噪声孔和噪声块都要大。

    对于灰度图像,滤除噪声就是进行形态学平滑。实际中常用开启运算消除与结构元素相比尺寸较小的亮细节,而保持图像整体灰度值和大的亮区域基本不变;用闭合运算消除与结构元素相比尺寸较小的暗细节,而保持图像整体灰度值和大的暗区域基本不变。将这两种操作综合起来可达到滤除亮区和暗区中各类噪声的效果。同样的,结构元素的选取也是个重要问题。

     

    四 选取结构元素的方法

    分析表明,各种数学形态学算法的应用可分解为形态学运算和结构元素选择两个基本问题,形态学运算的规则已由定义确定,于是形态学算法的性能就取决于结构元素的选择,亦即结构元素决定着形态学算法的目的和性能。因此如何自适应地优化确定结构元素,就成为形态学领域中人们长期关注的研究热点和技术难点。目前较多采用多个结构元素对图像进行处理的方法。

     

    (1)       多结构元素运算

    在许多形态学应用中,往往只采用一个结构元素,这通常不能产生满意的结果。在模式识别中,如果要提取某个特定的模式,只采用一个结构元素,那么,只有与结构元素形状、大小完全相同的模式才能被提取,而与此结构元素表示的模式即使有微小差别的其他模式的信息都不能获取。

    解决此问题的一个有效方法之一就是将形态学运算与集合运算结合起来,同时采用多个结构元素,分别对图像进行运算,然后将运算后的图像合并起来,即多结构元素形态学运算。

     

    (2)       用遗传算法选取结构元素

    遗传算法的思想来源于自然界物竞天择、优胜劣汰、适者生存的演化规律和生物进化原理,并引用随机统计理论而形成,具有高效并行全局优化搜索能力,能有效地解决机器学习中参数的复杂优化和组合优化等难题。

    近年来不少国外学者已进行了这方面的探索与研究,Ehrgardt设计了形态滤波的遗传算法,用于二值图像的去噪和根据二值纹理特性消除预定目标;Huttumen利用遗传算法构造了软式形态滤波器及其参数优化的设计方法,以实现灰度图像的降噪功能。余农、李予蜀等人用遗传算法在自然景象的目标检测与提取方面进行了研究,通过自适应优化训练使结构元素具有图像目标的形态结构特征,从而赋予结构元素特定的知识,使形态滤波过程融入特有的智能,以实现对复杂变化的图像具有良好的滤波性能和稳健的适应能力。其实质是解决滤波器设计中知识获取和知识精炼的机器学习问题。

     

    五 数学形态学存在的问题与进一步的研究方向

    数学形态学是一门建立在集论基础之上的学科,是几何形状分析和描述的有力工具。近年来,数学形态学在数字图像处理、计算机视觉与模式识别等领域中得到了越来越广泛的应用,渐渐形成了一种新的数字图像分析方法和理论,引起了国内外相关领域研究人员的广泛关注。目前,数学形态学存在的问题及研究方向主要集中在以下几个方面:

    (1)            形态运算实质上是一种二维卷积运算,当图像维数较大时,特别是用灰度形态学、软数学形态学、模糊形态学等方法时,运算速度很慢,因而不适于实时处理。

    (2)            由于结构元素对形态运算的结果有决定性的作用,所以,需结合实际应用背景和期望合理选择结构元素的大小与形状。

    (3)             软数学形态学中关于结构元素核心、软边界的定义,及对加权统计次数*的选择也具有较大的灵活性,应根据图像拓扑结构合理选择,没有统一的设计标准。

    (4)           为达到最佳的滤波效果,需结合图像的拓扑特性选择形态开、闭运算的复合方式。

    (5)            对模糊形态学,不同的模糊算子会直接影响模糊形态学的定义及其运算结果。

    (6)           有待进一步将数学形态学与神经网络、模糊数学结合研究灰度图像、彩色图像的处理和分析方法。

    (7)            有待进一步研究开发形态运算的光学实现及其它硬件实现方法。

    (8)            有待将形态学与小波、分形等方法结合起来对现有图像处理方法进行改进,进一步推广应用。所以如何实现灰度形态学、软数学形态学、模糊软数学形态学的快速算法,如何改善形态运算的通用性,增强形态运算的适应性,并结合数学形态学的最新应用进展,将其应用到图像处理领域,丰富和发展利用数学形态学的图像处理与分析方法,成为数学形态学今后的发展方向。

     

    六 结论

    数学形态学对图像的处理具有直观上的简明性和数学上的严谨性,在定量描述图像的形态特征上具有独特的优势,为基于形状细节进行图像处理提供了强有力的手段。建立在集合理论基础上的数学形态学,主要通过选择相应的结构元素采用膨胀、腐蚀、开启、闭合#种基本运算的组合来处理图像。数学形态学在图像处理中的应用广泛,有许多实用的算法,但在每种算法中结构元素的选取都是一个重要的问题。

     

    展开全文
  • 数字图像处理技术当中,形态学分析技术是指运用数字形态学方法作为工具,待处理的图片我们一般针对二值化图像,从这种图片中来获取信息,比如图片的形态特征和一些数学形态轮廓等有目标性质的区域,例如物体之间的...
  • 形态学图像处理

    万次阅读 多人点赞 2016-12-31 16:17:01
    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质〈最具区分能力-...
  • 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换...
  • 图像处理中的形态学(一)

    千次阅读 2017-04-14 20:56:28
     数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果上,将数学形态学引入图像处理领域,并研制了...
  • 图像处理 形态学操作

    千次阅读 2018-07-16 16:02:35
    基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等。注意:腐蚀和膨胀是对白色...
  •  数学形态学(Mathematical morphology)是一门 建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀和膨胀、开运算和闭运算、骨架抽取、极限腐蚀、击中击不中变换...
  • 文章目录形态学图像处理1 膨胀和腐蚀1.1 膨胀1.2 腐蚀2 开操作和闭操作 形态学图像处理 数学形态学的语言是集合论。它为大量的图像处理问题提供了一种一致的有力方法。数学形态学中的集合表示图像中的不同对象。 ...
  • 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换...
  •  数学形态学(Mathematical morphology)是一门建立在格论和拓朴学基础上的图像分析学科,是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算,骨架抽取、极限腐蚀、击中击不中变换...
  • 图像形态学处理

    千次阅读 2019-07-12 11:02:17
    Matlab DIP(瓦)ch9形态学图像处理 本章的练习主要是形态学的一些基本概念和技术,这些构成了一组提取图像特征的有力工具,针对二值图像和灰度图像的腐蚀、膨胀和重构的基本操作可以组合使用,以执行非常宽泛的任务...
  • 数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感...
  • 【数字图像处理】4.1:灰度图像-形态学处理  发表于 2015-01-05 | 分类于 DIP | 评论数: 0 | 阅读次数: 498 Abstract: 数字图像处理:第14天Keywords: 形态学,腐蚀,膨胀,开闭操作 本文最初发表...
  • 14. 图像形态学操作

    万次阅读 2017-05-06 14:12:26
    数学形态学的数学基础是集合论,因此数学形态学有完备的数学基础,这位数学形态学用于图像分析处理奠定了坚实的基础。数学形态学运算是由一组形态学的代数运算子组成,其基本思想是用具有一定形态的结构元素找到...
  •  数学形态学(Mathematical morphology)是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。(简单理解:形态学是基于形状的一系列图像处理操作)  基本运算...
  • 目录 1 图像开运算(先腐蚀,后膨胀) ...前面介绍了 形态学处理——图像腐蚀与图像膨胀,图像膨胀会扩大一幅图像的组成部分,而图像腐蚀会缩小一幅图像的组成部分。下面将继续介绍形态学处理中的开...
  • 形态学图像处理(一)基础知识(1)集合论中的基本概念(2)二值图像、集合及逻辑算子(二)膨胀与腐蚀(1)膨胀(2)结构元的分解(3)strel函数(4)腐蚀(三)膨胀与腐蚀的结合(1)开操作和闭操作(2)击中和或...
1 2 3 4 5 ... 20
收藏数 11,319
精华内容 4,527
关键字:

图像处理形态学分析