图像处理基本算法-形态学

形态学一般是使用二值图像,进行边界提取,骨架提取,孔洞填充,角点提取,图像重建。

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

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

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

一    引言
        数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到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个方向的边缘检测结果,再把这些结果进行归一化运算、加权求和,得到最终的图像边缘。该算法在保持图像细节特征和平滑边缘等方面,取得了较好的效果。

边缘检测源代码:

/********************************************************************
形态学基本操作采用二值图像 
***********************************************************************/
#include<cv.h>
#include <highgui.h>
int main(){IplImage * image,*image2,*image3;image = cvLoadImage("E:\\image\\mapleleaf.tif", 0);cvNamedWindow("image",1);cvShowImage("image",image);/*边界提取*/image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);int  i , j ;int left,right, up , down;int n = 2;//窗口大小为5*5int r,s,flag;unsigned char * ptr, *dst;for (i = 0 ; i< image->height; i++){for (j = 0 ; j< image->width; j++){//窗口设定left = j - n;right = j +n;up = i -n;down = i+n;//窗口出界处理if(left< 0){left = 0;}if(right >= image->width){right = image->width-1;}if(up< 0){up =0;}if(down >= image->height){down = image->height -1;}//腐蚀处理dst = (unsigned char *)image2->imageData + image2->widthStep*i + j;flag = 1;for (r = up;r <= down;r++){for (s = left ; s<= right; s++){ptr = (unsigned char *)image->imageData + r*image->widthStep + s;if(*ptr != 255){flag = 0;}}}if (flag == 1){*dst = 255;}else{*dst = 0;}}}cvSub(image,image2,image3,0);cvNamedWindow("image3",1);cvShowImage("image3",image3);cvSaveImage("mapleleafboard.bmp", image3);cvWaitKey(0);cvReleaseImage(&image);cvReleaseImage(&image2);cvReleaseImage(&image3);cvDestroyAllWindows();return 0 ;
}
原图:



边界提取:


 

