我已经实现了一个很好的算法(“Non Local Means”)来减少图像中的噪点。 它基于Matlab implementation。
NLMeans的问题是原始算法即使在c / c ++这样的编译语言上也很慢,我试图用脚本语言来运行它。
最好的解决方案之一是使用改进的Blockwise NLMeans algorithm,速度提高约60-80倍。问题在于描述它的论文是用复杂的数学语言编写的,我很难理解一个想法并对其进行编程 (是的,我没有在大学学习数学)。
这就是为什么我拼命寻找这种算法的伪代码。
(原始Matlab实现的修改将是完美的)
答案 0 :(得分:7)
我承认,直到我看到结果 - 双核心上260秒以上,并没有假设脚本语言的开销,并且这是针对优化块非局部均值过滤器时,我很感兴趣。
让我为你分解数学 - 我对伪代码的想法是用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
可以理解,这最后一部分可能有点令人困惑,但这实际上只不过是一个卷积滤波器,应用于每个像素的整个图像的大小。
块状实现采用重叠的体素集(体积像素 - 您指向我们的实现是用于3D空间)。据推测,采用类似的方法,您可以将其应用于2D空间,采用多组重叠像素。让我们看看我们是否可以描述这个......
NL [v](i j k )= 1 / | A i |Σw(i j k ,i)v(i)
其中A是要估计的像素的矢量,并且应用了与上述类似的情况。
[NB:我可能会稍微离开;我做了大量的图像处理已经有几年了]
很有可能,我们正在谈论以最低成本降低算法的复杂性以降低质量。样本矢量越大,质量越高,复杂性越高。通过重叠,然后对图像中的样本矢量进行平均,然后将加权平均值应用于每个像素,我们在图像中循环的次数要少得多。
非常简单,但处理时间会因较大的图像而变得可怕。
你将不得不做出一些艰难的决定。如果您要使用脚本语言,那么您已经在处理重要的解释开销。使用脚本语言进行重型图像处理远非最佳。如果你没有处理医学图像,那么很可能会有更好的算法用于较小的O.
希望这是有帮助的......我不是非常擅长清楚简洁地说明一点,所以如果我能澄清任何事情,请告诉我。