opencv learning (15) box filter boxfilter()//mean filter blur()//Gaussian filter GaussianBlur() (you can review the slider operation here)

For opencv source code analysis, please refer to reference book 160-165, to be further understood

Common Filtering Concepts

write picture description here
write picture description here

Image filtering process

write picture description here
write picture description here
write picture description here
write picture description here
write picture description here

1, box filter boxfilter()

write picture description here
write picture description here
write picture description here
write picture description here

2, mean filter blur()

write picture description here
write picture description here
write picture description here
write picture description here

3, Gaussian filter GassianBlur()

write picture description here
write picture description here
write picture description here
write picture description here

Comprehensive example

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//全局变量声明
Mat g_srcimage, g_dstimage1, g_dstimage2, g_dstimage3;
int g_nBoxFliterValue = 3;//方框,均值,高斯滤波参数值
int g_nMeanBlurValue = 3;
int g_nGaussianBlurValue = 3;

//轨迹条的回调函数
static void on_BoxFliter(int, void*);
static void on_MeanBlur(int, void*);
static void on_GaussianBlur(int, void*);

//主函数
int main()
{
    system("color5E");
    g_srcimage = imread("D://1.jpg", 1);
    if (!g_srcimage.data) { printf("错错错\n"); return false; }

    g_dstimage1 = g_srcimage.clone();
    g_dstimage2 = g_srcimage.clone();
    g_dstimage3 = g_srcimage.clone();

    //显示原图
    namedWindow("原图窗口", 1);
    imshow("原图窗口", g_srcimage);

    //1方框滤波
    namedWindow("方框滤波", 1);
    createTrackbar("内核值:","方框滤波",&g_nBoxFliterValue,40,on_BoxFliter);
    on_BoxFliter(g_nBoxFliterValue, 0);


    //2均值滤波
    namedWindow("均值滤波", 1);
    createTrackbar("内核值:", "均值滤波", &g_nMeanBlurValue, 40, on_MeanBlur);
    on_MeanBlur(g_nMeanBlurValue, 0);
    imshow("均值滤波", g_dstimage2);

    //3高斯滤波
    namedWindow("高斯滤波", 1);
    createTrackbar("内核值:", "高斯滤波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
    on_GaussianBlur(g_nGaussianBlurValue, 0);
    imshow("高斯滤波", g_dstimage3);

    //输出提示信息
    cout << endl << "滑动滚动条观察图像效果\n\n"
        << "按下q键退出";
    while (char(waitKey(1)) != 'q') {}
    return 0;



}
//BoxFliter,blur,GassianBlur函数定义
static void on_BoxFliter(int, void*)
{
    boxFilter(g_srcimage, g_dstimage1, -1, Size(g_nBoxFliterValue + 1, g_nBoxFliterValue + 1));
    imshow("方框滤波", g_dstimage1);//与上面的2,3,对比发现,只有将imshow函数置于此才能拖动滑动条改变内核值(2,3默认展示了滤波内核的初始值,无法随滑动条改变而改变)
}
static void on_MeanBlur(int, void*)
{
    blur(g_srcimage, g_dstimage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1),Point(-1,-1));
}
static void on_GaussianBlur(int, void*)
{
    GaussianBlur(g_srcimage, g_dstimage3, Size(g_nGaussianBlurValue*2 + 1, g_nGaussianBlurValue*2+ 1),0,0);
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325605991&siteId=291194637