1.图像滤波是一个修改或增加图像的过程,加强一幅图像中的某些特征或消除其他特征都是在进行图像滤波操作。
2.滤波是一种邻域运算,邻域是一个选定区域范围的像素集合。
3.通过利用在该像素周围一定邻域内像素集合的值执行某些运算,图像滤波确定了位于(x,y)处某个像素的输出值。
4.常见的图像滤波有平滑或锐化。
平滑又称模糊,是经常用来降噪的一种图像处理操作。通过对图像应用线性滤波来执行平滑操作。将在(x,y)位置及其周围邻域的输入像素值的加权和计算值作为在(x,y)处的输出像素值。在线性运算中,像素的权值通常存储在一个又称为核的矩阵中。
令K表示核,I核O分别表示输入图像核输出图像,那么在每个(i,j)处的输出像素可计算如下:
✯✯✯ OpenCV平滑滤波主要有:中值滤波、高斯滤波和双边滤波。
(1)盒式滤波
void boxFilter(InputArray src,OutputArray dst,int ddepth,Size ksize,Point anchor=Point(-1,-1),bool normalize=true,int borderType=BORDER_DEFAULT);
说明:
①盒子滤波核系数是相等的。
②对normalize=true,每个 输出像素值是其核邻域的均值,其所有都等于1/n,此处n为元素的个数。对normalize=false,所有的系数都等于1。
③参数src是输入图像,而滤波后的图像存储在dst中。
④参数ddepth表示输出图像的深度,-1表示与输入图像使用相同的深度。
⑤核的大小用ksize表示。
⑥点anchor表示定位像素的位置,其默认值(-1,-1)意味着定位像素是核 的中心。
⑦边界类型用参数borderType表示。
(2)高斯滤波
void GaussianBlur(InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY=0,int borderType=BORDER_DEFAULT);
说明:
①该函数通过对src输入数组中的每个点用一个高斯核计算卷积,产生dst输出。
②参数sigmaX和sigmaY表示在X和Y方向上高斯核的标准偏差,又称均方差。
③如果sigmaX为0,则将sigmaY设置为与sigmaX相等;如果sigmaX和sigmaY都设置为0,则使用ksize中给定的宽度和高度计算sigmaX和sigmaY。
④高斯滤波更适合边缘检测的预处理阶段。
(3)中值滤波
void medianBlur(InputArray src,OutputArray dst,int ksize);
说明:
①该函数作用于图像的每个元素,并用邻域像素的中值替换每个像素。
②中值滤波适合去除椒盐噪声或斑点噪声;
(4)双边滤波
void bilateralFilter(InputArray src,OutputArray dst,int d,double sigmaColor,double siigmaSpace,int borderType=BORDER_DEFAULT);
说明:
①该函数与高斯滤波类似,将具有权值的邻域像素赋值给每个像素,但与高斯滤波方法以及另一个考虑邻域和被估计像素之间强度的差值的滤波方法相同,每个权值仅有2个分量;
②该函数需要像素邻域的直径作为参数d,以及sigmaColor和sigmaSpace参数值;
③参数sigmaColor的一个较大值意味着像素邻域内相差更远的颜色会被混合,生成的半对等颜色的面积也就越大;
④参数sigmaSpace的一个较大值意味着只要像素之间的颜色足够接近,则更远的像素之间会相互影响;
⑤双边滤波对于平滑强边缘图像是一种很好的技术。
(5)模糊滤波
void blur(InputArray src,OutputArray dst,Size ksize,Point anchor=Point(-1,-1),int borderType=BORDER_DEFAULT);
说明:
①该函数使用归一化盒式滤波来模糊一幅图像,等价于使用normalize=true值的boxFilter函数。
②该函数的使用核为:
✯✯✯ OpenCV使用外推法来推断图像边界外部不存在的像素的像素值。外推法有:
①BORDER_REPLICATE:该方法重复最后一个已知的像素值,例如aaaaaaa|abcdeefgh|hhhhhhh;
②BORDER_REFLEFT_101:该方法反映了不用重复边界的最后一个像素的图像边界,例如gfedcb|abcdefgh|gfedcba;
③BORDER_WRAP:该方法添加相对边界的值,例如cdefgh|abcdefgh|abcdefg;
④BORDER_CONSTANT:该方法在新边界上创建一个常量:kkkkkk|abcdefgh|kkkkkk。
// 27.08.2019 by yh
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main()
{
//读取源文件
Mat src;
src = imread("C:\\Users\\86151\\Pictures\\图像处理常用图片\\Set12\\04.png");
//应用滤波器
Mat dst, dst2;
GaussianBlur(src,dst,Size(9,9),0,0);
medianBlur(src,dst2,9);
//显示结果
namedWindow("ORIGINAL", WINDOW_NORMAL);
imshow("ORIGINAL",src);
namedWindow("GAUSSIAN BLUR", WINDOW_NORMAL);
imshow("GAUSSIAN BLUR",dst);
namedWindow("MEDIAN BLUR", WINDOW_NORMAL);
imshow("MEDIAN BLUR", dst2);
waitKey();
return 0;
}
End && Enjoy!