一.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格式只是为了测试算法效果的,这些问题就不花功夫了。哪位如果有时间找到问题的答案,欢迎告知:)