图像形态学

图像形态学

  数学形态学是基于集合论的非线性理论,是图像处理领域的一种新理论和新方法。数字图像处理中的形态学处理是指将数字形态学作为工具从图像中提取对于表达和描绘区域形状有用处的图像分量,比如边界、骨架以及凸壳,还包括用于预处理或后处理的形态学过滤、细化和修剪等。图像形态学处理中我们感兴趣的主要是二值图像。其基本思想是用具有一定形态特征的结构元素提取图像中的对应形状,以实现图像分析和识别。与传统的基于线性理论的空域或频域图像处理技术相比,具有不模糊图像边界和细节,对噪声不敏感,提取的图像边缘平滑,骨架较连续,易于并行处理等特点。近年来,基于数学形态学的图像分析和处理方法在国内外得到不断发展,在多门学科中,许多研究者已开始把数学形态方法应用于图像形态特征提取,数学形态学已逐渐发展成为图像处理技术的一个主要研究领域。数学形态学的基本运算有4种:膨胀、腐蚀、开和闭,基于这些基本运算还可以推导和组合成多种数学形态学运算方法,利用这些形态学算子对图像进行形状和结构分析及处理。
 数学形态学在图像处理中的应用主要是:
  ①利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;
  ②描述和定义图像的各种集合参数和特征,例如面积、周长、连通度、颗粒度、骨架和方向性等。
  从某种特定意义上来讲,形态学图像处理是以几何学为基础的。它着重研究图像的几何结构,这种结构表示的可以是分析图像的宏观性质,也可以是微观性质。通过利用一个结构元素去探测一个图像,看是否能够将这个结构元素很好地填放在图像的内部,同时验证填放结构元素的方法是否有效。通过对图像内适合放入结构元素的位置做标记,便可得到图像结构的信息。
  在对裂缝图像提取边缘时,在提取裂缝特征等有用信息的同时,也容易丢掉一些信息,例如,二值图像中,裂缝边缘出现断裂。因此在计算特征参数之前,需要对断裂处进行恢复,同时对多余的噪声加以剔除。


膨胀
  膨胀的作用是把图像区域周围的背景点合并到区域中,其结果是使区域的面积增大相应数量的点。如果结构元素取3x3,则称为简单膨胀,其结果使区域的边界沿周边增加一个像素,如果区域是圆的,则每次膨胀后区域的直径增加两个像素,如果两个物体距离比较近,通过膨胀可能连通在一起。膨胀对填补分割后物体中的空洞很有作用。
 对灰度图像的膨胀操作有两个效果:
  ①如果结构元素的值都为正的,则输出图像会比输入图像亮;
  ②根据输入图像中暗细节的灰度值以及它们的形状相对于结构元素的关系,它们在膨胀中被消减或被滤掉。

腐蚀
 对灰度图像的腐蚀操作有两个效果:
  ①如果结构元素的值都为正的,则输出图像会比输入图像暗;
  ②根据输入图像中亮细节的尺寸比结构元素小,则其影响会被消弱,减弱的程度取决于这些亮细节周围的灰度值和结构元素的形状及幅值。

开启和闭合
  由于膨胀和腐蚀并不是互为逆运算,所以可以将他们结合使用。开启就是先对图像进行腐蚀,然后对腐蚀的图像做膨胀运算;闭合时先对图像做膨胀运算,然后对膨胀运算的结果做腐蚀运算。这两种运算是数学形态学的重要运算。
  开启消除了尺寸较小的亮细节,闭合消除了尺寸较小的暗细节。
  开启运算一般能平滑图像的轮廓,消弱狭窄的部分,去掉细的突出。
  闭合运算也是平滑图像的轮廓,与开启运算相反,它一般能融合窄的缺口和细长的弯口,去掉小洞,填补轮廓上的缝隙。
  通过动手实验可知,开启和闭合运算的效果并不理想,而相反,用膨胀腐蚀效果更加明显,对经过Canny边缘提取的图像多次膨胀腐蚀,可以尽量完整的再现裂缝的原型。

