生活随笔
收集整理的這篇文章主要介紹了
图像降噪算法——小波硬阈值滤波(下)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
圖像降噪算法——小波硬閾值濾波(下)
圖像降噪算法——小波硬閾值濾波(下)
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
)
{ 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
) ; } } vector
< int > dwtLength
; vector
< double > dwtOutput
, dwtFlag
; dwt_2d ( dwtInput
, num
, "db2" , dwtOutput
, dwtFlag
, dwtLength
) ;
double m
= 0 ;
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 ; }
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 ( ) ; 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等一些更加高級的變化,之后有需要再進一步了解。
此外,這里我寫一個各種算法的總結目錄圖像降噪算法——圖像降噪算法總結,對圖像降噪算法感興趣的同學歡迎參考
總結
以上是生活随笔 為你收集整理的图像降噪算法——小波硬阈值滤波(下) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。