如何测量图像的峰值信噪比?

时间:2012-03-04 16:03:02

标签: image image-processing filter

我有以下图片:

enter image description here

30%盐和胡椒噪音腐蚀

enter image description here

去噪后

我使用各种技术去噪图像

如何比较哪种方法在去噪方面最佳?

    function PSNR = PeakSignaltoNoiseRatio(origImg, distImg)

origImg = double(origImg);
distImg = double(distImg);

[M N] = size(origImg);
error = origImg - distImg;
MSE = sum(sum(error .* error)) / (M * N);

if(MSE > 0)
    PSNR = 10*log(255*255/MSE) / log(10);
else
    PSNR = 99;
end

我应该用两张图像来计算PSNR?

2 个答案:

答案 0 :(得分:1)

您检查了Wikipedia article on PSNR吗?首先,它提供了一个更清晰的公式,可以修复你的代码(例如,你为什么要检查MSE是否> 0?如果你定义了MSE正确,它必须大于0.此外,这看起来是Matlab代码,所以使用log10()函数来保存一些令人困惑的基本转换。最后,确保此函数的输入实际上是0-255比例的量化图像,而不是0和1之间的双值图像。 )。

你的问题不清楚。如果要将PSNR用作性能指标,则应根据原始计算每个去噪方法的PSNR并报告这些数字。这可能不会很好地总结哪些方法做得更好,但这是一个开始。另一种方法可以是手动选择您认为对应于不同定性现象的原始图像的较小子区域,例如背景上的窗口,前景上的窗口以及跨越两者的窗口。然后仅为那些窗口计算PSNR,再次针对每个去噪结果与原始结果重复。最后,您需要一个表格,显示与原始方法相比的每种不同方法的PSNR,可能还有这个子窗口细分。

您可能希望根据其用途来研究更复杂的方法。 Tony Chan的书中关于全变差图像去噪的章节非常有用(link)。

答案 1 :(得分:0)

这是使用DataMelt程序的Jython / Python示例。 将这些行放入文件“ test.py”中,然后在DataMelt中运行。 它将打印2张下载图像的PSNR值。如果您有其他图像,请替换文件名。

from Catalano.Imaging.Tools import ObjectiveFidelity
from Catalano.Imaging  import FastBitmap
from jhplot import *
print Web.get("http://jwork.org/dmelt/examples/data/logo_jhepwork.png")
print Web.get("http://jwork.org/dmelt/examples/data/logo_jhepwork_noisy.png")
original=FastBitmap("logo_jhepwork.png")
original.toGrayscale()
reconstructed=FastBitmap("logo_jhepwork_noisy.png")
reconstructed.toGrayscale()
img=ObjectiveFidelity(original,reconstructed)
print "Peak signal-to-noise ratio (PSNR)=",img.getPSNR()