当前位置: 欣欣网 > 码农

OpenCV筑基之图像的卷积与滤波

2024-03-25码农

1. 图像的卷积

1.1 卷积

卷积 是一种数学运算,它将两个函数(或矩阵)结合起来,生成一个第三个函数。在图像处理中,卷积通常用于将一个 滤波器 与图像进行运算。

图像的 滤波器 是一种用于 增强或抑制图像中特定特征 的工具。它通常是一个小矩阵,定义了如何对图像中的像素进行操作。

卷积在图像处理中有很多应用,包括图像平滑、图像锐化、边缘检测和图像分割。

1.2 卷积的原理

在泛函分析中, 卷积 (convolution),或译为 叠积 褶积 旋积 ,是透过两个函数 f 和 g 生成第三个函数的一种数学算子,表征函数 f 与经过翻转和平移的 g 的乘积函数所围成的曲边梯形的面积。

卷积可分为一维卷积、二维卷积、三维卷积和多维卷积等。

1.2.1 一维卷积

一维卷积在数学上的定义: f 和 g 是实数 R 上的两个可积函数,我们称 (f*g)(n) 为 f、g 的卷积。

其连续的定义为:

其离散的定义为:

1.2.2 二维卷积

在图像处理中,我们常用的是二维卷积。其原理是将一个称为 卷积核 (滤波器)的矩阵与图像进行 滑动运算 ,从而得到一个新的图像。

2D_Convolution_Animation.gif

滑动运算 是指将卷积核在图像上逐个像素移动,并对每个位置进行卷积操作。

在图像的二维卷积中,如果把图像矩阵简写为 I 把卷积核 Kernal 简写为 K,则目标图像的第 (i,j) 个像素的卷积值为:

其中,I 是一个二维矩阵,K 是一个大小为 mxn 的卷积核。基于卷积的可交换性,可以把上述公式改成:

与之类似的还有 互相关函数 (corresponding function):

它在很多图像处理库和深度学习库中,经常会用到。

上图实质上是 二维单通道 的卷积,对于 二维多通道 的卷积如下图所示,将每个卷积核应用到每一个通道上。

将filters中的每个kernels分别应用于三个通道.gif

然后将每个通道处理后的每个加在一起以形成单个输出通道。

将这三个通道加在一起(逐元素加法)以形成一个单个通道.gif

1.2.3 三维卷积

三维卷积是卷积在三维空间上的推广。它将一个三维的滤波器与一个三维的输入数据进行卷积运算,得到一个三维的输出数据,以提取三维数据中的特征。主流的深度学习框架,都提供了三维卷积的实现。

3D_Convolution_Animation.gif

1.3 卷积的性质

