版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/86179553
开操作- open
- 先腐蚀后膨胀
- 可以去掉小的对象,假设对象是前景色,背景是黑色
闭操作- close
- 先膨胀后腐蚀(bin2)
- 可以填充小的洞(fill hole),假设对象是前景色,背景是黑色
形态学梯度- Morphological Gradient
- 膨胀减去腐蚀:形态学梯度就是指膨胀结果减去腐蚀结果。因为膨胀是取领域内的最大值,从而增大亮度高的区域的面积(在二值图中,就是增大白色区域的面积);而腐蚀是取邻域内的最小值,从而减小亮度高的区域的面积,所以,形态学梯度得到的就是图像中物体的边界。
- 又称为基本梯度(其它还包括-内部梯度、方向梯度)
顶帽 – top hat
- 顶帽 是原图像与开操作之间的差值图像
黑帽 – black hat
- 黑帽是闭操作图像与源图像的差值图像
相关API
morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);
- Mat src – 输入图像,图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
- Mat dest – 输出结果,需要和源图片有一样的尺寸和类型。
- int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
- MORPH_OPEN – 开运算(Opening operation)
- MORPH_CLOSE – 闭运算(Closing operation)
- MORPH_GRADIENT -形态学梯度(Morphological gradient)
- MORPH_TOPHAT - “顶帽”(“Top hat”)
- MORPH_BLACKHAT - “黑帽”(“Black hat")
注意:另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。
- Mat kernel 结构元素,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
- int Iteration 迭代次数,默认是1
代码示例
#include<opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
Mat src,dst;
char Windows_Name[]="Morphology Transformations";
int morph_operator=0,morph_elem=0,morph_size=0;//形态学操作、卷积核类型,卷积核大小
int const max_operator = 4,max_elem = 2,max_kernel_size = 21;
void Morphology_Operations(int, void*);
int main(int argc,char** argv){
//1、加载图像
src=imread("E:/Experiment/OpenCV/Pictures/ErodeAndDilate.jpg");
if(!src.data){return -1;}
//2、创建一个窗口以显示“形态”操作的结果
namedWindow(Windows_Name,CV_WINDOW_AUTOSIZE);
//3、为用户创建03轨道栏以输入参数:
//每次我们移动任何滑块时,将调用用户的函数Morphology_Operations以实现新的形态学操作,并且它将基于当前轨迹栏值更新输出图像。
createTrackbar("形态学操作", Windows_Name, &morph_operator, max_operator,Morphology_Operations);
createTrackbar("卷积核类型", Windows_Name, &morph_elem, max_elem,Morphology_Operations);
createTrackbar("卷积核大小", Windows_Name, &morph_size, max_kernel_size,Morphology_Operations);
Morphology_Operations(0,0);
waitKey(0);
return 0;
}
void Morphology_Operations(int, void*){
int operation = morph_operator + 2;
Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
morphologyEx( src, dst, operation, element );
imshow( Windows_Name, dst );
}