日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2025/3/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像降噪算法——小波硬阈值滤波(下) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

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

1. 基本原理

關(guān)于離散小波變換的原理在

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

中已經(jīng)有了非常詳細(xì)的總結(jié),這里介紹下本博客利用離散小波變換進(jìn)行降噪的原理(其實(shí)不能算是降噪,應(yīng)該算是圖像壓縮),就是在小波變換之后,將輸出系數(shù)進(jìn)行由大到小的排序,然后將前10%大的通過小波反變換成圖像,因?yàn)樵肼暡粚儆趫D像的主要信息,因此通過這種方法會(huì)有降噪的效果,這種算法又稱為小波硬閾值濾波。

2. C++代碼實(shí)現(xiàn)

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

Mat Denoise::WaveletFilter(const Mat &src, int num, int percentage) {//需要講Mat數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為vector數(shù)據(jù)結(jié)構(gòu)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);}}//計(jì)算小波變換,輸出結(jié)果是outputvector<int> dwtLength;vector<double> dwtOutput, dwtFlag;dwt_2d(dwtInput, num, "db2", dwtOutput, dwtFlag, dwtLength);//******************************顯示相關(guān)****************************** // //通過dwtLength計(jì)算dim // vector<int> dwtDim; // dwt_output_dim_sym(dwtLength, dwtDim, num); // // //dim的后兩位是顯示尺寸,并將dwtOutput構(gòu)造成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);//******************************************************************//******************************濾波相關(guān)******************************//開始濾波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;}//******************************************************************//******************************顯示相關(guān)****************************** // 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);//******************************************************************//下面是進(jìn)行小波反變換過程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; }

原圖如下:

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

進(jìn)行圖像小波反變換:

3. 結(jié)論

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。