卷积具有交换律、结合律、分配律,以二维卷积为例它具有以下的性质:

  • 交换律 :f(x, y) * g(x, y) = g(x, y) * f(x, y)

  • 结合律 :(f(x, y) * g(x, y))* h(x, y) = f(x, y) * (g(x, y) * h(x, y))

  • 分配律 :f(x, y) * (g(x, y) + h(x, y)) = f(x, y) * g(x, y) + f(x, y) * h(x, y)

  • 2. 图像滤波

    2.1 图像滤波

    图像滤波 是一种图像处理技术,用于增强或抑制图像中的特定特征,它可以看作是卷积的一种特殊情况。图像滤波可以用图像卷积来实现,但是图像卷积不一定是图像滤波。

    在 OpenCV 中,提供了丰富的图像滤波函数,可以满足各种图像处理需求。常用图像滤波函数包括:

  • 均值滤波: blur() boxFilter()

  • 高斯滤波: GaussianBlur()

  • 中值滤波: medianBlur()

  • 双边滤波: bilateralFilter()

  • 非线性滤波: fastNlMeansDenoising()

  • 边缘检测滤波: Sobel() Scharr() Laplacian()

  • 形态学滤波: erode() dilate() morphologyEx()

  • 频域滤波: dft() idft()

  • 下面的例子,分别展示了原图经过均值滤波、高斯滤波、中值滤波和双边滤波之后的效果图。特别是双边滤波,对原图中的美女进行了美颜和磨皮。

    #include<opencv2/opencv.hpp>
    #include<opencv2/core.hpp>
    #include<opencv2/highgui.hpp>
    #include<opencv2/imgproc.hpp>
    usingnamespacestd;
    usingnamespace cv;
    intmain(){
    Mat src = imread(".../girl.jpg");
    // 均值滤波
    Mat blurred_image;
    blur(src, blurred_image, Size(1515));
    // 高斯滤波
    Mat gaussian_blurred_image;
    GaussianBlur(src,gaussian_blurred_image, Size(1515), 0);
    // 中值滤波
    Mat median_blurred_image;
    medianBlur(src, median_blurred_image,15);
    // 双边滤波
    Mat bilateral_filtered_image;
    bilateralFilter(src, bilateral_filtered_image,158080);
    imshow("Original Image", src);
    imshow("Blurred Image", blurred_image);
    imshow("Gaussian Blurred Image", gaussian_blurred_image);
    imshow("Median Blurred Image", median_blurred_image);
    imshow("Bilateral Filtered Image", bilateral_filtered_image);
    waitKey(0);
    return0;
    }






    原图和均值滤波.png

    高斯滤波和中值滤波.png

    原图和双边滤波.png

    OpenCV 还提供了自定义的滤波器 filter2D() 函数,在该系列的第九篇文章中,曾经介绍过 filter2D() 函数。

    下面的例子,展示了使用 filter2D() 函数对图像进行模糊和锐化。

    #include<opencv2/opencv.hpp>
    #include<opencv2/core.hpp>
    #include<opencv2/highgui.hpp>
    #include<opencv2/imgproc.hpp>
    usingnamespacestd;
    usingnamespace cv;
    intmain(){
    Mat src = imread(".../girl.jpg");
    imshow("src", src);
    Mat blurred_image,sharpen_image;
    Mat kernel1 = Mat::ones(55, CV_32F) / (float)(25);
    Mat kernel2 = (Mat_<char>(33) << 0-10-15-10-10);
    filter2D(src, blurred_image, -1, kernel1);
    filter2D(src, sharpen_image, -1, kernel2);
    imshow("Blurred Image", blurred_image);
    imshow("Sharpen Image", sharpen_image);
    waitKey(0);
    return0;
    }





    filter2D函数实现的滤波.png

    下面简单解释一下 filter2D() 函数:

    voidfilter2D( InputArray src, OutputArray dst, int ddepth,
    InputArray kernel, Point anchor = Point(-1,-1),
    double delta = 0int borderType = BORDER_DEFAULT )
    ;

    第三个参数 ddepth: 输出图像的深度。当 ddepth 输入值为 -1 时,目标图像和原图像深度保持一致。

    第四个参数 kernel: 卷积核。

    第五个参数 anchor: 卷积核的锚点。

    第六个参数 delta: 卷积结果与原图像相加的值。

    第七个参数 borderType: 边界处理方式。

    2.2 图像滤波的分类

    根据滤波器在图像域和频域的操作方式,图像滤波可以分为空间域滤波和频域滤波。

    2.2.1 空间域滤波

    空间域滤波直接对图像中的像素进行操作,根据滤波器与图像像素之间的空间关系来计算输出像素的值。空间域滤波的计算量通常较小,但滤波效果往往比较局限。

    空间域滤波按滤波器的线性特性又可分为:

  • 线性滤波 :滤波器输出与输入之间呈线性关系。

    常用的线性滤波器包括:

    a 均值滤波:用于去除图像噪声,具有平滑图像的效果。

  • b 高斯滤波:具有平滑图像和边缘保持的效果。

    c 中值滤波:具有去除椒盐噪声和保持边缘细节的效果。

    d 拉普拉斯滤波:用于边缘检测。

  • 非线性滤波 :滤波器输出与输入之间不呈线性关系。

    常用的非线性滤波器包括:

    a 中值滤波:用于去除椒盐噪声和保持边缘细节。

  • b 双边滤波:具有平滑图像和保持边缘细节的效果。

    c 自适应滤波:根据图像局部特性进行滤波,具有较好的滤波效果。

    2.2.2 频域滤波

    频域滤波是将图像傅里叶变换到频域,然后对频谱进行滤波,最后再将频谱逆傅里叶变换回空间域得到滤波后的图像。频域滤波的计算量通常较大,但滤波效果往往比较灵活。

    频域滤波按滤波器的作用方式又可分为:

  • 低通滤波 :滤除图像中的高频成分,具有平滑图像的效果。

  • 高通滤波 :滤除图像中的低频成分,具有锐化图像的效果。

  • 带通滤波 :滤除图像中的特定频段成分,具有增强图像纹理的效果。

  • 3. 总结

    图像卷积和图像滤波是图像处理中两个密切相关的概念。它们都涉及到使用滤波器对图像进行操作,以获得新的图像。

    图像卷积是图像滤波的基础,图像滤波可以通过图像卷积来实现,但图像滤波也可以使用其他方法来实现。

    图像卷积和图像滤波具有广泛的应用,通过使用不同的滤波器,可以实现各种图像处理效果。

    推荐阅读