今天记录的是形态转换的几个,开盘,闭幕,形态梯度,顶帽,黑帽。
让我们先了解他们的概念:
上代码:
// opencv0012.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;
Mat src, dst;
int morph_elem = 0;
int morph_size = 0;
int morph_operator = 0;
int const max_operator = 4;
int const max_elem = 2;
int const max_kernel_size = 21;
const char * window_name = "Morphology Transformations Demo";
void Morphology_Operator(int, void*);
int main()
{
string imageName = "D:/images/41.jpg";
src = imread(imageName, IMREAD_COLOR);
if (src.empty())
{
cout << "资源为空,请检查图片以及路径" << endl;
return -1;
}
namedWindow(window_name, WINDOW_NORMAL);
createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", window_name,
&morph_operator,max_operator, Morphology_Operator);
createTrackbar("Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,
&morph_elem, max_elem,
Morphology_Operator);
createTrackbar("Kernel size:\n 2n +1", window_name,
&morph_size, max_kernel_size,
Morphology_Operator);
Morphology_Operator(0, 0);
waitKey(0);
return 0;
}
void Morphology_Operator(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(window_name, dst);
}
代码解释:
第一个跟踪栏操作符返回要使用的形态学操作(morph_operator)。
createTrackbar(“Operator:\ n 0:Opening - 1:Closing \ n 2:Gradient - 3:Top Hat \ n 4:Black Hat”,window_name,&morph_operator,max_operator,Morphology_Operations);
第二个trackbar 元素返回morph_elem,它表示我们的内核是什么样的结构:
createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,
&morph_elem, max_elem,
Morphology_Operations );
最终的trackbar 内核大小返回要使用的内核的大小(morph_size)
createTrackbar( "Kernel size:\n 2n +1", window_name,
&morph_size, max_kernel_size,
Morphology_Operations );
原图:
该变值的图片:
可以调动这个滑块,分别看看效果图,这里就不多展示了,希望大家多多了解。一起开心学习。