参考链接:https://www.jianshu.com/p/ee72f5215e07
●函数原型
void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() )
●参数解释
○src:源图像Mat对象
○dst:目标图像Mat对象
○op:操作的类型,通过源码我们得知总共有以下几种类型:
enum MorphTypes{
MORPH_ERODE = 0, //腐蚀
MORPH_DILATE = 1, //膨胀
MORPH_OPEN = 2, //开操作
MORPH_CLOSE = 3, //闭操作
MORPH_GRADIENT = 4, //梯度操作
MORPH_TOPHAT = 5, //顶帽操作
MORPH_BLACKHAT = 6, //黑帽操作
MORPH_HITMISS = 7
};
○kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
○anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
○borderType :边缘类型,默认为BORDER_CONSTANT。
○borderValue :边缘值,用它的默认值即可。
参数3的类型:
●MORPH_ERODE(腐蚀)
跟erode(腐蚀)函数效果一样
●MORPH_DILATE(膨胀)
跟dilate(膨胀)函数效果一样
●MORPH_OPEN(开)
其实内部就是进行了先腐蚀后膨胀的操作。
●MORPH_CLOSE(闭)
其实内部就是进行了先膨胀后腐蚀的操作。
●MORPH_GRADIENT(梯度)
内部是膨胀减去腐蚀
●MORPH_TOPHAT(顶帽)
原图像-开运算图,突出原图像中比周围亮的区域
●MORPH_BLACKHAT(黑帽)
闭运算图-原图像,突出原图像中比周围暗的区域
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(){
Mat src;
src = imread("G:/OpenCV/opencv笔记所用图片/X2.png");
if (src.empty())
{
cout << "could not load image..." << endl;
getchar();
return -1;
}
imshow("input image",src);
Mat dst;
Mat kernel = getStructuringElement(MORPH_RECT, Size(17, 17), Point(-1, -1));
morphologyEx(src, dst, CV_MOP_OPEN, kernel);
imshow("open image", dst);
morphologyEx(src, dst, CV_MOP_CLOSE, kernel);
imshow("close image", dst);
morphologyEx(src, dst, CV_MOP_TOPHAT, kernel);
imshow("tophat image", dst);
morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);
imshow("blackhat image", dst);
waitKey(0);
return 0;
}