OpenCV 筆記(36):頻域高通濾波——理想高通濾波器

1. 頻域高通濾波

頻域高通濾波是一種數(shù)字圖像處理技術,通過在頻域中對圖像進行處理增強圖像的高頻成分,從而達到銳化圖像邊緣和細節(jié)的目的。

高頻成分: 圖像中的高頻成分對應著圖像的邊緣、紋理等細節(jié)信息。
低頻成分: 圖像中的低頻成分對應著圖像的平滑區(qū)域。

1.1 頻域高通濾波和空域高通濾波

頻域高通濾波和空域高通濾波都是為了增強圖像的邊緣和細節(jié),但它們在工作原理、實現(xiàn)方式、濾波效果等很多地方有所不同。

  1. 處理域的不同
  • 頻域高通濾波: 將圖像從空間域變換到頻率域,通過設計高通濾波器,在頻域中對圖像的頻率成分進行濾波,再將結果轉換回空間域。
  • 空域高通濾波: 直接在圖像的空間域上,利用卷積操作和預定義的濾波器模板對圖像進行處理。
  1. 實現(xiàn)方式不同
  • 頻域高通濾波: 基于傅里葉變換的原理,將圖像分解為不同頻率的成分,通過濾波器保留高頻成分,抑制低頻成分。
  • 空域高通濾波: 通過模板與圖像像素的卷積運算,實現(xiàn)對圖像的濾波。高通濾波模板通常具有中心為正值,周圍為負值的結構,用于增強圖像的邊緣和細節(jié)。
  1. 濾波效果不同
  • 頻域高通濾波:

    • 能夠更精確地控制圖像的銳化程度,但容易產(chǎn)生振鈴現(xiàn)象。
    • 對噪聲比較敏感,容易放大高頻噪聲。
  • 空域高通濾波:

    • 實現(xiàn)簡單,但銳化效果可能不如頻域濾波器。
    • 對噪聲的魯棒性相對較好。
  1. 應用場景不同
  • 頻域高通濾波:

    • 適用于對圖像銳化程度要求較高,且對噪聲不敏感的場合。
    • 常用于圖像增強、邊緣檢測等領域。
  • 空域高通濾波:

    • 適用于對實時性要求較高,且對計算資源有限的場合。
    • 常用于圖像預處理、特征提取等領域。

簡單歸納一下頻域高通濾波和空域高通濾波的區(qū)別:

特征 頻域高通濾波 空域高通濾波
原理 頻域變換,增強高頻 空間域卷積
實現(xiàn) 傅里葉變換,逆變換 卷積運算
濾波效果 銳化效果好,易產(chǎn)生振鈴 銳化效果較好,對噪聲魯棒
應用 高精度銳化,邊緣檢測 實時處理,特征提取

1.2 頻域高通濾波分類

常用的頻域高通濾波器包括:

  • 理想高通濾波器(IHPF):具有一個明確的截止頻率,高于截止頻率的頻率成分全部通過,低于截止頻率的頻率成分全部被阻擋。
  • 巴特沃斯高通濾波器(BHPF): 在通帶內(nèi),頻率響應曲線非常平坦,保證了信號的原始特性。在阻帶內(nèi),信號被逐漸衰減,有效地抑制了噪聲和其他干擾信號。
  • 高斯高通濾波器(GHPF):通過將一個高斯低通濾波器從一個全通濾波器(即傳遞函數(shù)為1的濾波器)中減去得到的。換句話說,高斯高通濾波器就是讓高頻成分通過,而衰減低頻成分。

2. 理想高通濾波器

理想高通濾波器的傳播函數(shù)可以表示為:

H(u,v)= \begin{cases} 1, & D(u,v) > D_0 \\ 0, & D(u,v) \le D_0 \end{cases}

其中,D_0 是截止頻率,D(u,v) 表示頻域中一點到頻域中心的距離。

理想高通濾波器的特點如下:

  • 截斷頻率分明: 高于截止頻率的成分全部通過,低于截止頻率的成分完全阻擋。
  • 頻譜中出現(xiàn)明顯的振鈴現(xiàn)象: 由于理想濾波器的頻譜是一個矩形函數(shù),在進行傅里葉逆變換時,會導致圖像邊緣出現(xiàn)振鈴現(xiàn)象。
  • 對噪聲敏感: 理想高通濾波器會放大高頻噪聲,導致圖像質(zhì)量下降。
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <random>

using namespace std;
using namespace cv;

// 理想高通濾波核函數(shù)
cv::Mat ideal_high_kernel(cv::Mat &scr, float d0)
{
    cv::Mat ideal_high_pass(scr.size(), CV_32FC1);
    for (int i = 0; i < scr.rows; i++) {
        for (int j = 0; j < scr.cols; j++) {
            float d = sqrt(pow(float(i - scr.rows / 2), 2) + pow(float(j - scr.cols / 2), 2));//分子,計算pow必須為float型
            if (d <= d0) {
                ideal_high_pass.at<float>(i, j) = 0;
            }
            else {
                ideal_high_pass.at<float>(i, j) = 1;
            }
        }
    }
    return ideal_high_pass;
}

