opencv笔记 5.形态学滤波

上一篇文章介绍了空间滤波的线性和非线性滤波,这里给大家介绍形态学滤波,包括腐蚀与膨胀、开闭运算、形态学梯度和顶帽和黑帽。其中膨胀与腐蚀是的最基本的形态学操作,其余的运算都是基于腐蚀和膨胀的。

 

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_RECTSize(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




你可能感兴趣的:(opencv笔记 5.形态学滤波)