如何在图像去噪中正确应用 FFT

信息处理 图像处理 fft 过滤器 傅里叶变换 去噪
2021-12-25 21:47:09

我正在编写程序(Qt widgets/c++)来去除图像中的噪音。作为去噪方法,我选择了非局部均值法这种方法具有令人难以置信的恢复图像质量(这就是为什么它是 OpenCV 中唯一的去噪方法),但是计算成本很高,所以我对这种方法做了很多修改(一些具有多线程,一些算法)。但是,我遇到了一个问题,涉及FFT

我按照这篇文章的所有步骤(只有一页,1430),一切都很好,除了 FFT 部分,论文中只有 2 行关于它的内容,我无法理解,应该如何使用 fft

这个问题困扰了我几个月,任何帮助或见解都会非常感激。

问题的简化版本:如何快速获得图像上两个数组的平方和(顶部的一个和中间的一个,值是颜色)?( O(n^2) 是巨大的成本,有很多这种操作,上面的论文指出,它可以通过 O(n*log n) 的 FFT 来完成(说这两个数组以某种方式形成了循环卷积) )

在此处输入图像描述

1个回答

论文里面的技巧如下:

  1. 你要计算的是iW|I(x+i)I(y+i)|2, 在哪里I是一个图像,xy两个嘈杂的像素和i是用于定义面片的 2D 偏移。
  2. 扩展表达式产生:iI2(x+i)+iI2(y+i)2iI(x+i)I(y+i)=A+B2C.
  3. AB是使用平方积分图像计算的,即来自平方原始图像的积分图像。
  4. C是两个补丁之间的卷积,以xy. 因此,它可以在傅立叶域中计算,在此它变成一个乘法。你得到的价值C通过计算补丁的傅里叶变换x, 周围的补丁y,将这些结果逐点相乘,并对乘法结果进行傅里叶逆变换。

傅里叶变换显然是一种二维变换,因为您使用的是二维数据。对于给定的补丁,您获得的是复数值的二维数组。

附加条款

在我看来,这篇文章并不是最好的 NL 均值加速策略。我在 2007/2008 年所做的实验表明,预选补丁更好(在速度和结果质量方面)。我已经开始在这里写关于这些的博客,但不幸的是,我正在寻找时间来完成这些帖子。

最初的 NL-means 论文提到了可能很有趣的分块实现。实现 NL-means 基本上有两种方法:

  1. 为图像中的每个像素编写一个去噪循环
  2. 为每个补丁编写一个去噪循环,然后对补丁进行反向投影以形成图像。

第一个实现是原始方法,因为在 2005 年内存和多核 CPU 非常昂贵。另一方面,我在过去 2 年的最新硬件中选择了 2 号。这取决于您的典型图像大小以及您是否希望能够计算像 DFT/DCT 这样的域变换(如在提议的论文和 BM3D 中所示)。