本文主要描述了利用OpenCV的库函数实现滤波的过程
可分为以下两大类:
一、线性滤波
1、方框滤波 boxFilter()
2、均值滤波blur()
3、高斯滤波GaussianBlur()
二、非线性滤波
1、中值滤波medianBlur()--当滤波核尺寸大于5时,输入图像只能是CV_8U格式的。
2、双边滤波bilateralFilter()
实验结果如下图所示:
主程序如下所示:
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//声名全局变量
Mat g_scrImage,g_dstImage1,g_dstImage2,g_dstImage3,g_dstImage4,g_dstImage5;
//滤波核大小的初始值
int g_nBoxFilterValue=6;//方块滤波的内核值
int g_nMeanBlurValue=10;//均值滤波内核值
int g_nGaussianBlurValue=6;//高斯滤波内核值
int g_nMedianBlurValue=10;//中值滤波参数
int g_nBilateralFilterValue=10;//双边滤波参数
//声名滚动条回调函数
static void on_BoxFilter(int,void*);//方框
static void on_MeanBlur(int,void*);//均值
static void on_GaussianBlur(int,void*);//高斯
static void on_MedianBlur(int,void*);//中值
static void on_BilateralFilter(int,void*);//双边
int main()
{
g_scrImage=imread("1.jpg");
if (!g_scrImage.data)
{
printf("载入失败");
return -1;
}
g_dstImage1=g_scrImage.clone();
g_dstImage2=g_scrImage.clone();
g_dstImage3=g_scrImage.clone();
g_dstImage4=g_scrImage.clone();
g_dstImage5=g_scrImage.clone();
//显示原图
namedWindow("0原图");
imshow("0原图",g_scrImage);
//方框滤波
namedWindow("1方框滤波");//创建窗口
//创建滚动条
createTrackbar("内核值","1方框滤波",&g_nBoxFilterValue,50,on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue,0);
//imshow("1方框滤波",g_dstImage1);
//均值滤波
namedWindow("2均值滤波");//创建窗口
createTrackbar("内核值","2均值滤波",&g_nMeanBlurValue,50,on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue,0);
//高斯滤波
namedWindow("3高斯滤波");//创建窗口
createTrackbar("内核值","3高斯滤波",&g_nGaussianBlurValue,50,on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue,0);
//中值滤波
namedWindow("4中值滤波");//创建窗口
createTrackbar("内核值","4中值滤波",&g_nMedianBlurValue,50,on_MedianBlur);
on_MedianBlur(g_nMedianBlurValue,0);
//双边滤波
namedWindow("5双边滤波");//创建窗口
createTrackbar("内核值","5双边滤波",&g_nBilateralFilterValue,50,on_BilateralFilter);
on_BilateralFilter(g_nBilateralFilterValue,0);
waitKey();
return 0;
}
//回调函数
//方框回调函数
static void on_BoxFilter(int,void*)
{
//方框滤波操作
boxFilter(g_scrImage,g_dstImage1,-1,Size(g_nBoxFilterValue+1,g_nBoxFilterValue+1));//尺寸加1 表示核的最小值为1
//显示
imshow("1方框滤波",g_dstImage1);
}
//均值回调函数
static void on_MeanBlur(int,void*)
{
blur(g_scrImage,g_dstImage2,Size(g_nMeanBlurValue+1,g_nMeanBlurValue+1),Point(-1,-1));
imshow("2均值滤波",g_dstImage2);
}
//高斯滤波回调函数
static void on_GaussianBlur(int,void*)
{
GaussianBlur(g_scrImage,g_dstImage3,Size(g_nGaussianBlurValue*2+1,g_nGaussianBlurValue*2+1),0,0);//乘2加1 表示核的尺寸需要时奇数
imshow("3高斯滤波",g_dstImage3);
}
//中值滤波回调函数
static void on_MedianBlur(int,void*)
{
medianBlur(g_scrImage,g_dstImage4,g_nMedianBlurValue*2+1);
imshow("4中值滤波",g_dstImage4);
}
//双边滤波回调函数
static void on_BilateralFilter(int,void*)
{
bilateralFilter(g_scrImage,g_dstImage5,g_nBilateralFilterValue,g_nBilateralFilterValue*2,g_nBilateralFilterValue);
imshow("5双边滤波",g_dstImage5);
}