#include <opencv2/opencv.hpp>
#include<iostream>
//#include <math.h>
using namespace cv;
using namespace std;
/*-------------------------------------------------------------------全局变量声明-------------------------------------------------------------------*/
Mat src, dst, dst1, dst2;
int openclose_number = 9;
int erodedilate_number = 9;
int topblackhat_number = 9;
int slidermax_number = 10;
int elementshape = MORPH_RECT;//初始化为矩形
/*-------------------------------------------------------------------全局函数声明-------------------------------------------------------------------*/
void openclose(int, void *);
void erodedilate(int, void *);
void topblackhat(int, void *);
int main()
{
src = imread("1.jpg");
if (!src.data)
{
cout << "Could not load the image!" << endl;
return 0;
}
namedWindow("【原始图】");
imshow("【原始图】",src);
namedWindow("【开/闭运算】");
namedWindow("【腐蚀/膨胀】");
namedWindow("【顶帽/黑帽】");
/*-------------------------------------------------------------------创建进度条函数-------------------------------------------------------------------*/
createTrackbar("内核值", "【开/闭运算】", &openclose_number, slidermax_number * 2, openclose);//调试了好大半天。此窗口名 "【开/闭运算】"
//与namedWindow( "【开/闭运算】")空格隔了一个,
//一定要注意一致,要不然进度条就不会在窗口中显示出来
createTrackbar("内核值", "【腐蚀/膨胀】", &erodedilate_number, slidermax_number*2, erodedilate);
createTrackbar("内核值", "【顶帽/黑帽】", &topblackhat_number, slidermax_number*2, topblackhat);
while (1)
{
int c;
/*-------------------------------------------------------------------调用回调函数-------------------------------------------------------------------*/
openclose(openclose_number, 0);
topblackhat(topblackhat_number, 0);
erodedilate(erodedilate_number, 0);
c=waitKey(0);
//按下'q'键或者ESC键程序退出
if ((char)c == 'q' || (char)c == 27)
break;
if ((char)c == 49)//键盘阿拉伯数字1的ASSCII码
elementshape = MORPH_ELLIPSE;
else if((char)c==50)
elementshape = MORPH_RECT;
else if ((char)c == 51)
elementshape = MORPH_CROSS;
//按下空格键,在矩形、椭圆、十字形结构元素中循环
else if ((char)c ==' ')
elementshape =( elementshape+1)%3;
}
return 0;
}
/*-------------------------------------------------------------------【开/闭运算】回调函数-------------------------------------------------------------------*/
void openclose(int, void *)
{
int offset = openclose_number - slidermax_number; //偏移量计算
int absolute = offset > 0 ? offset : -offset; //取绝对值
Mat element = getStructuringElement(elementshape,Size(absolute*2+1, absolute * 2 +1));
if (offset < 0)
morphologyEx(src, dst, MORPH_OPEN, element);//morphologyEx(src,dst,CV_MOP_OPEN,element);为Opencv2版本
else
morphologyEx(src, dst, MORPH_CLOSE, element);
imshow("【开/闭运算】",dst);
}
/*-------------------------------------------------------------------【腐蚀/膨胀】回调函数-------------------------------------------------------------------*/
void erodedilate(int, void *)
{
int offset = erodedilate_number - slidermax_number;//偏移量计算
int absolute = offset > 0 ? offset : -offset;//取绝对值
Mat element = getStructuringElement(elementshape, Size(absolute * 2 + 1, absolute * 2 + 1),Point(absolute, absolute));
if (offset < 0)
erode(src, dst, element);
else
dilate(src, dst, element);
imshow("【腐蚀/膨胀】", dst);
}
/*-------------------------------------------------------------------【顶帽/黑帽】回调函数-------------------------------------------------------------------*/
void topblackhat(int, void *)
{
int offset = topblackhat_number - slidermax_number;//偏移量计算
int absolute = offset > 0 ? offset : -offset;//取绝对值
Mat element = getStructuringElement(elementshape, Size(absolute * 2 + 1, absolute * 2 + 1), Point(absolute, absolute));
if (offset < 0)
morphologyEx(src, dst, MORPH_TOPHAT, element);
else
morphologyEx(src, dst, MORPH_BLACKHAT, element);
imshow("【顶帽/黑帽】", dst);
}
6.4.9形态学综合示例:形态学滤波(腐蚀与膨胀+开闭运算+顶帽黑帽)
最新推荐文章于 2024-07-23 17:59:51 发布