首页 > 解决方案 > 如何计算动态范围的 SNR?

问题描述

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

我也不知道如何计算 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)

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

标签: pythonnumpysignalsnoise

解决方案


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

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

“我也有一个镜头盖上的照片(暗框,不是 100% 黑色,因为有噪点)。”

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

  1. 代码段中的信噪比计算公式为均方误差。您应该使用维基百科 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)

推荐阅读