细化
  图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个像素的线条细化成只有一个像素宽,形成“骨架”,形成骨架后能比较容易的分析图像,如提取图像的特征。利用细化技术得到区域的细化结构是常用的方法。寻找二值图像的细化结构是图像处理的一个基本问题。在图像识别,经常要用到这样的细化结构。骨架便是一种细化结构,它是目前的重要拓扑描述,应用非常广泛。
  细化基本思想是“层层剥夺”,即从线条边缘开始一层一层向里剥夺,直到线条剩下一个像素的为止。图像细化大大地压缩了原始图像地数据量,并保持其形状的基本拓扑结构不变,从而为文字识别中的特征抽取等应用奠定了基础。

 细化算法应满足以下条件:
  ① 将条形区域变成一条薄线;
  ② 薄线应位与原条形区域的中心;
  ③ 薄线应保持原图像的拓扑特性。
  细化分成串行细化和并行细化,串行细化即是一边检测满足细化条件的点,一边删除细化点;并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点。
  常用的图像细化算法有hilditch算法、pavlidis算法和rosenfeld算法等(注:进行细化算法前要先对图像进行二值化,即图像中只包含“黑”和“白”两种颜色)。

  由前面所述可知,膨胀可以使图像特征扩大,腐蚀可以使图像特征缩小。膨胀是把裂缝区域周围的背景点合并到裂缝中,补上裂缝,即消除裂缝所有的边界点,使裂缝接近原来的形状。重复对裂缝图像进行膨胀和腐蚀,就可以将断裂的裂缝连接起来,恢复其本来面貌,然后可以利用细化算法,把裂缝细化到单位像素宽。根据单像素的裂缝来计算其长度。
  细化就是从原来的图中去掉一些点,但仍要保持原来的形状,实际上就是保持原图的骨架。数字图像细化,是一种最常见的使用击中/击不中变换的形态学算法。


击中(匹配)或击不中变换
  假设集合A是由3个子集X、Y和Z组成的集合,击中(匹配)的目的是要在A中找到X的位置,设X被包围在一个小窗口W中,与W有关的X的局部背景定义为集合的差(W-X),则X在A内能得到精确拟合位置集合是由X对A的腐蚀后由(W-X)对A的补集Ac腐蚀的交集,这个交集就是要找的位置,用集合B来表示由X和X的背景构成的集合,可以令B=(B1,B2),这里B1=X,B2=(W-X),则在A中对B进行匹配可以表示为:A⊙B(称为形态学上的击中或击不中变换)。

骨架提取
  骨架提取是与细化有关的一种运算,也称为中轴变换或焚烧草技术。中轴是所有与物体在两个或跟到非邻接边界点处相切的圆心的轨迹。但抽骨架很少通过在物体内拟合圆来实现。在概念上,中轴可设想成按如下方式形成:想象一片与物体形状相同的草,沿其外围各点同时点火,火势向内蔓延,向前推进的火线相遇各点的轨迹就是中轴。
  比较细化和骨架抽取可知,它们的效果大体相同,但是细化更容易消除细小的噪声颗粒,故在图像处理的最后,选择细化图像。


OpenCV中的图像形态学
  基本的形态转换是膨胀与腐蚀,它们能实现多种功能:例如消除噪声、分割出独立的图像元素以及在图像中连接相邻的元素。形态学也常被用于寻找图像中的明显的极大值区域或极小值区域以及求出图像的梯度。
腐蚀
void cvErode(//函数 cvErode 对输入图像使用指定的结构元素进行腐蚀,该结构元素决定每个具有最小值象素点的邻域形状(对彩色图像,每个彩色通道单独处理)
  const CvArr* src,//输入图像
  CvArr* dst,//输出图像
  IplConvKernel* element=NULL,//用于腐蚀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
  int iterations=1);//腐蚀的次数
膨胀
void cvDilate(//函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小值象素点的邻域形状(对彩色图像,每个彩色通道单独处理)
  const CvArr* src,//输入图像
  CvArr* dst,//输出图像
  IplConvKernel* element=NULL,//用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
  int iterations=1);//膨胀的次数
