上一篇文章介绍了空间滤波的线性和非线性滤波,这里给大家介绍形态学滤波,包括腐蚀与膨胀、开闭运算、形态学梯度和顶帽和黑帽。其中膨胀与腐蚀是的最基本的形态学操作,其余的运算都是基于腐蚀和膨胀的。
1. 膨胀(dilate):将图像与核进行卷积,求局部最大值的操作,图像变亮。
关于膨胀函数可以参考:http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=dilate#voiddilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor, intiterations, int borderType, const Scalar& borderValue)
2. 腐蚀(erode):与膨胀相反,求局部最小值,图像变暗。
关于腐蚀函数可以参考:http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=erode#voiderode(InputArray src, OutputArray dst, InputArray kernel, Point anchor, intiterations, int borderType, const Scalar& borderValue)
3. 开运算(open operation):先对图像进行腐蚀然后进行膨胀操作。
dst=open(src,element)=dilate(erode(src,element))
4. 闭运算(close operation):先对图像进行膨胀然后进行腐蚀操作。
dst=close(src,element)= erode (dilate(src,element))
5. 形态学梯度(morphological gradient):对图像分别进行膨胀操作和腐蚀操作,然后相减。这个可以用来保留图像的边缘轮廓。
dst=dilate(src,element)-erode(src,element)
6. 顶帽(top hat):原图与开运算操作的结果图相减。
dst=src-open(src,element)
7. 黑帽(black hat):闭运算操作的结果与原图相减。
dst=close(src,element)-src
OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算,形态学梯度,“顶帽”、“黑帽”等等。
关于morphologyEx函数可以参考:http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html?highlight=morphologyex#voidmorphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Pointanchor, int iterations, int borderType, const Scalar& borderValue)。
这里对此函数进行简单说明。这个函数一共有八个参数,后四个参数都带有默认值,所以一般可以只对前四个参数进行赋值即可。morphologyEx(src,dst,MORPH_ERODE,element); 第三个参数表示形态学运算的类型,第四个参数是形态学运算的内核,这个参数通常与getStructuringElement函数配合使用。如:
Mat element = getStructuringElement(MORPH_RECT, Size(kernel, kernel));
下面用简单的代码段对形态学滤波进行实现,观察效果。
#include<iostream> #include<cv.hpp> //#include "highgui.hpp" //#include "imgproc.hpp" using namespace std; using namespace cv; #define kernel 10 int main() { Mat dst, src = imread("1.tif");//读入图片 imshow("SRC",src); //显示原图 Mat element = getStructuringElement(MORPH_RECT, Size(kernel, kernel));//设置内核参数 //7种形态学滤波类型 morphologyEx(src,dst,MORPH_ERODE,element); imshow("ERRODE", dst); //膨胀 morphologyEx(src, dst, MORPH_DILATE, element); imshow("DILATE", dst); //腐蚀 morphologyEx(src, dst, MORPH_OPEN, element); imshow("OPEN", dst); //开运算 morphologyEx(src, dst, MORPH_CLOSE, element); imshow("CLOSE", dst); //闭运算 morphologyEx(src, dst, MORPH_GRADIENT, element); imshow("GRADIENT", dst); //形态学梯度 morphologyEx(src, dst, MORPH_TOPHAT, element); imshow("TOPHAT", dst); //顶帽 morphologyEx(src, dst, MORPH_BLACKHAT, element); imshow("BLACKHaT", dst); //黑帽 waitKey(); //等待 return 0; }程序运行效果:
这里用了一幅二值图像,读者可以选用不同的图像,然后执行程序观察效果。
除此之外,下面的两篇文章对形态学滤波有更详细的讲解。
参考文献:
http://blog.csdn.net/poem_qianmo/article/details/23710721
http://blog.csdn.net/poem_qianmo/article/details/24599073