版本:Opencv320、VS2015
//-------------------------------------【滤波】-----------------------------------------
//描述:方框滤波、均值滤波、高斯滤波、种值滤波、双边滤波(比较适合用来美颜)
//--------------------------------------------------------------------------------------
#include "opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <stdio.h>
//-----------------------内核------------------------------------------------
// 描述:其实就是一个颜色的取值根据他周围颜色来计算,内核值就是这个周围有多大
//---------------------------------------------------------------------------
using namespace cv;
Mat g_srcImage;
Mat g_dstImage1, g_dstImage2, g_dstImage3,g_dstImage4,g_dstImage5;
int g_nBoxFilter = 3; //方框滤波的内核大小 (等于3就是一个3X3大小的区域)
int g_nBlur = 3;//均值滤波的内核大小
int g_nGaussianBlur = 3;//高斯滤波的内核大小
int g_nMedianBlur = 3; //中值滤波的孔径大小
int g_nBilateralFilter = 3;//双边滤波的过滤像素的领域直径
//---------------------【全局函数声明部分】---------------------------------
// 描述:全局函数声明
//--------------------------------------------------------------------------
//轨迹条的回调函数
void on_BoxFilter(int,void*);
void on_Blur(int,void*);
void on_GaussianBlur(int,void*);
void on_MedianBlur(int, void*);
void on_BilateralFilter(int, void*);
int main() {
//载入图片
g_srcImage = imread("61.bmp");
if (!g_srcImage.data) { printf("没有找到图片\n"); return 0; }
//用zeros创建一个空的和用clone函数克隆是一样的。
g_dstImage1 = Mat::zeros(g_srcImage.size(),g_srcImage.type());
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.clone();
g_dstImage4 = g_srcImage.clone();
namedWindow("原图");
imshow("原图", g_srcImage);
namedWindow("方框滤波效果演示");
namedWindow("均值滤波效果演示");
namedWindow("高斯滤波效果演示");
namedWindow("中值滤波效果演示");
namedWindow("双边滤波效果演示");
//createTrackbar 滑动条
//参数:(窗口名称,滑动条的名称,进度条的值保持到这个变量里,进度条的最大值,进度条的回调函数,一般不写)
createTrackbar("方框滤波","方框滤波效果演示",&g_nBoxFilter,20,on_BoxFilter);
createTrackbar("均值滤波","均值滤波效果演示", &g_nBlur, 20, on_Blur);
createTrackbar("高斯滤波","高斯滤波效果演示", &g_nGaussianBlur, 20, on_GaussianBlur);
createTrackbar("中值滤波", "中值滤波效果演示", &g_nMedianBlur, 20, on_MedianBlur);
createTrackbar("双边滤波","双边滤波效果演示",&g_nBilateralFilter,20,on_BilateralFilter);
on_BoxFilter(0, 0);
on_Blur(0, 0);
on_GaussianBlur(0, 0);
on_MedianBlur(0, 0);
on_BilateralFilter(0, 0);
waitKey(156000);
return 0;
}
//方框滤波
void on_BoxFilter(int, void*) {
//因为size是-1开始的所以要+1
//参数列表:(原图,经过滤波后的图像存到这个变量里,内核大小,取默认值,取默认值,取默认值)
boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilter + 1, g_nBoxFilter + 1));
imshow("方框滤波效果演示", g_dstImage1);
}
//均值滤波
void on_Blur(int,void*) {
//参数列表:(原图,经过滤波后的图像存到这个变量里,内核大小,取默认值,取默认值)
blur(g_srcImage,g_dstImage2, Size(g_nBlur + 1, g_nBlur + 1));
imshow("均值滤波效果演示", g_dstImage2);
}
//高斯滤波
void on_GaussianBlur(int,void*) {
//高斯滤波的Size必须为正数的奇数
//参数列表:(原图,经过滤波后的图像存到这个变量里,内核大小,一般填0,一般填0,取默认值)
GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlur*2+1, g_nGaussianBlur*2+1), 0, 0);
imshow("高斯滤波效果演示", g_dstImage3);
}
//中值滤波
void on_MedianBlur(int,void*) {
//Size必须是正数的奇数
//参数列表:(原图,经过滤波后的图像存到这个变量里,孔径大小<填个整数就行了>)
medianBlur(g_srcImage,g_dstImage4,g_nMedianBlur*2+1);
imshow("中值滤波效果演示",g_dstImage4);
}
//双边滤波
void on_BilateralFilter(int, void*) {
//参数列表:(原图,经过滤波后的图像存到这个变量里,过滤像素领域的直径,值越大颜色混合领域越大,值越大影响领域越大,一般取默认值)
bilateralFilter(g_srcImage, g_dstImage5, g_nBilateralFilter, g_nBilateralFilter * 2, g_nBilateralFilter / 2);
imshow("双边滤波效果演示",g_dstImage5);
}
原图
方框滤波
均值滤波
高斯滤波
中值滤波
双边滤波(用来美图效果很棒哦)