这一节主要介绍几种图像形态学操作, 主要包括:膨胀, 腐蚀,开,闭四种处理操作;
另外,在显示图像中的同时,加入动态调整参数的滑动条;
另外,在显示图像中的同时,加入动态调整参数的滑动条;
完整的代码在文章最后;
需要注意的是,重要的不是如何调用API,而是理解每一种形态学操作所起到的作用;
图像形态学操作(Morphology Operators)指的是基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学;
其中,膨胀和腐蚀是最常用的形态学处理操作;
膨胀dilate
的API使用介绍:
dilate( 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
结构元素anchor
锚点,默认中心像素;iterations
迭代处理的次数;膨胀操作的作用:
腐蚀erode
的API使用介绍:
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
结构元素anchor
锚点,默认中心像素;iterations
迭代处理的次数;腐蚀操作的作用:
使用方式:
Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);
开操作的作用:
使用方式:
Mat structureElement = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);
闭操作的作用:
形态学梯度的作用:
顶帽的作用:
黑帽的作用:
上述一些形态学处理操作的作用并不是唯一的,需要根据具体的应用场景,选择合适的操作;
完整的代码如下:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat src, dst;
int elementSize = 3;
int maxSize = 22;
char OUPUT_TITLE[] = "output_image";
void CallBackDemo(int, void*);
int main(){
// 读取图像
src = imread("/home/chen/dataset/MorphologyOperators.png");
if (src.empty()){
cout << "cloud not load image." << endl;
return -1;
}
// 获取结构元素
int s = 3;
Mat structreElement = getStructuringElement(MORPH_RECT, Size(s, s));
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
// 显示处理后的图像
namedWindow(OUPUT_TITLE, WINDOW_AUTOSIZE);
createTrackbar("Parmaters: ", OUPUT_TITLE, &elementSize, maxSize, CallBackDemo);
CallBackDemo(0, 0);
waitKey(0);
return 0;
}
void CallBackDemo(int, void*){
// 创建结构元素
int s = elementSize * 2 + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
// 膨胀操作
// dilate(src, dst, structureElement, Point(-1, -1), 1);
// 腐蚀操作
// erode(src, dst, structureElement, Point(-1, -1), 1);
// 开操作
// morphologyEx(src, dst, MORPH_OPEN, structureElement, Point(-1, -1), 1);
// 闭操作
// morphologyEx(src, dst, MORPH_CLOSE, structureElement, Point(-1, -1), 1);
// 形态学梯度
// morphologyEx(src, dst, MORPH_GRADIENT, structureElement, Point(-1, -1), 1);
// 顶冒-Top hat
// morphologyEx(src, dst, MORPH_TOPHAT, structureElement, Point(-1, -1), 1);
// 黑帽--Black hat
morphologyEx(src, dst, MORPH_BLACKHAT, structureElement, Point(-1, -1), 1);
imshow(OUPUT_TITLE, dst);
return;
}
原文:https://www.cnblogs.com/chenzhen0530/p/14630229.html