膨胀就是求局部最大值的操作(dilate),腐蚀就是求局部最小值的操作(erode),无论是膨胀操作还是腐蚀操作就是蒋图片或者额图像的一部分区域,标记为A与核标记为B进行卷积。
代码:
#include"stdafx.h"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include"opencv2/core/core.hpp"
#include <iostream>
using namespace cv;
using namespace std;
// 定义全局变量
Mat image, dstImage;
int g_nTrackbarNumer = 0;
int g_nStructElementSize = 3;
//函数声明
void process();
void on_TrackbarNumChange(int, void*);
void on_ElementSizeChange(int, void*);
int main() {
system("color 5E");
//读取图片
image = imread("E:\\pictures\\For_Project\\New_opencv\\Sceen\\1.jpg");
namedWindow("【原始图像】", 1);
imshow("【原始图像】", image);
namedWindow("【效果图】", 1);
//创建滑动条
createTrackbar("腐蚀/膨胀", "【效果图】", &g_nTrackbarNumer, 1, on_TrackbarNumChange);
createTrackbar("内核尺寸", "【效果图】", &g_nStructElementSize, 21, on_ElementSizeChange);
//分别调用回调函数
on_TrackbarNumChange(g_nTrackbarNumer, 0);
on_ElementSizeChange(g_nStructElementSize, 0);
//等待键盘按键‘q’退出
while (char(waitKey(1)) != 'q') {}
return 0;
}
void process() {
//自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(2 * g_nStructElementSize + 1,
2 * g_nStructElementSize + 1), Point(g_nStructElementSize, g_nStructElementSize));
//判断进行腐蚀或者膨胀操作
if (g_nTrackbarNumer == 0) {
//服饰操作
erode(image, dstImage, element);
}
else {
//膨胀操作
dilate(image, dstImage, element);
}
imshow("【效果图】", dstImage);
}
void on_TrackbarNumChange(int,void*) {
process();
}
void on_ElementSizeChange(int, void *) {
process();
}