當前位置: 妍妍網 > 碼農

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. 總結

    影像摺積和影像濾波是影像處理中兩個密切相關的概念。它們都涉及到使用濾波器對影像進行操作,以獲得新的影像。

    影像摺積是影像濾波的基礎,影像濾波可以透過影像摺積來實作,但影像濾波也可以使用其他方法來實作。

    影像摺積和影像濾波具有廣泛的套用,透過使用不同的濾波器,可以實作各種影像處理效果。

    推薦閱讀