1、平滑处理smoothing(模糊处理bluring)
用途:减少图像上的噪点或失真;降低图像分辨率。
2、图像滤波
(1)图像滤波指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像处理中不可缺少的操作。
消除图像的噪声成分叫做图像的平滑化或滤波操作。信号或图像的能量部分集中在幅图谱的低频和中频段,而在较高频段有用的信息经常被噪声淹没。因此一个能降低高频成分幅度的滤波器就能够减弱噪声的影响。
(2)图像滤波的目的:①抽出对象的特征作为图像识别的特征模式;②为适应图像处理的要求,消除图像数字化时所混入的噪音。
(3)图像滤波处理的要求:①不能损坏图像的轮廓及边缘等重要信息;②使图像清晰视觉效果好。
*平滑滤波是低频增强的空间域滤波技术。目的有①模糊;②消除噪音
空间域的平滑滤波一般采用简单平均法进行,就是求邻近像元点 的平均亮度值。邻域越大平滑的效果越好,而过大使得边缘信息损失越大,所以要合理选择邻域的大小。
3、图像平滑处理操作方法(前三种线性滤波器、后两种非线性滤波器):
①方框滤波-------BoxBlur函数、
②均值滤波(邻域平均滤波)--------Blur函数
③ 高斯滤波-----------GaussianBlur函数
①中值滤波----------medianBlur函数
②双边滤波----------bilateralFilter函数
线性滤波器-----经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。如:
低通滤波器;高通滤波器;带通滤波器(允许一定范围频率通过);带阻滤波器(阻止一定范围频率通过);
全通滤波器(仅仅改变相位关系);陷波滤波器(特殊的带阻滤波器)。
①方框滤波(boxFilter函数)
函数原型:
void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,
Point anchor=Point(-1,-1),boolnormalize=true,int borderType=BORDER_DEFAULT);
参数一:输入的原图像(任意通道数的图像) ;
参数二: 目标图像,与原图尺寸、类型一样;
参数三:输出图像的深度(-1代表原图深度src.depth();)
参数四:内核的大小----Size(w,h)---w像素宽度,h像素高度Size(5,5)--5x5的核大小;
参数五:表示被平滑的那个点锚点(默认Point(-1,-1)---改点在核的中心);
参数六:默认true,表示内核是否被其区域归一化了。
参数七:用于推断图像外部像素的某种边界模糊式。默认BORDER_DEFAULT
②均值滤波(blur函数)---邻域平均法
均值滤波输出图像的每一个像素是核窗口内输入像对应像素的平均值即归一化的方框滤波。
邻域平均法用一片图像区域的各个像素的均值来代替原图像中的各个像素值。
缺点:不能很好保护图像的细节,不能很好的去处噪声点。
函数原型:
void blur(InputArray src,OutputArray dst,Size ksize,Point anchor=Point(-1,-1),int borderType=BORDER_DEFAULT);
③高斯滤波:GaussianBlur函数
可以消除高斯噪声,广泛应用于图像处理的减噪过程。高斯滤波就是对整幅图像进行加权平均的过程,每个像素点的值都由其本身和领域内的其它像素值经过加权平均后得到。(图像与正太分布做卷积)
函数原型:
void GaussianBlur(InputArray src,OutputArray dst,Size ksize,double sigmaX,
double sigmaY=0,intborderType=BORDER_DEFAULT);
参数四:表示高斯核函数在X方向的标准偏差
参数五:表示高斯核函数在Y方向的标准偏差
非线性滤波相关 核心API函数:
①中值滤波:medianBlur函数
对于多通道图片,它对每一个通道都单独进行处理,并且支持就地操作。
函数原型:
void medianBlur(InputArray src,OutputArray dst,int ksize);
参数三:孔径的线性尺寸,这个参数必须是大于1的奇数。
②双边滤波:bilateralFilter函数
函数原型:
void bilateralFilter(InputArray src,OutputArray dst,int d,double sigmaColor,
double sigmaSpace,int borderType=BORDER_DEFAULT);
参数三:表示在过滤过程中每个像素邻域的直径
参数四:颜色空间滤波的sigma值,越大表明该像素邻域内有越宽广的颜色会被混合在一起,产生较大的半相等颜色区域。
参数五:坐标空间中滤波器的sigma值,坐标空间的标注方差。越大意味着越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。
OpenCV中5种图像滤波综合示例:
//-----------------【图像滤波综合示例】----------------
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//-----------------【全局变量声明部分】--------------
// 描述:全局变量声明
//---------------------------------------------------
Mat g_srcImage, g_dstImage1, g_dstImage2, g_dstImage3,g_dstImage4, g_dstImage5;//存储图片的Mat类型
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 *);//双边滤波器
//-----------------【main()函数】------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-------------------------------------------------------------
int main() {
//改变console字体颜色
system("color 5E");
//载入原图
g_srcImage = imread("lenna.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();
g_dstImage4 = g_srcImage.clone();
g_dstImage5 = g_srcImage.clone();
//显示原图
namedWindow("<0>【原图窗口】");
imshow("<0>【原图窗口】",g_srcImage);
//---------------------【<1>方框滤波】--------------------------
//创建窗口
namedWindow("【<1>方框滤波】");
//创建轨迹条
createTrackbar("内核值:","【<1>方框滤波】",&g_nBoxFilterValue,40,on_BoxFilter);
on_BoxFilter(g_nBoxFilterValue,0);
imshow("【<1>方框滤波】", g_dstImage1);
//---------------------【<2>均值滤波】--------------------------
//创建窗口
namedWindow("【<2>均值滤波】");
//创建轨迹条
createTrackbar("内核值:", "【<2>均值滤波】", &g_nMeanBlurValue, 40, on_MeanBlur);
on_MeanBlur(g_nMeanBlurValue,0);
imshow("【<2>均值滤波】", g_dstImage2);
//---------------------【<3>高斯滤波】--------------------------
//创建窗口
namedWindow("【<3>高斯滤波】");
//创建轨迹条
createTrackbar("内核值:", "【<3>高斯滤波】", &g_nGaussianBlurValue, 40, on_GaussianBlur);
on_GaussianBlur(g_nGaussianBlurValue,0);
imshow("【<3>高斯滤波】", g_dstImage3);
//---------------------【<4>中值滤波】--------------------------
//创建窗口
namedWindow("【<4>中值滤波】");
//创建轨迹条
createTrackbar("内核值:", "【<4>中值滤波】", &g_nMedianBlurValue, 40, on_MedianBlur);
on_MedianBlur(g_nMedianBlurValue, 0);
imshow("【<4>中值滤波】", g_dstImage4);
//---------------------【<5>均值滤波】--------------------------
//创建窗口
namedWindow("【<5>双边滤波】");
//创建轨迹条
createTrackbar("内核值:", "【<5>双边滤波】", &g_nBilateralFilterValue, 40, on_BilateralFilter);
on_BilateralFilter(g_nBilateralFilterValue, 0);
imshow("【<5>双边滤波】", g_dstImage5);
//输出一些帮助信息
cout << endl << "\t,请调整滚动条观察图像效果~!\n\n" << "\t 按下q键时,程序退出~!\n";
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));
//显示窗口
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);
}
//-----------------【on_MedianBlur()函数】-------------------
// 描述:中值滤波操作的回调函数
//-------------------------------------------------------------
static void on_MedianBlur(int, void *) {
//中值滤波操作
medianBlur(g_srcImage, g_dstImage4,g_nMeanBlurValue*2+1);
//显示窗口
imshow("【<4>中值滤波】", g_dstImage4);
}
//-----------------【on_BilateralFilter()函数】-------------------
// 描述:双边滤波操作的回调函数
//-------------------------------------------------------------
static void on_BilateralFilter(int, void *) {
//双边滤波操作
bilateralFilter(g_srcImage, g_dstImage5, g_nBilateralFilterValue,g_nBilateralFilterValue*2,g_nBilateralFilterValue/2);
imshow("【<5>双边滤波】", g_dstImage5);
}
运行结果: