當前位置: 妍妍網 > 碼農

OpenCV築基之傅立葉變換

2024-05-29碼農

在影像處理中,影像可以用不同域來表示和分析。

下面是幾種最常用的域:

  • 空間域 是指由影像像素組成的空間。

  • 時域 是指影像隨時間變化的域。對於動態影像,例如視訊,時域表示影像幀隨時間的變化。時域處理是指對影像序列進行操作,例如運動分析、視訊壓縮等。

  • 頻域 是將影像從空間域變換到頻率域得到的表示。在頻域中,影像被表示為一個二維復數矩陣,其中每個元素代表影像中某一特定頻率分量的振幅和相位。

  • 影像的空間域、時域和頻域是三種不同的表示影像資訊的視角,這三者之間可以相互轉換。

    時域影像和頻域影像.png

    1. 頻域

    影像的 頻域 是透過 傅立葉變換 將影像從空間域轉換到頻率域而得到的。在頻域中,影像的每個像素點都被表示為一個復數,其振幅表示該頻率分量的能量,相位表示該頻率分量的初始相位。

    在空間域中,影像由像素值矩陣表示,每個像素值代表影像在該位置的顏色或亮度。在頻率域中,影像由 頻譜圖 表示,頻譜圖上的每個點代表影像中特定頻率的成分。影像的頻率域與空間域具有互補關系,影像的任何資訊都可以在空間域和頻率域中找到。

    頻率域濾波的基本原理是將影像變換到頻率域,然後利用濾波器對影像的頻譜分量進行處理,最後將濾波後的頻譜分量變換回空間域得到濾波後的影像。

    在頻率域中,影像的每個像素點都對應著一個頻率分量。低分頻量對應於影像中的平滑區域和整體形狀,而高分頻量對應於影像中的細節和邊緣。

    空間域和頻率域的濾波器可以分為四類: 低通、高通、帶阻、帶通濾波器。

  • 低通濾波器 允許低分頻量透過,抑制高分頻量。低分頻量通常對應於影像中的平滑區域和整體亮度變化,可以用於 平滑影像 ,去除雜訊和模糊細節。

  • 高通濾波器 允許高分頻量透過,抑制低分頻量。高分頻量對應於影像中的邊緣和細節,可以用於 銳化影像 ,增強影像的邊緣和細節。

  • 帶通濾波器 只允許特定頻率範圍內的訊號透過,抑制其他頻率範圍內的訊號。可以用於 提取影像中的特定特征 ,例如紋理或邊緣。

  • 帶阻濾波器 抑制特定頻率範圍內的訊號,允許其他頻率範圍內的訊號透過。可以用於 去除影像中的特定雜訊 ,例如莫耳紋。

  • 2. 影像銳化的原理

    在該系列的第三十一篇文章中介紹過影像銳化。銳化的目的是為了突出影像的邊緣資訊 ,加強影像的輪廓特征,以便於人眼的觀察和機器的辨識。

    在空間域,可以用空間微分來實作銳化。微分算子的響應強度與影像在該點的突變程度有關,影像微分增強了邊緣和其他突變(如雜訊)而消弱了灰度變化緩慢的區域。

    在頻率域,由於影像中的邊緣、線條等細節部份與影像頻譜中的高分頻量相對應,在頻率域中使用 高通濾波器 能夠使影像的邊緣或線條變得清晰,從而使影像得到銳化。高通濾波器衰減傅立葉變換中的低分頻量,讓高分頻量順利透過,使低分頻量受到抑制,就可以增強高頻的成分。使影像的邊沿或線條變得清晰,從而實作影像的銳化。

    3. 傅立葉變換

    空間域、時域和頻域之間可以透過傅立葉變換(Fourier Transform)進行轉換。傅立葉變換是一種數學工具,可以將訊號從一個域變換到另一個域。

  • 空間域到頻域的傅立葉變換 :將影像從空間域 (x,y) 變換到頻域 (u,v) ,可以得到影像的 頻譜 。影像的頻譜可以反映影像的頻率成分,例如影像中邊緣、紋理等資訊的分布。

  • 頻域到空間域的傅立葉逆變換 :將影像從頻域變換回空間域,可以得到原始影像。

  • 先上基礎的公式作為直觀地感受,後續文章會做介紹。

    一維連續傅立葉變換:

    一維連續傅立葉逆變換:

    一維離散傅立葉變換:

    一維離散傅立葉逆變換:

    二維連續傅立葉變換:

    二維連續傅立葉逆變換:

    二維離散傅立葉變換:

    二維離散傅立葉逆變換:

    影像傅立葉變換的計算通常使用離散傅立葉變換(Discrete Fourier Transform,DFT)來實作。DFT 是傅立葉變換的離散化版本,它可以將影像離散化成有限大小的矩陣,然後使用矩陣乘法來計算影像的傅立葉變換。

    對於二維離散傅立葉變換,f(x,y) 表示大小為 M*N 的數位影像。 表示 f(x,y) 的傅立葉變換。

    在式中 f(x,y) 所在座標系被稱為空間域, 由 x = 0,1,2,···,M-1 和 y = 0,1,2,···,N-1 所定義的 M x N 矩陣常被稱為空間域矩陣。 所在座標系被稱為頻域,由 u = 0,1,2,···,M-1 和 v = 0,1,2,···,N-1 定義的 M x N 矩陣常稱為頻域矩陣。

    下面的例子,展示了灰度影像經過傅立葉變換後生成頻譜圖的過程。

    為了便於頻域和頻譜分析,在傅立葉變換後進行頻譜中心化,即對調頻譜的四個象限。頻譜中心化後,中間最亮的點是低頻率,屬於直流分量,越往外頻率越高。

    #include<opencv2/opencv.hpp>
    #include<opencv2/core.hpp>
    #include<opencv2/highgui.hpp>
    usingnamespace cv;
    usingnamespacestd;
    voidmyDFT(Mat src, Mat& dst)
    {
    // 擴充邊界
    int m = getOptimalDFTSize(src.rows);
    int n = getOptimalDFTSize(src.cols);
    copyMakeBorder(src, src, 0, m - src.rows, 0, n - src.cols, BORDER_CONSTANT, Scalar::all(0));
    // 建立一個雙鍊結矩陣 planes,用來儲存復數的實部與虛部
    Mat planes[] = {Mat_<float>(src), Mat::zeros(src.size(), CV_32F) };
    Mat complexI;
    // 增加一個通道,將兩個 planes 合並,為了儲存復數
    merge(planes, 2, complexI);
    // 進行離散傅立葉變換
    dft(complexI, complexI);
    split(complexI, planes); // 將雙鍊結分為兩個單鍊結,一個表示實部,一個表示虛部
    magnitude(planes[0], planes[1], dst); //計算復數的幅值,保存在頻譜圖 dst
    // M = log(1 + M)
    dst += Scalar(1); // 取對數前將所有的像素都加1,防止 log0
    log(dst, dst); // 取對數
    normalize(dst, dst, 01, NORM_MINMAX); //歸一化
    imshow("dft", dst); // 二維離散傅立葉
    // 剪下和重分布振幅影像限,如果有奇數行或奇數列,進行頻譜裁剪
    dst = dst(Rect(00, dst.cols & -2, dst.rows & -2));
    // 重新排列傅立葉影像中的象限,將頻譜中心移至影像中心
    int cx = dst.cols / 2;
    int cy = dst.rows / 2;
    Mat q0(dst, Rect(00, cx, cy)); // 左上區域
    Mat q1(dst, Rect(cx, 0, cx, cy)); // 右上區域
    Mat q2(dst, Rect(0, cy, cx, cy)); // 左下區域
    Mat q3(dst, Rect(cx, cy, cx, cy))// 右下區域
    /*
    origin:
    q0 | q1
    q2 | q3
    new:
    q3 | q2
    q1 | q0
    */

    // 交換象限
    Mat tmp;
    q0.copyTo(tmp);
    q3.copyTo(q0);
    tmp.copyTo(q3);// q0 與 q3 進行交換
    q1.copyTo(tmp);
    q2.copyTo(q1);
    tmp.copyTo(q2);// q1 與 q2 進行交換
    }
    intmain()
    {
    Mat src = imread(".../girl.jpg");
    Mat gray, dst;
    imshow("src", src);
    cvtColor(src, gray, COLOR_BGR2GRAY);
    imshow("gray", gray);
    myDFT(gray, dst); // 傅立葉變換
    imshow("dst", dst); // 零頻率分量移至頻譜中心
    waitKey(0);
    return0;
    }















    原圖和灰度影像.png

    二維dft和頻譜中心化後的頻譜圖.png

    4. 總結

    「萬物皆可傅立葉」,本文是傅立葉變換在該系列的一個開篇,後續還會繼續介紹其在影像處理中的套用。

    在影像處理領域,傅立葉變換可以將影像從空間域變換到頻域,從而揭示影像的頻率成分。傅立葉變換在影像處理中有著廣泛的套用,例如:影像增強、影像分割、特征提取、影像壓縮等。


    推薦閱讀

    掃碼檢視深度學習系統化學習路線圖