1.目的
(1)开运算
(2)闭运算
(3)形态学梯度
(4)顶帽
(5)黑帽
2.原理
(1)开运算
开运算是通过先对图像腐蚀再膨胀实现的。能够排除小团块物体(假设物体较背景明亮)。请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。
(2)闭运算
闭运算是通过先对图像膨胀再腐蚀实现的。能够排除小型黑洞(黑色区域)。
(3)形态梯度
膨胀图与腐蚀图之差,能够保留物体的边缘轮廓,如下所示:
(4)顶帽
原图与开运算之差
(5)黑帽
闭运算与原图之差
3.部分代码解释
/*
morphologyEx参数解释
src:输入图像
dst:输出图像
operation:形态学运算类型
element:运算操作内核,由getStructuringElement获取
*/
/*形态学操作MORPH_X的取值范围是2-6
2:开运算
3:闭运算
4:形态梯度
5:顶帽
6:黑帽
*/
morphologyEx(src, dst, operation, element);
4.完整代码
(1)CommonInclude.h
#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
#endif
(2)Morph.cpp
#include "CommonInclude.h"
int morphology_elem = 0;
int morphology_operator = 0;
int morphology_size = 0;
//形态学操作MORPH_X的取值范围是2-6
int max_elem = 2;
int max_operator = 4;
int max_kernel_size = 21;
Mat src,dst;
void MorphologyOperation(int, void*){
int operation = morphology_operator + 2;
Mat element = getStructuringElement(morphology_elem, Size(2*morphology_size+1,2*morphology_size+1), Point(morphology_size,morphology_size));
/*
morphologyEx参数解释
src:输入图像
dst:输出图像
operation:形态学运算类型
element:运算操作内核,由getStructuringElement获取
*/
/*形态学操作MORPH_X的取值范围是2-6
2:开运算
3:闭运算
4:形态梯度
5:顶帽
6:黑帽
*/
morphologyEx(src, dst, operation, element);
imshow("MorphologyOperation", dst);
}
int main(int argc, char**argv){
if(argc < 2){
cout << "more parameters are required!!!" << endl;
return(-1);
}
src = imread(argv[1]);
namedWindow("MorphologyOperation", CV_WINDOW_AUTOSIZE);
createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", "MorphologyOperation",
&morphology_operator, max_operator,
MorphologyOperation);
createTrackbar("Elem:\n 0:rectangle\n 1:cross\n 2:ellipse", "MorphologyOperation",
&morphology_elem, max_elem,
MorphologyOperation);
createTrackbar("Kernel Size:2*n+1","MorphologyOperation",
&morphology_size, max_kernel_size,
MorphologyOperation);
MorphologyOperation(0,0);
waitKey(0);
return(0);
}