对图像去噪的拙见

         本文主要从实用主义的角度,表达了作者对当前图像去噪算法的一些见解。

         图像去噪,是图像处理中的一个经典课题。尽管有很多有效的算法被提出,但能真正可实际使用的算法却还没有,至少从公开发表的文章来看是如此。也许是本文作者坐井观天,才疏浅薄,欢迎大家拍砖。如果您有好的算法,欢迎和本文作者一道讨论,共同进步。

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讨论图像处理与视觉计算中的快速算法及其实现,主要是偏工程上的软件优化方法。


              




      



        

        



posted @ 2013-12-29 15:50  celerychen  阅读(3238)  评论(1编辑  收藏  举报