(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,是形态骨架的细节成分,与形状的边缘信息相联系。

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

 骨架提取原代码:

/************************************************************************/
/* 骨架提取*/
/************************************************************************/
#include<cv.h>
#include <highgui.h>
int main(){IplImage* image = cvLoadImage("E:\\image\\bone.tif",0);cvNamedWindow("image",1);cvNamedWindow("image2",1);cvNamedWindow("image3",1);cvNamedWindow("image4",1);cvNamedWindow("image5",1);cvNamedWindow("image6",1);cvNamedWindow("result",1);cvShowImage("image", image);//cvWaitKey(0);//当前图片image2  当前被腐蚀后的图片image3 被腐蚀开操作之后的图片 image5 //image4 作为开操作的中间值 作差后的图片image6  并之后的图片result  IplImage *image2, *image3 , *image4, *image5,*image6,*result;image2 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);image3 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);image5 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);image4 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);image6 = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);result = cvCreateImage(cvSize(image->width,image->height),IPL_DEPTH_8U,1);//循环标志 flagbool flag = true;//腐蚀判断标志 flag2bool flag2  = true;int i,j,r,s;unsigned char * ptr,*dst;unsigned char B[9] = {255 ,255,255,255,255,255,255,255,255};//对result进行赋值 全部为0 for (i = 0 ; i< result->height; i++){for (j = 0 ; j< result->width ; j++){dst = (unsigned char *)(result->imageData + result->widthStep *i +j);*dst = 0;}}image2 = cvCloneImage(image);cvShowImage("image2", image2);//cvWaitKey(0);while (flag){//flag = false;cvShowImage("image2",image2);//进行腐蚀操作,开环操作 作差 并for (i = 0 ; i< image3->height; i++){for (j = 0 ; j< image3->width ; j++){dst =  (unsigned char *)(image3->imageData + i*image3->widthStep + j);if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 )){*dst = 0;//break;}else{flag2 = true;for (r = i-1 ; r<= i+1 ; r++){for (s = j -1 ; s<= j+1 ; s++){ptr  = (unsigned char *)(image2->imageData + r*image2->widthStep + j);if(*ptr != 255){flag2 =false;}}}if (flag2){*dst = 255;}else {*dst = 0;}}}}cvShowImage("image3",image3);//开操作 先腐蚀 后膨胀 for (i = 0 ; i< image4->height; i++){for (j = 0 ; j< image4->width ; j++){dst =  (unsigned char *)(image4->imageData + i*image4->widthStep + j);if ((i == 0 )|| (j == 0) ||( i == image->height -1 ) || (j == image->width -1 )){*dst = 0;//break;}else{flag2 = true;for (r = i-1 ; r<=  i+1 ; r++){for (s = j -1 ; s<= j+1 ; s++){ptr  = (unsigned char *)(image3->imageData + r*image3->widthStep + s);if(*ptr != 255){flag2 =false;}}}if (flag2){*dst = 255;}else {*dst = 0;}}}}cvShowImage("image4",image4);//膨胀操作for (i = 0 ; i< image5->height; i++){for (j = 0 ; j< image5->width ; j++){dst =  (unsigned char *)(image5->imageData + i*image5->widthStep + j);if ((i == 0 )|| (j == 0) ||( i == image5->height -1 ) || (j == image5->width -1 )){*dst = 0;//break;}else{flag2 = false;for (r = i-1 ; r<= i+1 ; r++){for (s = j -1 ; s<= j+1 ; s++){ptr  = (unsigned char *)(image4->imageData + r*image4->widthStep + s);if(*ptr == 255){flag2 = true;}}}if (flag2){*dst = 255;}else {*dst = 0;}}}}cvShowImage("image5",image5);//作差cvSub(image3,image5,image6,0);//并运算for (i = 0 ; i< result->height; i++){for (j = 0 ; j< result->width ; j++){dst = (unsigned char *)(result->imageData + result->widthStep *i +j);ptr = (unsigned char *)(image6->imageData + image6->widthStep *i +j);if (*ptr == 255){*dst = 255;}}}cvShowImage("image6",image6);//将腐蚀后的图像复制给当前图像image2image2 =  cvCloneImage(image3);//循环标志判定flag = false;for (i = 0 ; i< image2->height; i++){for (j = 0 ; j< image2->width ; j++){ptr = (unsigned char *)(image2->imageData + image2->widthStep *i +j);if (*ptr == 255){flag = true;}}}cvShowImage("result", result);cvWaitKey(40);}cvShowImage("image2", image2);cvShowImage("image3", image3);//cvShowImage("image4", image4);//cvShowImage("image5", image5);//cvShowImage("image6", image6);cvShowImage("result",result);cvSaveImage("E:\\image\\bonegujia.bmp",result);cvWaitKey(0);cvReleaseImage(&image);cvDestroyAllWindows();return 0;
}

原图:


提取的骨架:


DNA原图:


骨架:


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




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

/********************************************************************
形态学基本操作采用二值图像 形态学方法在边界获取和形状检测中有很多应用 寻找角点
***********************************************************************/
#include<cv.h>
#include <highgui.h>
int main(){IplImage * image,*image2,*image3,*image4,*result;image = cvLoadImage("E:\\image\\jiaodian.bmp", 0);cvNamedWindow("image",1);cvShowImage("image",image);/*击中击不中变换 寻找角点*/ /************************************************************************//*   最终结果为(79, 85 )和 (129 ,134)两个符合要求的角点  在结果图像中可以看到两个白点*//************************************************************************/image2 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);image3 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);image4 = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);result = cvCreateImage(cvSize(image->width, image->height),image->depth ,1);int  i,j,r,s ;unsigned char B1[9] ={ 255,255,255,255,0,0,255,0,0};unsigned char B2[9] = {0,0,0,0,255,255,0,255,255 };int flag;
//iamge2 是对image进行求补的结果unsigned char *ptr, *dst,*ptr2;for (i = 0 ; i< image2->height; i++){for (j = 0 ; j< image2->width; j++){ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;dst = (unsigned char*)image2->imageData + i*image2->widthStep + j;*dst = 255- (*ptr);}}//对源图像进行腐蚀for (i = 0 ; i< image3->height; i++){for (j = 0 ; j< image3->width; j++){flag = 1;dst = (unsigned char*)image3->imageData + i*image3->widthStep +j;//边界判断if (( i == 0) || (j == 0) || (i == image3->height-1) || (j == image3->width -1 )){*dst = 0;}else{for (r = i -1 ; r<= i+1; r++){for (s = j-1 ; s <= j +1 ; s++){ptr = (unsigned char*)image->imageData + r * image->widthStep+ s;if (*ptr != B1[3*(r-i+1) + s-j+1]){flag = 0;break;}}}if (flag == 1){ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;*dst = 255;}else{*dst = 0;}}}}//显示腐蚀结果for (i = 0 ; i< image2->height; i++){for (j = 0 ; j< image2->width; j++){ptr = (unsigned char*)image->imageData + i * image->widthStep+ j;ptr2 = (unsigned char*)image3->imageData + i*image3->widthStep + j;if (*ptr2  == 255){printf("x, %d  y: %d   %d\n",j, i, *ptr2 - *ptr);}}}//对补图像进行腐蚀for (i = 0 ; i< image4->height; i++){for (j = 0 ; j< image4->width; j++){flag = 1;dst = (unsigned char*)image4->imageData + i*image4->widthStep +j;//边界判断if (( i == 0) || (j == 0) || (i == image4->height-1) || (j == image4->width -1 )){*dst = 0;}else{for (r = i -1 ; r<= i+1; r++){for (s = j-1 ; s <= j +1 ; s++){ptr = (unsigned char*)image2->imageData + r * image2->widthStep+ s;if ((*ptr) != B2[3*(r- i+1) + s-j +1]){flag = 0;}}}if (flag == 1){ptr = (unsigned char*)image2->imageData + i * image2->widthStep+ j;*dst = 255;}else{*dst = 0;}}}}//显示腐蚀结果for (i = 0 ; i< image4->height; i++){for (j = 0 ; j< image4->width; j++){ptr = (unsigned char*)image2->imageData + i * image->widthStep+ j;ptr2 = (unsigned char*)image4->imageData + i*image3->widthStep + j;if (*ptr2  == 255){printf("x, %d  y: %d   %d\n",j,i, *ptr2 - *ptr);}}}//二者求交集for (i = 0 ; i< result->height; i++){for (j = 0 ; j< result->width; j++){ptr = (unsigned char *)image3->imageData + image3->widthStep * i + j;ptr2 = (unsigned char *)image4->imageData + image4->widthStep * i + j;dst = (unsigned char *)result->imageData +  result->widthStep*i + j;if (((*ptr) == 255) && ((*ptr2) == 255)){*dst = 255;printf("x : %d\n" , j);printf("y : %d\n" , i);}else{*dst = 0;}}}cvNamedWindow("image3",1);cvNamedWindow("image4",1);cvNamedWindow("result",1);cvShowImage("image3",image3);cvShowImage("image4",image4);cvShowImage("result",result);//cvSaveImage("mapleleafboard.bmp", image3);cvWaitKey(0);cvReleaseImage(&image);cvReleaseImage(&image2);cvReleaseImage(&image3);cvDestroyAllWindows();return 0 ;
}
原图:


