日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

图像降噪算法——小波硬阈值滤波(下)

發布時間:2025/3/20 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像降噪算法——小波硬阈值滤波(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖像降噪算法——小波硬閾值濾波(下)

  • 圖像降噪算法——小波硬閾值濾波(下)
    • 1. 基本原理
    • 2. C++代碼實現
    • 3. 結論

圖像降噪算法——小波硬閾值濾波(下)

1. 基本原理

關于離散小波變換的原理在

圖像降噪算法——小波硬閾值濾波(上)

中已經有了非常詳細的總結,這里介紹下本博客利用離散小波變換進行降噪的原理(其實不能算是降噪,應該算是圖像壓縮),就是在小波變換之后,將輸出系數進行由大到小的排序,然后將前10%大的通過小波反變換成圖像,因為噪聲不屬于圖像的主要信息,因此通過這種方法會有降噪的效果,這種算法又稱為小波硬閾值濾波。

2. C++代碼實現

這里是基于OpenCV、FFTW以及C++ Wavelet Libraries,這其中
(1)FFTW是一個基于C寫的實現傅里葉變換和小波變換的基礎庫,鏈接戳這里,源碼安裝后用CmakeList鏈接到靜態庫文件即可。
(2)C++ Wavelet Libraries是利用FFTW封裝的一個小波變換處理圖像的庫,下載鏈接戳這里,這里主要是用到了它的wavelet2d.cpp和wavelet2d.h兩個文件。
我封裝的小波變換的降噪算法如下:

Mat Denoise::WaveletFilter(const Mat &src, int num, int percentage) {//需要講Mat數據結構轉換為vector數據結構vector<vector<double>> dwtInput(src.rows, vector<double>(src.cols));for(int i = 0; i<src.rows; i++){for(int j = 0; j<src.cols; j++){dwtInput[i][j] = (double)src.at<uchar>(i,j);}}//計算小波變換,輸出結果是outputvector<int> dwtLength;vector<double> dwtOutput, dwtFlag;dwt_2d(dwtInput, num, "db2", dwtOutput, dwtFlag, dwtLength);//******************************顯示相關****************************** // //通過dwtLength計算dim // vector<int> dwtDim; // dwt_output_dim_sym(dwtLength, dwtDim, num); // // //dim的后兩位是顯示尺寸,并將dwtOutput構造成display // int dwtRow = dwtDim[dwtDim.size()-2], dwtCol = dwtDim[dwtDim.size()-1]; // vector<vector<double>> dwtDisplay(dwtRow, vector<double>(dwtCol)); // dispDWT(dwtOutput, dwtDisplay, dwtLength, dwtDim, num); // // //獲取display中的最大值double m = 0; // for(int i = 0; i < dwtRow; i++) // { // for(int j = 0; j < dwtCol; j++) // { // if(m < dwtDisplay[i][j]) // m = dwtDisplay[i][j]; // } // } // // //dst是用于顯示的圖像 // Mat dst = Mat::zeros(dwtRow,dwtCol,CV_8UC1); // for(int i = 0; i < dwtRow; i++) // { // for(int j = 0; j < dwtCol; j++) // { // if(dwtDisplay[i][j] <= 0.0) // dwtDisplay[i][j] = 0.0; // if(i<=dwtDim[0] && j<=dwtDim[1]) // dst.at<uchar>(i,j) = (uchar)(dwtDisplay[i][j]/m*255); // else // dst.at<uchar>(i,j) = (uchar)(dwtDisplay[i][j]); // } // } // imshow("dst", dst);//******************************************************************//******************************濾波相關******************************//開始濾波int filterSize = int(dwtOutput.size() / percentage);vector<double> filter;for(auto it : dwtOutput){filter.push_back(abs(it));}sort(filter.begin(), filter.end(), greater<double>());double threshold = filter.at(filterSize-1);for(int i = 0; i<dwtOutput.size(); i++){double tmp = abs(dwtOutput[i]);if(tmp < threshold)dwtOutput.at(i) = 0.0;}//******************************************************************//******************************顯示相關****************************** // dispDWT(dwtOutput, dwtDisplay, dwtLength, dwtDim, num); // // //獲取display中的最大值 // m = 0; // for(int i = 0; i < dwtRow; i++) // { // for(int j = 0; j < dwtCol; j++) // { // if(m < dwtDisplay[i][j]) // m = dwtDisplay[i][j]; // } // } // // //dst是用于顯示的圖像 // Mat dst2 = Mat::zeros(dwtRow,dwtCol,CV_8UC1); // for(int i = 0; i < dwtRow; i++) // { // for(int j = 0; j < dwtCol; j++) // { // if(dwtDisplay[i][j] <= 0.0) // dwtDisplay[i][j] = 0.0; // if(i<=dwtDim[0] && j<=dwtDim[1]) // dst2.at<uchar>(i,j) = (uchar)(dwtDisplay[i][j]/m*255); // else // dst2.at<uchar>(i,j) = (uchar)(dwtDisplay[i][j]); // } // } // imshow("dst2", dst2);//******************************************************************//下面是進行小波反變換過程vector<vector<double>> idwtOutput(src.rows, vector<double>(src.cols));idwt_2d(dwtOutput, dwtFlag, "db2", idwtOutput, dwtLength);int idwtRow = idwtOutput.size();int idwtCol = idwtOutput[0].size();//獲取idwtOutput中的最大值m = 0;for(int i = 0; i < idwtRow; i++){for(int j = 0; j < idwtCol; j++){if(m < idwtOutput[i][j])m = idwtOutput[i][j];}}//顯示降噪后的圖像Mat img = Mat::zeros(idwtRow, idwtCol, CV_8UC1);for(int i = 0; i<idwtRow; i++){for(int j = 0; j<idwtCol; j++){if(idwtOutput[i][j] <= 0.0){idwtOutput[i][j] = 0.0;}img.at<uchar>(i,j) = (uchar)(idwtOutput[i][j]/m*255);}}return img; }

原圖如下:

加入高斯噪聲:
進行圖像小波變換:
按照上述方法進行濾波:

進行圖像小波反變換:

3. 結論

  • 可以看到通過圖像小波變換進行降噪的效果看上去還可以,起碼比傅里葉變換的效果要好,但是呢,感覺小波變換的速度還是比較慢,實時運行應該比較困難;
  • 本文采用的降噪算法其實比較簡單,在這篇文獻中《Image Denoising Review From Classical to State-of-the-art Approaches,2020》提到,對于轉換域的降噪算法主要有兩個關鍵點:1.轉換到什么變換域(傅里葉?小波?脊波?);2.采用什么類型的閾值進行濾波,這篇文獻中提到了六種設計閾值的方法,需要了解的同學可以參考下;
  • 小波變化提取信息主要是在水平、垂直和對角線三個方向,在小波的基礎上,還有curvelet、contourlet等一些更加高級的變化,之后有需要再進一步了解。
  • 此外,這里我寫一個各種算法的總結目錄圖像降噪算法——圖像降噪算法總結,對圖像降噪算法感興趣的同學歡迎參考

    總結

    以上是生活随笔為你收集整理的图像降噪算法——小波硬阈值滤波(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。