- 均值滤波
原理:窗口中的像素值的权重都一样,比如3*3的Kernel:
Opencv的API
- void cv::blur (
InputArray src, // 输入图像(可以任意通道,分别处理)
OutputArray dst, //输出图像(和输入图像的大小类型一样)
Size ksize, //核的大小
Point anchor = Point(-1,-1), //锚点,默认(-1,-1)代表核的中心,
int borderType = BORDER_DEFAULT //计算边缘的像素方法
)
Mat src = imread("../res/lena.jpeg");
Mat dst;
dst.create(src.size(),src.type());
blur(src,dst,Size(5,5));
imshow("src",src);
imshow("dst",dst);
waitKey(0);
结果:
- 高斯滤波
二维高斯公式:
σ越大,曲线越扁平,反之,σ越小,曲线越瘦高
二维高斯模型如下:
滤波原理:核中间的权重最大,然后往四周逐渐减小
Opencv的API
- void cv::GaussianBlur (
InputArray src, //源图像
OutputArray dst, //输出图像
Size ksize, //核的大小,长宽可以不同,但是必须是positive and odd
double sigmaX, // x方向的标准差
double sigmaY = 0, // y方向的标准差,如果是0->默认设置和x相同,
int borderType = BORDER_DEFAULT //边缘像素的计算方式
)
当sigmaX=1,sigmaY=11 得到的图像有种移动模糊的感觉
- 中值滤波
滤波原理:基于统计的滤波方式,先将核大小内的像素进行排序,取中间数。
Opencv的API
- void cv::medianBlur (
InputArray src, //输入图像
OutputArray dst, //输出图像(same size and type as src)
int ksize // 是正方形核的边长,所以就1个值,must be odd and greater than 1, for example: 3, 5, 7 …
)
- 双边滤波
滤波原理:
大部分滤波器能有效去除噪声,但是有的地方我们并不希望对其滤波,比如物体与物体之间的交界处(通常像素变化很大),这样衍生出双边滤波,在正常的区域,我们用高斯滤波;在交界处(像素变化大的地方)我们不进行高斯滤波。这样既进行滤波也能很好的保留边缘特性。
其中滤波器的核由两个函数函数生成:
(1)由欧式距离决定的核系数(二维高斯)
其中,(k,l)为模板窗口的中心坐标;(i,j)为模板窗口的其他系数的坐标
(2)由像素的差值决定的核系数(一维高斯)
f(x,y)表示图像在点(x,y)处的像素值
最终两个模板相乘就得到了双边滤波器的模板:
在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息。
作者给的二维图:
Opencv的API
- void cv::bilateralFilter (
InputArray src, //输入图像
OutputArray dst, //输出图像(same size and type as src)
int d, //像素滤波邻域的直径,如果<0, 则从sigmaSpace计算得到。
double sigmaColor, // 颜色域的标准差
double sigmaSpace, //空间域的标准差。
int borderType = BORDER_DEFAULT //边缘像素的计算方式
)