#include<opencv2/core/core.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; //全局变量声明******************************** Mat g_srcImage, g_dstImage; int g_nTrackbarNumber = 0;//0表示腐蚀erode,1表示膨胀dilate int g_nKernelSize = 3;//核大小 //全局函数声明******************************** void on_TrackbarNumberChange(int, void *);//回调函数 void on_KernelSizeChange(int, void *);//回调函数 void Process(); int main() { //载入原始图片 g_srcImage = imread("E:\\VS2015Opencv\\vs2015\\project\\picture\\cat.jpg"); if (!g_srcImage.data) { printf("读取srcImage错误~! \n"); return false; } //显示原始图片 namedWindow("image[origin]"); imshow("image[origin]", g_srcImage); //腐蚀/膨胀操作 namedWindow("image[morphology]"); createTrackbar("erode/dilate: ", "image[morphology]", &g_nTrackbarNumber, 1, on_TrackbarNumberChange); createTrackbar("kernel size: ", "image[morphology]", &g_nKernelSize, 21, on_KernelSizeChange); on_TrackbarNumberChange(g_nTrackbarNumber, 0); on_KernelSizeChange(g_nKernelSize, 0); waitKey(); return 0; } void Process() { Mat element = getStructuringElement(MORPH_RECT, Size(g_nKernelSize * 2 + 1, g_nKernelSize * 2 + 1), Point(g_nKernelSize, g_nKernelSize)); if (g_nTrackbarNumber == 0) erode(g_srcImage, g_dstImage, element); else dilate(g_srcImage, g_dstImage, element); imshow("image[morphology]", g_dstImage); } //回调函数 void on_TrackbarNumberChange(int, void *) { Process(); } void on_KernelSizeChange(int, void *) { Process(); }
腐蚀和膨胀是针对白色部分(高亮部分而言)。从数学角度来说,膨胀或者腐蚀操作就是将图像(或图像的一部分区域,称之为A)与核(称之为B)进行卷积。
膨胀就是求局部最大值操作,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素,这样就会使图像中的高亮区域逐渐增长。
腐蚀就是求局部最小值操作,即计算核B覆盖的区域的像素点的最小值,并把这个最小值赋值给参考点指定的像素,这样就会使图像中的高亮区域逐渐减少。
可参考博文:https://blog.csdn.net/qq_36387683/article/details/80479793