1.腐蚀和膨胀
就不说腐蚀和膨胀的原理了,这方面已经有大佬讲的老好了:
参考博客:数学形态学运算——腐蚀、膨胀、开运算、闭运算_Chaolei3的博客-CSDN博客_膨胀运算
形态学操作的原理可以说都是基于腐蚀和膨胀的,所以主要搞明白这两个便可以了,但是运用方面我觉得还是多去看别人的案例和尝试吧。
1.腐蚀API
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
- src 传入图像
- dst 输出图像
- kernel 用来表示卷积核,一般用getStructuringElement函数来构建这个矩阵(不知道可以去看一下原理)
- anchor 锚点位置(默认值Point(-1,-1)为中心位置)
- iterations 腐蚀执行的次数
- borderType 边缘类型
不同类型可以参考这篇博客:
- borderValue 边缘值
函数的常见引用方式
Mat getStructuring = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
erode(img, img2, getStructuring);
//主要就是输入输出和卷积核
2.膨胀API
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
函数的传入参数和erode一样
最简单的引用也是给定输入输出和卷积核就行
2.其他形态学操作
开操作
对图像先进行腐蚀再进行膨胀然后输出
闭操作
对图像先进行膨胀再进行腐蚀然后输出
形态学梯度
膨胀后的结果减去腐蚀后的结果(基本梯度)
其他还有内部梯度和方向梯度(基本API不支持)
顶帽
原图像和开操作之间的差值图像
黑帽
闭操作和源图像的差值图像
相关API(上述都是用的同一个API)
morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);
- Mat src – 输入图像
- Mat dest – 输出结果
- int OPT – CV_MOP_OPEN/ CV_MOP_CLOSE/ CV_MOP_GRADIENT / CV_MOP_TOPHAT/ CV_MOP_BLACKHAT 形态学操作类型
Mat kernel 结构元素
int Iteration 迭代次数,默认是1
CV_MOP_OPEN 开操作
CV_MOP_CLOSE 闭操作
CV_MOP_GRADIENT 梯度操作
CV_MOP_TOPHAT 顶帽
CV_MOP_BLACKHAT 黑帽