本文列举了opencv里最常用的线性和非线性滤波函数,并举例实现了各个函数。
#include<cv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//定义一个mat数据srcImge用来存放图像,一个控制条初始值和五个控制条调用函数
Mat srcImage;
int currentvalue = 3;
void on_MeanBlur(int, void*);
void on_GaussianBlur(int, void*);
void on_BoxBlur(int, void*);
void on_MeanBlur(int, void*);
void on_MedianBlur(int, void*);
void on_BilateralBlur(int, void*);
int main()
{
//读图并显示
srcImage = imread("1.tif");
imshow("原图", srcImage);
//创建五个窗口,依附于每个窗口创建一个控制条,用控制条调用滤波函数(线性:均值、高斯和方框滤波;非线性:中值、双边)
namedWindow("均值");
createTrackbar("内核:", "均值", ¤tvalue, 30, on_MeanBlur);
on_MeanBlur(currentvalue,0);
namedWindow("高斯");
createTrackbar("内核:", "高斯", ¤tvalue, 30, on_GaussianBlur);
on_GaussianBlur(currentvalue, 0);
namedWindow("方框");
createTrackbar("内核:", "方框", ¤tvalue, 30, on_BoxBlur);
on_BoxBlur(currentvalue, 0);
namedWindow("中值");
createTrackbar("内核:", "中值", ¤tvalue, 30, on_MedianBlur);
on_MedianBlur(currentvalue, 0);
namedWindow("双边");
createTrackbar("内核:", "双边", ¤tvalue, 30, on_BilateralBlur);
on_BilateralBlur(currentvalue, 0);
waitKey();
return 0;
}
//五个控制条函数的调用函数,前三个size里都有加一操作,是因为内核必须为正数,即大于零,第四个 2*currentvalue+1 是因为这个参数得取大于一的奇数
void on_MeanBlur(int, void*)
{
Mat dstImage = srcImage.clone();
blur(srcImage, dstImage,Size(currentvalue+1,currentvalue+1));
imshow("均值", dstImage);
}
void on_GaussianBlur(int, void*)
{
Mat dstImage = srcImage.clone();
GaussianBlur(srcImage, dstImage, Size(2*currentvalue+1, 2*currentvalue+1),0,0);//高斯函数的内核大小必须是正数和奇数
imshow("高斯", dstImage);
}
void on_BoxBlur(int, void*)
{
Mat dstImage = srcImage.clone();
boxFilter(srcImage, dstImage,-1, Size(currentvalue+1, currentvalue+1 ));
imshow("方框", dstImage);
}
void on_MedianBlur(int, void*)
{
Mat dstImage = srcImage.clone();
medianBlur(srcImage, dstImage, 2*currentvalue+1 );
imshow("中值", dstImage);
}
void on_BilateralBlur(int, void*)
{
Mat dstImage = srcImage.clone();
bilateralFilter(srcImage, dstImage, currentvalue, currentvalue * 2, currentvalue/2);
imshow("双边", dstImage);
}