algorithm - Blockwise Non Local Means降噪算法的伪代码

标签 algorithm image-processing

我已经实现了一个很好的算法(“Non Local Means”)来减少图像中的噪声。 它基于它的 Matlab implementation .

NLMeans 的问题是原始算法即使在像 c/c++ 这样的编译语言上也很慢,我正在尝试使用脚本语言运行它。

最好的解决方案之一是使用改进的 Blockwise NLMeans algorithm这快了约 60-80 倍。问题是描述它的论文是用复杂的数学语言写的,我真的很难理解一个想法并对其进行编程 (是的,我在大学里没有学过数学)。

这就是为什么我拼命寻找这个算法的伪代码。

(修改原始 Matlab 实现将是完美的)

最佳答案

我承认,在看到结果之前我很感兴趣 – 在双核上运行 260 多秒,这还没有假设脚本语言的开销,这是针对优化 block 非局部均值过滤器的。

让我为您分解一下数学——我对伪代码的想法是用 Ruby 编写。

非局部均值过滤

假设有一张 200 x 100 像素(总共 20000 像素)的图片,这是一张非常小的图片。我们将不得不遍历 20,000 个像素并根据其他 19,999 个像素的加权平均值评估每个像素:[对间距感到抱歉,但方程式被解释为没有它的链接]

NL [v] (i) = ∑ w(i,j)v(j) [j ∈ I]

其中 0 ≤ w(i,j) ≤ 1 且 ∑j w(i,j) = 1

可以理解,这最后一部分可能有点令人困惑,但这实际上只不过是一个卷积滤波器,其大小是应用于每个像素的整个图像。

block 状非局部均值过滤

block 式实现采用重叠的体素集(体积像素 - 您向我们指出的实现是针对 3D 空间的)。据推测,采用类似的方法,您可以将其应用于 2D 空间,获取重叠像素集。让我们看看我们是否可以描述这个...

NL [v] (ijk) = 1/|Ai|∑ w(ijk, i)v(i)

其中A是待估计像素的向量,应用与上述类似的情况。

[注意:我可能有点偏离;几年没做重度图像处理了]

算法

很可能,我们正在谈论以最小的成本降低算法的复杂性以降低质量。样本向量越大,质量越高,复杂度也越高。通过重叠然后对图像中的样本向量进行平均,然后将该加权平均值应用于每个像素,我们循环遍历图像的次数要少得多。

  • 遍历图像以收集样本向量并将它们的加权平均值存储到数组中。
  • 将每个加权平均值(一个介于 0 和 1 之间的数字)应用于每个像素乘以像素值。

非常简单,但是对于较大的图像,处理时间会很糟糕。

最后的想法

您将不得不做出一些艰难的决定。如果您打算使用脚本语言,那么您已经在处理大量的解释开销。使用脚本语言进行重型图像处理远非最佳选择。如果您不处理医学图像,很可能有更好的算法可以使用更少的 O。

希望这对您有所帮助...我不太擅长简明扼要地表达观点,所以如果我能澄清任何事情,请告诉我。

关于algorithm - Blockwise Non Local Means降噪算法的伪代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041937/

相关文章:

algorithm - 多代理寻路 - 无交叉路径

arrays - 证明或反驳 : There is a general sorting algorithm which can sort an array of length n in O(n) if it's min-heap-ordered

java - java中的图像比较

.net - 为 DataGridView 着色以直观地查看单元格值的整个分布的算法

javascript - 半透明点上的附加颜色

algorithm - mergesort合并步骤的时间复杂度是多少?

java - Java中的字符串压缩

algorithm - O(nlogn) + O(n) 的时间复杂度是否只是 O(nlogn)?

c++ - Magick++ ErrorMissingDelegate

python - 我沿着椭圆形有一组点。如何创建填充的二进制掩码