如何计算动态范围的 SNR?

How to calculate SNR for dynamic range?

在编码方面,我绝对是个初学者,所以我真的不明白该怎么做。我知道以前有人问过这个问题,但在检查完这些之后我无法弄清楚。我希望有一个人可以帮助我。现在我的最终目标是找出 arri amira 实际使用的动态范围。这是我们大学项目的一部分。 (规格说 14+)我的镜头范围从 0.5 到 22 f-stops。我还有一个镜头盖上的镜头(暗框,不是 100% 黑色,因为有噪点)。所有帧都保存为 TIFF(这是我们项目中的要求)。现在我首先必须计算暗帧的 p(噪声),对吗? SNR = P(信号)/p(噪声)。然后将该值用作其他图像的 p(噪声)?

我也不知道怎么计算p(noise)。我的想法是将暗帧图像与实际上完全黑色的暗帧进行比较。也许作为一个充满零的数组?我找到了包含 mse 值计算的代码。这会符合我的想法吗? 我试过的是:

realDarkframe= np.zeros( (1080,1920,3) )
darkframeOfAmira= cv2.imread("image.tif",1)
def snr(img1, img2):
    mse = np.mean( (img1 - img2) ** 2)
    return mse

d=snr(realDarkframe,darkframeOfAmira)
print(d)

即returns值为565.7092896412037。现在我不知道那是什么意思。而且我也不知道如何计算 p(signal),即使这是正确的,数字 565.7092896412037 实际上等于 p(noise)。

测量设备(即相机)的动态范围描述了最大和最小可测量光强度之间的比率。关于这一点,您的实施中出现了两个问题。

  1. 确定动态范围下限的暗帧图像不应为纯零。这意味着无限的动态范围(在 SNR 公式中除以零)。相反,你需要按照你的建议拍摄暗镜头

"I also have a shot with the lens cap on (darkframe, which is not 100% black, because there is noise)."

并使用此图片作为参考。您还需要以最大强度拍摄的图像(全白 - “烧焦”)

  1. 代码段中的信噪比计算公式为均方误差。您应该使用 wikipedia 中描述的公式 snr = P(signal)/p(noise) = mean(signal^2) / mean(noise^2).

此代码应该有效:

darkframeOfAmira = cv2.imread("dark_image.tif",1)
brightframeOfAmira= cv2.imread("image.tif",1)
def snr(img1, img2):
    return np.mean(img1 ** 2) / (np.mean(img2 ** 2) + 1e-12)

d=snr(brightframeOfAmira,darkframeOfAmira)
print(d)