图像平滑

  • 均值滤波
    原理:窗口中的像素值的权重都一样,比如3*3的Kernel:
    1 3 × 3 [ 1 1 1 1 1 1 1 1 1 ] \frac{1}{3\times 3} \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{matrix} \right]

Opencv的API

  1. 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);


结果:

在这里插入图片描述


  • 高斯滤波

二维高斯公式: G 0 ( x , y ) = A e ( x μ x ) 2 2 σ x 2 + ( y μ y ) 2 2 σ y 2 G0(x,y)=Ae^{\frac{−(x−μ_x)^2}{2σ_x^2}+\frac{−(y−μ_y)^2}{2σ_y^2}}

σ越大,曲线越扁平,反之,σ越小,曲线越瘦高

二维高斯模型如下:
在这里插入图片描述

滤波原理:核中间的权重最大,然后往四周逐渐减小


Opencv的API

  1. 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
  1. 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
  1. 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          //边缘像素的计算方式
    )

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/84845153
今日推荐