// fft 變換后進行頻譜中心化
void fftshift(cv::Mat &plane0, cv::Mat &plane1)
{
    int cx = plane0.cols / 2;
    int cy = plane0.rows / 2;
    cv::Mat q0_r(plane0, cv::Rect(0, 0, cx, cy));  // 元素坐標表示為(cx, cy)
    cv::Mat q1_r(plane0, cv::Rect(cx, 0, cx, cy));
    cv::Mat q2_r(plane0, cv::Rect(0, cy, cx, cy));
    cv::Mat q3_r(plane0, cv::Rect(cx, cy, cx, cy));

    cv::Mat temp;
    q0_r.copyTo(temp);  //左上與右下交換位置(實部)
    q3_r.copyTo(q0_r);
    temp.copyTo(q3_r);

    q1_r.copyTo(temp);  //右上與左下交換位置(實部)
    q2_r.copyTo(q1_r);
    temp.copyTo(q2_r);

    cv::Mat q0_i(plane1, cv::Rect(0, 0, cx, cy));  //元素坐標(cx,cy)
    cv::Mat q1_i(plane1, cv::Rect(cx, 0, cx, cy));
    cv::Mat q2_i(plane1, cv::Rect(0, cy, cx, cy));
    cv::Mat q3_i(plane1, cv::Rect(cx, cy, cx, cy));

    q0_i.copyTo(temp);  //左上與右下交換位置(虛部)
    q3_i.copyTo(q0_i);
    temp.copyTo(q3_i);

    q1_i.copyTo(temp);  //右上與左下交換位置(虛部)
    q2_i.copyTo(q1_i);
    temp.copyTo(q2_i);
}

// 頻率域濾波
cv::Mat frequency_filter(cv::Mat &src, cv::Mat &blur)
{
    Mat mask = src == src;
    src.setTo(0.0f, ~mask);

    // 創(chuàng)建一個雙通道矩陣 planes,用來儲存復數(shù)的實部與虛部
    Mat planes[] = {src.clone(), cv::Mat::zeros(src.size() , CV_32FC1) };

    Mat complexI;
    merge(planes, 2, complexI); // 合并通道 (把兩個矩陣合并為一個2通道的Mat類容器)
    dft(complexI, complexI); // 進行傅立葉變換,結果保存在自身

    // 分離通道(數(shù)組分離)
    cv::split(complexI, planes);

    // 頻譜中心化
    fftshift(planes[0], planes[1]);

    //  H(u, v) * F(u, v)
    Mat blur_r, blur_i, dst;
    multiply(planes[0], blur, blur_r);  // 濾波(實部與濾波器模板對應元素相乘)
    multiply(planes[1], blur, blur_i);  // 濾波(虛部與濾波器模板對應元素相乘)
    Mat planes1[] = {blur_r, blur_i };

    // 頻譜中心化
    fftshift(planes1[0], planes1[1]);
    merge(planes1, 2, dst); // 實部與虛部合并

    // 傅里葉逆變換
    idft(dst, dst);       // idft 結果也為復數(shù)
    dst = dst / dst.rows / dst.cols;

    split(dst, planes1);//分離通道,主要獲取通道

    return planes1[0];
}

int main()
{
    Mat src = imread(".../girl.jpg");
    imshow("src", src);

    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    imshow("gray", gray);

    // 擴充邊界
    int w = getOptimalDFTSize(gray.cols);
    int h = getOptimalDFTSize(gray.rows);

    Mat padded;
    // 常量法擴充圖像邊界,常量 = 0
    cv::copyMakeBorder(gray, padded, 0, h - gray.rows, 0, w - gray.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));
    padded.convertTo(padded, CV_32FC1);

    float D0 = 5.0f;
    Mat kernel = ideal_high_kernel(padded, D0);
    Mat dst = frequency_filter(padded, kernel);

    convertScaleAbs(dst, dst);
    imshow("dst", dst);

    waitKey(0);
    return 0;
}
灰度圖像vs理想高通濾波的效果.png

3. 總結

本文介紹了頻域高通濾波、理想低通濾波器,以及頻域高通濾波和空域高通濾波的區(qū)別。

理想高通濾波器也是在理論上具有完美的濾波效果,但在實際應用中卻存在著嚴重的振鈴現(xiàn)象和對噪聲敏感的問題。因此,在實際圖像處理中會采用一些近似的濾波器,如巴特沃斯高通濾波器、高斯高通濾波器等來替代理想高通濾波器。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容