自定义核
IplConvKernel* cvCreateStructuringElementEx(//创建结构元素
  int cols,//结构元素的列数目
  int rows,//结构元素的行数目
  int anchor_x,//锚点的相对水平偏移量
  int anchor_y,//锚点的相对垂直偏移量
  int shape,//结构元素的形状
  int* values=NULL);//指向结构元素的指针,它是一个平面数组,表示对元素矩阵逐行扫描。(非零点表示该点属于结构元)。如果指针为空,则表示平面数组中的所有元素都是非零的,即结构元是一个长方形(该参数仅仅当shape参数是 CV_SHAPE_CUSTOM 时才予以考虑)
void cvReleaseStructuringElement(//删除结构元素,如果 *element 为 NULL, 则函数不作用。
  IplConvKernel** element);//被删除的结构元素的指针 
更通用的形态学
void cvMorphologyEx(//高级形态学变换,在膨胀和腐蚀基本操作的基础上,完成一些高级的形态变换
  const CvArr* src,//输入图像
  CvArr* dst,//输出图像
  CvArr* temp,//临时图像,在形态梯度以及对“顶帽”和“黑帽”操作时的 in-place 模式下需要
  IplConvKernel* element,//结构元素
  int operation,//形态操作的类型(开/闭运算、形态梯度、礼帽、黑帽)
  int iterations=1);//膨胀和腐蚀次数
形态操作的类型: 
 CV_MOP_OPEN - 开运算(先腐后膨)
  开运算通常可以用来统计二值图像中的区域数。若已将显微镜载玻片上观察到的细胞图像作了阈值化处理,可以使用开运算将相邻的细胞分离开来,然后再计算图像中的区域(细胞)数目。
 CV_MOP_CLOSE - 闭运算(先膨后腐)
  在大多数好的连通区域分析算法中,都会用到闭运算来去除噪声引起的区域。对于连通区域分析,通常先采用腐蚀或闭运算来消除纯粹由噪声引起的部分,然后用开运算来连接邻近的区域。
  (注意,虽然使用开运算或闭运算的结果与使用腐蚀和膨胀的结果类似,但这两个新的操作能更精确地保存源图像连接的区域。)
  开运算和闭运算操作几乎都是“保留区域”或“面积保持”形式的:最显著的效果是,闭运算消除了低于其邻近点的孤立点,而开运算是消除高于其邻近点的孤立点。
  形态学开运算的结果:去除小的明亮区域,并且剩余的明亮区域被隔绝,但其大小不变。
  形态学闭运算的结果:亮的区域连在一起,但它们基本的大小不变。
  关于开运算和闭运算,最后一点需要说明的是iterations参数的意思。您可能会认为闭操作执行两次,相当于执行膨胀-腐蚀-膨胀-腐蚀。但事实上,这并不是必要的。真正需要的(比且所能得到的)是膨胀-膨胀-腐蚀-腐蚀这样的过程。通过这种方式,不仅是单一的孤立点会消失,而且邻近的孤立点群也会消失。
 CV_MOP_GRADIENT - 形态梯度
  对二值图像进行这一操作可以将团块的边缘突出出来。形态梯度被应用于灰度图,在灰度值变化最剧烈的区域得到的结果数值最大。边缘以高亮区域突出。观察对灰度图像的处理结果,可以获知形态学梯度操作能描述图像亮度变化的剧烈程度;这就是为什么把其称为“形态学梯度”的原因。当我们想突出高亮区域的外围时,通常可使用形态学梯度,这样我们可以把高亮的看成一个整体(或物体的一整部分)。因为从原区域的膨胀中减去了原区域的收缩,所以留下了完整的外围边缘。这与计算梯度有所不同,梯度一般不能获得物体的外围边缘。
 CV_MOP_TOPHAT - "顶帽"
 CV_MOP_BLACKHAT - "黑帽"
  这两个操作分别用于分离比邻近的点亮或暗的一些斑块。当试图孤立的部分相对于其邻近的部分有亮度变化时,就可以使用这两个方法。例如常用与处理有机组织或细胞的显微镜图像。礼帽操作从A中减去了A的开运算。开运算带来的结果是放大裂缝或局部低亮度区域,因此,可以突出比A周围的区域更明亮的区域,并跟核的大小相关;相反地,黑帽操作突出比A的周围的区域暗的区域。

你可能感兴趣的:(植物识别与分离,图像处理,OpenCV,计算机视觉,农业)