【概念】它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算、形态学梯度、“顶帽”、“黑帽”等等。
开运算(Opening Operation)是先腐蚀后膨胀的过程。(可以用来消除孤立的小点,毛刺等同时并不明显改变其面积。)其数学表达式如下:
闭运算(Closing Operation)先膨胀后腐蚀的过程,能够让断裂的部分被填平,比如小孔、裂缝(黑色区域)。其数学表达式如下:
形态学梯度(Morphological Gradient)为膨胀图与腐蚀图之差,(用来保留物体的边缘轮廓)数学表达式如下:
顶帽运算(Top Hat)为原图像与“开运算“的结果图之差,(用来分离比邻近点亮一些的斑块)数学表达式如下:
黑帽(Black Hat)运算为”闭运算“的结果图与原图像之差(用来分离比邻近点暗一些的斑块),数学表达式为:
【原型】
C++: void morphologyEx( InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );
参数1,InputArray类型的src,输入图像,填Mat类的对象即可。
参数2:OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
参数3:int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
- MORPH_OPEN – 开运算(Opening operation)
- MORPH_CLOSE – 闭运算(Closing operation)
- MORPH_GRADIENT -形态学梯度(Morphological gradient)
- MORPH_TOPHAT - “顶帽”(“Top hat”)
- MORPH_BLACKHAT - “黑帽”(“Black hat“)
参数4:InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。
参数5:Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。
参数6:int类型的iterations,迭代使用函数的次数,默认值为1。
参数7:int类型的borderType,用于推断图像外部像素的某种边界模式。
参数8:const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般不用管。
【实例】
#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原始图
Mat srcImage = imread("D:\\study\\picture\\a.jpg");
//显示原始图
imshow("【原始图】", srcImage);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//定义输出图像
Mat dstImage1, dstImage2, dstImage3, dstImage4, dstImage5;
//进行形态学操作
morphologyEx(srcImage, dstImage1, MORPH_OPEN, element);//开运算
morphologyEx(srcImage, dstImage2, MORPH_CLOSE, element);//闭运算
morphologyEx(srcImage, dstImage3, MORPH_GRADIENT, element);//形态学梯度
morphologyEx(srcImage, dstImage4, MORPH_TOPHAT, element);//顶帽
morphologyEx(srcImage, dstImage5, MORPH_BLACKHAT, element);//黑帽
//显示效果图
imshow("【效果图】开运算", dstImage1);
imshow("【效果图】闭运算", dstImage2);
imshow("【效果图】形态学梯度", dstImage3);
imshow("【效果图】顶帽", dstImage4);
imshow("【效果图】黑帽", dstImage5);
waitKey(0);
return 0;
}
开运算
闭运算
形态学梯度&顶帽
黑帽