提取的角点:


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

(4)       噪声滤除

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

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

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


 

 

四 选取结构元素的方法

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

 

(1)       多结构元素运算

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

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

 

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

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

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

 

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

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

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

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

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

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

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

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

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

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

 

六 结论

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



转载于:https://www.cnblogs.com/libing64/archive/2012/01/05/2878735.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用kibana客户端工具操作ElasticSearch(增删改查一)

&#xff08;因为ElasticSearch是restful请求所以 get post put delete这四种常见的请求&#xff09; put添加数据 get获取数据 #创建索引库lib 并且对索引库做了分片和备份&#xff08;由于这里是单机的ElasticSearch备份0&#xff09; PUT /lib/ {"settings"…

kibana客户端工具操作ElasticSearch(增删改查二)

#不指定id情况下 ElasticSearch自动生成id PUT /lib/user/ {"first_name":"Douglas","last_name":"Fir","age":23,"about":"I like to build cabinets","interests":["forestry"] …

机器学习笔记(一) : 线性建模——最小二乘法

讨论这个方法之前&#xff0c;先说些题外话。首先&#xff0c;我感觉机器学习是一门值得我们去了解和学习的一门技术&#xff0c;它不仅仅应用于我们的生活&#xff0c;而且不断地在改变着我们的方方面面。虽然很早就已经接触它&#xff0c;并开始学习&#xff0c;但是总体感觉…

ElasticSearch快速入门(一)介绍

Devops运维 ● Node(节点):单个的装有Elasticsearch服务并且提供故障转移和扩展的服务 器。 ●Cluster (集群) :一-个集群就是由一个或多个node组织在一 起&#xff0c;共同工作&#xff0c; 共同分享整个数据具有负载均衡功能的集群。 ● Document (文档) : -一个文档是-一个可…

flash遨游缓存问题

来源&#xff1a;http://leftice.iteye.com/blog/806605 Flash需要和JS交互,但是在ie外壳浏览器下,有时候缓存会导致页面刷新后flash无法工作. 会报出SecurityError. 这是因为Flash并没有完全准备好,就尝试和JS交互导致的问题. 解决的问题方式有几种: 1.在页面上设置不缓存,网上…

ElasticSearch快速入门二(Restful介绍)

