一.BM3D及代碼簡單介紹
目前公認比較好的去噪演算法。
原始碼bm3d_src.zip(http://www.ipol.im/pub/art/2012/l-bm3d/)
This source code provides an implementation of the BM3D image denoising.
The code is compilable on Unix/Linux and Mac OS.
- Compilation.
Automated compilation requires the make program.
- Library.
This code requires the libpng library and the fftw library.
- Image format.
Only the PNG format is supported.
二.Windows下編譯使用
平台:win7+VS2010
建立bm3dtest控制台工程,並把bmd3d_src加入到工程中。通過前面介紹可知,BM3D需要png庫和fftw庫,因此需要加入這些第三方庫。
1.fftw3庫配置
下載fftw-3.3.3-dll32.zip (http://www.fftw.org/install/windows.html)
按照說明,產生dll檔案即可(其中已經包含了lib檔案)
添加lib庫
../fftw-3.3.3-dll32/libfftw3-3.lib
../fftw-3.3.3-dll32/libfftw3f-3.lib
../fftw-3.3.3-dll32/libfftw3l-3.lib
適當修改其中代碼,部分如:
//! Allocate plan for FFTW library
//fftwf_plan plan_2d_for_1[nb_threads];
// fftwf_plan plan_2d_for_2[nb_threads];
// fftwf_plan plan_2d_inv[nb_threads];
// modified by loadstar
fftwf_plan* plan_2d_for_1 = new fftwf_plan[nb_threads];
fftwf_plan* plan_2d_for_2 = new fftwf_plan[nb_threads];
fftwf_plan* plan_2d_inv = new fftwf_plan[nb_threads];
2.
在VC下如何使用標頭檔unistd.h
標頭檔unistd.h是Linux/Unix的系統調用,包含了許多UNIX系統服務函數原型,如open、read、write、_exit、getpid等函數。在linux下能夠編譯通過的包含此標頭檔的程式,在VC下編譯時間出現了如下問題
fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory
其實解決這個問題的方法並不難,只要在你的預設庫檔案夾下(例如D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\)添加一個unistd.h檔案即可,其內容如下:
#ifndef _UNISTD_H
#define _UNISTD_H
#include <io.h>
#include <process.h>
#endif /* _UNISTD_H */
這樣在重新編譯包含unis.h的程式就能通過了
3. png庫編譯
gzip,zlib,以及圖形格式png,使用的是同一個壓縮演算法deflate。
libpng1250(http://www.libpng.org/pub/png/libpng.html)檔案夾中包含了zlib工程檔案(lpng1250\projects\visualc71檔案夾下)libpng項目解決方案中包含了工程libpng.vcproj,
pngtest.vcproj, zlib.vcproj,但是該zlib工程編譯時間有些問題,懶得解決了,直接使用lpng1513版本中的zlib工程。
下載lpng1513.zip(http://www.libpng.org/pub/png/libpng.html)解壓,通過查看zlib.vcproj檔案,可以看出該工程的目錄位置:..\..\..\zlib-1.2.5。在該目錄位置解壓出zlib127.zip(http://www.zlib.net/),因為其中使用zlib-1.2.5,把zlib127名稱修改為zlib-1.2.5即可。在lpng1513中用vs2010開啟解決方案libpng.sln。用Debug編譯其中的zlib工程,產生lpng1513\projects\vstudio\Debug\zlib.lib檔案。(該版本下讀取png圖片有問題,png庫仍然採用lpng1250)
開啟lpng1250工程(lpng1250\projects\visualc71\libpng.sln)
加上zlib標頭檔:
在屬性-C/C++-常規-附加庫包含目錄加上..\..\..\zlib-1.2.5(如果有其他,修改之)
選擇LIB Debug編譯,則產生lpng1250\projects\visualc71\Win32_LIB_Debug\libpngd.lib
在bm3dtest工程:
加上標頭檔
在屬性-C/C++-常規-附加庫包含目錄添加
..\lpng1250
..\zlib-1.2.5
項目包含.lib檔案所在的目錄:
屬性--連結器--常規--附加庫目錄
..\lpng1250\projects\visualc71\Win32_LIB_Debug
..\lpng1513\projects\vstudio\Debug
添加lib檔案
屬性--連結器--輸入--附加依賴項(libpngd.lib zlib.lib)
在產生的bm3dtest.exe目錄中加入相應的dll檔案即可(fftw),完成。找個圖片試試效果吧。
三.後記:
1. 參考
Windows下zlib庫和libPng庫的編譯和使用
http://blog.sina.com.cn/s/blog_659b2b3201013y9k.html
2.直接使用lpng1513版本產生的libpng庫,讀取映像時出現錯誤
使用libpng1250版本中zlib工程編譯時間出現錯誤。
PNG格式只是為了測試演算法效果的,這些問題就不花功夫了。哪位如果有時間找到問題的答案,歡迎告知:)