《OpenCV图像处理论文》图像的腐蚀与膨胀【摘要】学形态学在数字图像处理领域中的应用越来越广泛,各种形态结构和算法不断涌现.数学形态学以集合运算为基础,其基本思想是用具有一定形态的结构元去度量图像中的形态以解决理解问题.该文利用细胞神经网络(CNN),运用数学形态滤波适时、并行完成各种数学形态运算.文中给出了有关CNN的全局和局部稳定状态的定理,证明CNN在一定的条件下可以通过动态过程的稳定达到数学形态滤波的结果.将其结果运用在煤矿井下煤仓图像的预处理当中,取得了满意的结果。简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀(Erosion与Dilation)。他们的运用广泛:消除噪声;分割(isolate)独立的图像元素,以及连接(join)相邻的元素;寻找图像中的明显的极大值区域或极小值区域。【关键词】数学形态学腐蚀算法膨胀算法灰度图图像去噪【研究名称】图像的腐蚀与膨胀【研究目的】为了解决传统去噪方法对灰度图像效果不佳的问题,采用形态学算法中的腐蚀与膨胀算法,设计了不同的结构元,以应对不同的噪声。传统的腐蚀膨胀算法会在一定程度上改变图像,为消除这一影响,在该算法基础上又设计了一种对比采样的方法,将原图与初步处理过的图像进行对比,得到最终图像。结果表明:此方法能够在基本不改变原图的情况下有效地除去噪声。并且进一步学习OpenCV的使用;了解并使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀。【研究内容】学习OpenCV的两种最基本的形态学操作,腐蚀和膨胀的基本原理;对输入的图片进行腐蚀(Erosion)和膨胀(Dilation)操作。进行膨胀操作时,此操作将图像与任意形状的内核(),通常为正方形或圆形,进行卷积。内核有一个可定义的锚点,通常定义为内核中心点。进行膨胀操作时,将内核划过图像,将内核覆盖区域的最大相素值提取,并代替锚点位置的相素;腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。进行腐蚀操作时,将内核划过图像,将内核覆盖区域的最小相素值提取,并代替锚点位置的相素,以与膨胀相同的图像作为样本,我们使用腐蚀操作。【研究原理】形态学操作就是基于形状的一系列处理操作,通过结构元素作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀,用于消除噪声;分个独立的图像元素,以及连接相邻的元素;寻找图像中的明显的极大值区域或极小值区域。装载图片,创建两个显示窗口,一个用于腐蚀输出,一个用于膨胀输出,为每个操作创建两个Trackbars:第一个trackbar”Element”返回erosion_elem或者dilation_elem;第一个trackbar”Kernelsize”返回erosion_size或者dilation_size,每次移动标尺,用户函数Erosion和Dilation就会被调用,函数将根据前的trackbar位置更新输出图像。【步骤】形态学操作¶简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀(Erosion与Dilation)。他们的运用广泛:消除噪声分割(isolate)独立的图像元素,以及连接(join)相邻的元素。寻找图像中的明显的极大值区域或极小值区域。通过以下图像,我们简要来讨论一下膨胀与腐蚀操作(译者注:注意这张图像中的字母为黑色,背景为白色,而不是一般意义的背景为黑色,前景为白色):膨胀¶此操作将图像与任意形状的内核(),通常为正方形或圆形,进行卷积。内核有一个可定义的锚点,通常定义为内核中心点。进行膨胀操作时,将内核划过图像,将内核覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展”(因此有了术语膨胀dilation)。对上图采用膨胀操作我们得到:背景(白色)膨胀,而黑色字母缩小了。腐蚀¶腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。进行腐蚀操作时,将内核划过图像,将内核覆盖区域的最小相素值提取,并代替锚点位置的相素。以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。【研究结果】【结论】通过本次课题实践,我再一次学到了一种图像处理的方法,了解并使用OpenCV提供的两种最基本的形态学操作,腐蚀与膨胀及腐蚀和膨胀的基本原理,学习对输入的图片进行腐蚀(Erosion)和膨胀(Dilation)操作,形态学操作就是基于形状的一系列处理操作,通过结构元素作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀,用于消除噪声;分个独立的图像元素,以及连接相邻的元素;寻找图像中的明显的极大值区域或极小值区域。我熟悉了对图片的腐蚀与膨胀的的操作和具体代码,写代码期间遇到过很多问题,通过查阅书籍和资料都一一改正了过来,总之,代码还是不太熟悉,还有待于进一步提高。【参考文献】[1]opencv.pdf,西安:西安工业大学出版社,2010年。[2]于仕琪,刘瑞祯,学习OpenCV北京:清华大学出版社,2009。[3]《计算机视觉与opencv简明教程》西安:未央出版社,2013年。源程序:#includestdafx.h#includeopencv2/imgproc/imgproc.hpp#includeopencv2/highgui/highgui.hpp#includehighgui.h#includestdlib.h#includestdio.husingnamespacestd;usingnamespacecv;Matsrc,erosion_dst,dilation_dst;interosion_elem=0;interosion_size=0;intdilation_elem=0;intdilation_size=0;intconstmax_elem=2;intconstmax_kernel_size=21;voidErosion(int,void*);voidDilation(int,void*);intmain(intargc,char**argv){src=imread(li.jpg);if(!src.data){return-1;}namedWindow(ErosionDemo,CV_WINDOW_AUTOSIZE);namedWindow(DilationDemo,CV_WINDOW_AUTOSIZE);cvMoveWindow(DilationDemo,src.cols,0);createTrackbar(Element:\n0:Rect\n1:Cross\n2:Ellipse,ErosionDemo,&erosion_elem,max_elem,Erosion);createTrackbar(Kernelsize:\n2n+1,ErosionDemo,&erosion_size,max_kernel_size,Erosion);createTrackbar(Element:\n0:Rect\n1:Cross\n2:Ellipse,DilationDemo,&dilation_elem,max_elem,Dilation);createTrackbar(Kernelsize:\n2n+1,DilationDemo,&dilation_size,max_kernel_size,Dilation);Erosion(0,0);Dilation(0,0);waitKey(0);return0;}voidErosion(int,void*){interosion_type;if(erosion_elem==0){erosion_type=MORPH_RECT;}elseif(erosion_elem==1){erosion_type=MORPH_CROSS;}elseif(erosion_elem==2){erosion_type=MORPH_ELLIPSE;}Matelement=getStructuringElement(erosion_type,Size(2*erosion_size+1,2*erosion_size+1),Point(erosion_size,erosion_size));erode(src,erosion_dst,element);imshow(EerosionDemo,erosion_dst);}voidDilation(int,void*){intdilation_type;if(dilation_elem==0){dilation_type=MORPH_RECT;}elseif(dilation_elem==1){dilation_type=MORPH_CROSS;}elseif(dilation_elem==2){dilation_type=MORPH_ELLIPSE;}Matelement=getStructuringElement(dilation_type,Size(2*dilation_size+1,2*dilation_size+1),Point(dilation_size,dilation_size));erode(src,dilation_dst,element);imshow(DilationDemo,dilation_dst);}