数学形态学是法国和德国科学家在研究岩石结构时建立的一门科学。形态学的用途主要是获取物体拓扑和结构信息,通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。在图像处理中的应用主要是:利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;描述和定义图像的各种几何参数和特征,如面积、周长、连通度、颗粒度、骨架和方向性等。
关于形态学的具体描述和数学形式化的定义可以从文章底部的参考资料中获得。
最近的实验中需要对二值图像进行减噪处理,图像形态学中的腐蚀和膨胀能很好的解决此问题。如果在腐蚀和膨胀操作前,对灰度图像做一次滤波,减噪效果将更明显。
腐蚀的具体操作是:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。
膨胀的具体操作是:用一个结构元素(一般是3×3的大小)扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为0,则该像素为0,否则为1。
腐蚀的作用是消除物体边界点,使目标缩小,可以消除小于结构元素的噪声点;膨胀的作用是将与物体接触的所有背景点合并到物体中,使目标增大,可添补目标中的空洞。
开运算是先腐蚀后膨胀的过程,可以消除图像上细小的噪声,并平滑物体边界。
闭运算时先膨胀后腐蚀的过程,可以填充物体内细小的空洞,并平滑物体边界。
以下是一段在OpenCV中实现的C语言程序,分别是图像腐蚀和膨胀函数,输入的参数依次为:当前二值图像数据指针、图像宽度、图像高度。通过这两个函数的组合使用(开闭运算),可以对图像进行有效减噪。
//腐蚀运算 void erosion(uchar* data, int width, int height) { int i, j, index, sum, flag; sum = height * width * sizeof(uchar); uchar *tmpdata = (uchar*)malloc(sum); memcpy((char*)tmpdata, (char*)data, sum); for(i = 1;i < height - 1;i++) { for(j = 1;j < width - 1;j++) { flag = 1; for(int m = i - 1;m < i + 2;m++) { for(int n = j - 1; n < j + 2;n++) { //自身及领域中若有一个为0 //则将该点设为0 if(tmpdata[i * width + j] == 0 || tmpdata[m * width + n] == 0) { flag = 0; break; } } if(flag == 0) { break; } } if(flag == 0) { data[i * width + j] = 0; } else { data[i * width + j] = 255; } } } free(tmpdata); } //膨胀运算 void dilation(uchar* data, int width, int height) { int i, j, index, sum, flag; sum = height * width * sizeof(uchar); uchar *tmpdata = (uchar*)malloc(sum); memcpy((char*)tmpdata, (char*)data, sum); for(i = 1;i < height - 1;i++) { for(j = 1;j < width - 1;j++) { flag = 1; for(int m = i - 1;m < i + 2;m++) { for(int n = j - 1; n < j + 2;n++) { //自身及领域中若有一个为255 //则将该点设为255 if(tmpdata[i * width + j] == 255 || tmpdata[m * width + n] == 255) { flag = 0; break; } } if(flag == 0) { break; } } if(flag == 0) { data[i * width + j] = 255; } else { data[i * width + j] = 0; } } } free(tmpdata); }
注意到腐蚀和膨胀是一个对偶运算,故以上两个函数可以精简成一个函数,并且这样的对偶特性在硬件上也是便于实现的。
Resources & Reference:
1、http://www.docin.com/p-8583366.html
--End--