数字图像处理线性滤波:
输出图像fo(x,y)= T[ fi(x,y) ],T是线性算子,即:输出图像上每个像素点的值都是由输入图像各像素点值加权求和的结果。
非线性滤波的算子中包含了取绝对值、置零等非线性运算。
线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。
非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现,如最大值滤波器、最小值滤波器、中值滤波器等,是通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。
boxFilter函数的作用是使用方框滤波(box filter)来模糊一张图片。
函数原型:
C++: void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor=Point(-1,-1),boolnormalize=true,int borderType=BORDER_DEFAULT)
<1>方框滤波示例:
#include
using namespace cv;
int main(int argc,char** argv) {
//载入原图
Mat image = imread("2.jpg");
//创建窗口
namedWindow("均值滤波【原图】");
namedWindow("均值滤波【效果图】");
//进行滤波操作
Mat out;
boxFilter(image, out, -1, Size(3, 3));
//显示
imshow("均值滤波【原图】", image);
imshow("均值滤波【效果图】", out);
waitKey();
return(0);
}
运行结果:
blur函数的作用是对输入的图像均值滤波后用dst输出。
函数原型:
C++: void blur(InputArray src,OutputArray,dst,Size ksize,Point anchor=Point(-1,-1),int borderType=BORDER_DEFAULT)
<2>均值滤波示例:
#include
using namespace cv;
int main(int argc,char** argv) {
//载入原图
Mat image = imread("2.jpg");
//创建窗口
namedWindow("均值滤波【原图】");
namedWindow("均值滤波【效果图】");
//进行滤波操作
Mat out;
blur(image,out,Size(7,7));
//显示
imshow("均值滤波【原图】", image);
imshow("均值滤波【效果图】", out);
waitKey();
return(0);
}
运行结果:
GaussianBlur函数的作用是用高斯滤波来模糊一张图片。
函数原型:
C++: void GaussianBlur(InputArray src,OutputArray dst,Size ksize,double sigmaX,double,sigmaY=0,int borderType=BORDER_DEFAULT)
<3>高斯滤波示例:
#include
using namespace cv;
int main(int argc,char** argv) {
//载入原图
Mat image = imread("2.jpg");
//创建窗口
namedWindow("高斯滤波【原图】");
namedWindow("高斯滤波【效果图】");
//进行滤波操作
Mat out;
GaussianBlur(image,out,Size(3,3),0,0);
//显示
imshow("高斯滤波【原图】", image);
imshow("高斯滤波【效果图】", out);
waitKey();
return(0);
}
运行结果:
#include
using namespace std;
using namespace cv;
//全局变量声明部分
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3;//存储图片的Mat类型
int g_nBoxFilterValue = 3;//方框滤波参数值
int g_nMeanBlurValue = 3;//均值滤波参数值
int g_nGaussianBlurValue = 3;//高斯滤波参数值
//全局函数声明部分
static void on_BoxFilter(int, void *);
static void on_MeanBlur(int, void *);
static void on_GaussianBlur(int, void *);
//main()函数
int main() {
//改变console字体颜色
system("color5E");
//载入原图
g_srcImage = imread("1.jpg", 1);//载入三通道彩色图像
if (!g_srcImage.data) {
printf("读取srcImage错误!\n");
return false;
}
//复制原图到三个Mat类型中
g_dstImage1 = g_srcImage.clone();//初始化目标图像大小,类型
g_dstImage2 = g_srcImage.clone();
g_dstImage3 = g_srcImage.clone();
//显示原图
namedWindow("<0>原图窗口",1);
imshow("<0>原图窗口", g_srcImage);
//====================【<1>方框滤波】=====================
//创建窗口
namedWindow("<1>方框滤波", 1);
//创建轨迹条
createTrackbar("内核值:", "<1>方框滤波", &g_nBoxFilterValue, 40, on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue, 0);//回调函数参数初始化
//=========================================================
//=====================【<2>均值滤波】=====================
namedWindow("<2>均值滤波", 1);
createTrackbar("内核值:", "<2>均值滤波", &g_nMeanBlurValue, 40, on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue, 0);
//=========================================================
//=====================【<3>高斯滤波】=====================
namedWindow("<3>高斯滤波", 1);
createTrackbar("内核值:", "<3>高斯滤波", &g_nGaussianBlurValue, 40, on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue, 0);
//=========================================================
//输出一些帮助信息
cout << endl << "\t,请调整轨迹条观察图像效果!\n\n" << "\t按下‘Q’键,程序退出!\n";
//按下Q键程序退出
while(char(waitKey(1))!='q'){}
return 0;
}
//=======================【on_BoxFilter()函数】==============================
static void on_BoxFilter(int, void *) {//回调函数参数格式
//方框滤波操作
boxFilter(g_srcImage, g_dstImage1, -1, Size(g_nBoxFilterValue + 1, g_nBoxFilterValue + 1));//ddepth=1,dst为原图深
//显示窗口
imshow("<1>方框滤波", g_dstImage1);
}
//=======================【on_MeanBlur()函数】===============================
static void on_MeanBlur(int, void *) {
blur(g_srcImage, g_dstImage2, Size(g_nMeanBlurValue + 1, g_nMeanBlurValue + 1), Point(-1, -1));
imshow("<2>均值滤波", g_dstImage2);
}
//=======================【on_GaussianBlur()函数】===========================
static void on_GaussianBlur(int, void *) {
GaussianBlur(g_srcImage, g_dstImage3, Size(g_nGaussianBlurValue*2 + 1, g_nGaussianBlurValue*2 + 1), 0, 0);
imshow("<3>高斯滤波", g_dstImage3);
}
运行效果:
注:高斯滤波内核宽高可以不一样,但必须都为正奇数!!!