對圖像去噪的拙見


         本文主要從實用主義的角度,表達了作者對當前圖像去噪算法的一些見解。

         圖像去噪,是圖像處理中的一個經典課題。盡管有很多有效的算法被提出,但能真正可實際使用的算法卻還沒有,至少從公開發表的文章來看是如此。也許是本文作者坐井觀天,才疏淺薄,歡迎大家拍磚。如果您有好的算法,歡迎和本文作者一道討論,共同進步。

1. 從高斯濾波到雙邊濾波

         高斯濾波是經典的圖像濾波的算法,能夠在一定程度上抑制噪聲。很多算法都拿高斯濾波做預處理,例如canny邊緣檢測算子。然而高斯濾波在模糊圖像的同時,也模糊了圖像的邊緣信息。於是,衍生出大量的邊緣保持濾波算法。這主要有兩類:基於PDE的非線性們擴散和雙邊濾波。

         關於高斯濾波和邊緣保持濾波,有很多的快速算法。也有最近新提出的一些邊緣保持濾波算法。例如:guiled filter, 基於SVM的邊緣保持濾波,其中SVM邊緣保持濾波是第一個基於學習的快速算法。

       imageshop的作者的個人博客上有兩篇博文討論了雙邊濾波的快速算法:

       http://www.cnblogs.com/Imageshop/p/3406823.html

      本文作者目前正在開發的FastCv也實現了相關的算法,性能指標如下:



        雙邊濾波作為有效的邊緣保持濾波,能夠獲得更高信噪比。雖然如此,雙邊濾波並不能拿來專門做圖像去噪,即使其PSNR比非局部算法都要高。


2. 非局部算法

          非局部及其改進算法比較多,之前本文作者有一篇博文討論過非局部算法。這里再次提一下非局部算法。因為作者前不久重新實現了一下非局部算法,對浙大的這篇非局部快速算法的評價也許不是很准確。

         本文作者經過一些簡單的代碼優化措施,對於30W像素的彩色圖像,原始非局部算法大概需要6s的時間。而浙大的這篇文章的快速算法我並沒有實現,因為我對其去噪效果持懷疑態度。非局部算法在進行快相似將計算過程中使用了加權的SAD,這個加權值可以是線性衰減的,也可以是高斯衰減的。而根據浙大的這篇論文中的推導公式,完全沒有加權,或者說直接采用的SAD作為快匹配標准。而直接采用SAD的非局部算法效果就大打折扣了。

          本博客作者認為,非局部快速有效的算法是Laurent Condat個人主頁上的一篇參考文獻:

          A Simple Trick to Speed Up and Improve the Non-Local Means。這篇文獻中的快速算法不是對非局部的近似,而是一種改進。

          根據SAD權重計算方式的不同,形狀自適應的非局部算法被提出,主要的文獻如下:

         http://hal.upmc.fr/docs/00/53/67/23/PDF/draft.pdf . 在其主頁上提供了大量的各種非局部算法的matlab代碼可以下載。


3.  DCT去噪

        DCT 去噪主要是參考下面的文獻:DCT image denoising: a simple and effective image denoising algorithm

        DCT去噪是一種看似極其簡單,但實際上根本沒法用的圖像去噪方法。

        說其簡單,是因為,整個過程就是進行dct變換,然后進行dct域的硬閾值操作,再反變換回來。但這樣做有效嗎?

        如果說是按照jpeg編碼的方式去處理,明顯是沒有效果的。但dct去噪是每次滑動一個像素,而不是滑動一個dct塊,以這一個像素為中心取當前快進行操作的。這樣在實現的時候,勢必要把圖像組裝成數量巨大的小塊patch。對每一個小塊dct,閾值,IDCT;然后在把小塊重新加權組合與原始的像素相對應。

       這個算法執行過程的確簡單,而且其效果很多時候比非局部算法要好,當然還是沒有BM3D算法來的好。作者指出其理論時間復雜度比原始的非局部算法不是一個數量級的。理論分析也的確如此。但是實際上呢?

       我測試了這個算法,對於800x600的圖像,根本沒法工作,因為內存不足!我的系統內存也許有點小,只有2G。但是對於處理這么小的圖像就導致內存溢出,這明顯是無法接受的。對於更小一點的圖,512x512的圖片,時間是多少了?我的非局部是6s,而同樣的配置下dct去噪的c代碼給出的時間是2min。

       也許,不用事先分塊的方法可以有效較小系統內存開銷,但這樣做實現就比較復雜了。


4. BM3D圖像去噪

         BM3D去噪算法被公認為是最好的去噪算法之一,最近很多更有效的去噪算法都與BM3D去噪算法為對比基准。

         在作者主頁上提供的BM3D的很多相關文獻及其代碼。

        本博客作者測試了BM3D作者提供的matlab代碼給出的時間是:對於512x512的彩色圖像大概是16s。

        仔細查看代碼可以知道,BM3D的作者並沒有提供matlab代碼,其最核心的實現已經用c封裝成matlab可調用的庫了。作者應該是對這個算法做了很多的優化才能達到這樣的速度。因為同樣是BM3D,另外一個C代碼的實現則比其慢了很多,鏈接如下http://www.ipol.im/pub/art/2012/l-bm3d/。這個代碼對於512x512的彩色圖像,在我的機器上測試的時間是2min以上,對於再大點的圖像會導致內存溢出而crash掉。另外,這個鏈接中詳細討論了BM3D算法本身的諸多細節以及各個參數對去噪效果的影響,對於研究BM3D算法朋友可以認真研讀一下。

        對IPOL上的這個實現,我的測試效果並不好,對於真實iphone數碼相機夜間拍攝的圖像,這個BM3D的去噪效果還沒有我目前正在開發的FastCv中采用的動態閾值小波去噪算法來的好。而這個動態閾值小波去噪的時間是毫秒級別的。這也許是我還沒有充分測試BM3D的各種參數所致。因為同樣的測試,在BM3D算法作者主頁上給出的測試結果有明顯的差別。  


           綜上,從公開發表的文獻來看,在普通pc機上,還沒有一個實時有效的圖像去噪的方法。另外,對本博客作者正在開發的FastIv感興趣的可以加入討論群322687422討論圖像處理與視覺計算中的快速算法及其實現,主要是偏工程上的軟件優化方法。


              




      



        

        




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM