OpenCV——膨胀与腐蚀

#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

猜你喜欢

转载自www.cnblogs.com/fcfc940503/p/11279031.html
今日推荐