本节课从三个方便讲解 什么是restful ? API: Application Programming Interface的缩写&#xff0c;中文意思就是应用程序接口. ●XML: . 可扩展标记语言&#xff0c;是一种程序与程序之间传输数据的标记语言 ●JSON: 英文javascript object notation的缩写&#xff0c;它是一…

ElasticSearch快速入门三(curl命令讲解)

API测试工具_微博开放平台&#xff1a;https://open.weibo.com/tools/console# 感兴趣是可以使用这个工具玩一下restful接口调用&#xff0c;可以更形象的了解restful 下面我们就继续下面的内内容讲解curl命令 什么是CURL&#xff1f; 就是以命令的方式来执行HTTP协议的请求…

ElasticSearch API文档查看

elastic官方API文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

取消Win7关机时的补丁更新

取消Win7关机时的补丁更新作者&#xff1a;三好 阅读&#xff1a; 30037人文&#xff1a;陕西 三好 Windows操作系统一直是在缝缝补补中前行的&#xff0c;Win7也不例外。由于系统自带的更新更安全更可靠&#xff0c;所以好多朋友都喜欢使用&#xff0c;如果将系统默认的“自动…

jdk下载

oracle官网&#xff1a;https://developer.oracle.com/java/ 一直往下拉到最低部 这里选择你需要的历史版本&#xff0c;我就选择 安装就不用我多说了&#xff0c;和以前安装jdk一样安装&#xff0c;配置环境变量

ElasticSearch和solr的对比

关于ES&#xff1a;ElasticSearch是一个事实分布式搜索和分析引擎&#xff0c;使用其可以以前所未有的速度处理大数据&#xff0c;他用于全文搜索、结构化搜索、分析以及将这三者混合使用。维基百科使用ElasticSearch提供全文搜索并高亮关键字&#xff0c;以及输入实时搜索(sea…

ElasticSearch和mysql对比

以员工文档 的形式存储为例&#xff1a;一个文档代表一个员工数据。存储数据到 ElasticSearch 的行为叫做索引&#xff0c;但在索引一个文档之前&#xff0c;需要确定将文档存储在哪里。一个 ElasticSearch 集群可以包含多个 索引&#xff0c;相应的每个索引可以包含多个类型 。…

机器学习笔记(七)——决策树模型

引言 决策树&#xff08;Decision Tree&#xff09;是一种基本的分类和回归方法。它的扩展方法有GBDT和GBRT 等。决策树模型的学习过程主要有特征选择、决策树生成和剪枝。主要算法有ID3、C4.5和CART等。 一、决策树模型 决策树首先是一个树形结构&#xff0c;它包括两种类型…

ElasticSearch获取多个文档Multi GET API介绍

#■同时获取多个文档信息 #■例子:获职index:bank和shakespeare下面 #. I0为1.2.3.4.15.6.28的文档信息 GET /bank/bank_account/1 GET /bank/bank_account/2 GET /shakespcare/line/3 GET /bank/bank_account/4 GET /shakespeare/line/15 #日数组[] GET /_mget {"docs&qu…

Bulk批量操作API的介绍

#多重模式 #批量操作bulk POST /library/books/_bulk {"index": {"_id": 1}} {"title":"Elasticsearch: The Definitive Guide","price":5} {"index": {"_id": 2}} {"title":"The Elast…

elasticsearch内部版本控制

现在我将这个price价格改为10&#xff0c;看下版本有什么变化&#xff1f; 获取一下 返回结果我们知道价格price已经修改为10&#xff0c;_version已经变成2 我们把参数version改成2试试 我们从执行结果可知&#xff0c;我们已经修改成功&#xff0c;并且版本自增为3

最优化学习笔记(三)——梯度下降法

本来这周计划写下逻辑回归的学习笔记&#xff0c;但是其中用到了最优化对数似然函数&#xff0c;因此决定先复习下梯度方法和拟牛顿法。本节先从纯数学的角度总结下梯度下降法。 一、柯西-施瓦茨不等式 对于 Rn中的任意两个向量 x和y&#xff0c; 有&#xff1a; |<x,y&g…

ElasticSearch外部版本控制

#外部版本控制机制| PUT /library/books/1?version5&version_typeexternal {"title": "Elosticsearch: The Definitive Guide" ,"name":{"first" : "Zachary","last" : "Tong"},"publish_dat…

ElasticSearch映射Mapping

1.1 什么是映射 (1) 映射(mapping): 定义index的元数据, 指定要索引并存储的文档的字段类型. 也就是说映射决定了Elasticsearch在建立倒排索引、进行检索时对文档采取的相关策略, 如数字类型、日期类型、文本类型等等. 需要注意的是: 检索时用到的分析策略, 要和建立索引时的分…