上一篇文章介绍了空间滤波的线性和非线性滤波,这里给大家介绍形态学滤波,包括腐蚀与膨胀、开闭运算、形态学梯度和顶帽和黑帽。其中膨胀与腐蚀是的最基本的形态学操作,其余的运算都是基于腐蚀和膨胀的。
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;
}
程序运行效果:
这里用了一幅二值图像,读者可以选用不同的图像,然后执行程序观察效果。
除此之外,下面的两篇文章对形态学滤波有更详细的讲解。
参考文献: