python - 如何计算动态范围的 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)。
解决方案
测量设备(即照相机)的动态范围描述了最大和最小可测量光强度之间的比率。关于这一点,您的实施中出现了两个问题。
- 确定动态范围下限的暗帧图像不应该是纯零。这意味着无限的动态范围(在 SNR 公式中除以零)。相反,您需要按照您的建议拍摄暗镜头
“我也有一个镜头盖上的照片(暗框,不是 100% 黑色,因为有噪点)。”
并将此图像用作参考。您还需要以最大强度拍摄的图像(全白 - “烧焦”)
- 代码段中的信噪比计算公式为均方误差。您应该使用维基百科 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)
推荐阅读
- asp.net - 在 IFrame 中加载 localhost 站点的问题
- flutter - 如何遍历一个月的几天?
- java - Spring Security:每个客户端只保留一个活动令牌
- java - 访问项目中对象内对象的最佳 OOP 实践
- apache - 我可以在同一台服务器上安装 NodeJS 和 Apache 吗?
- php - Laravel 服务层类中的依赖注入
- swiftui - 将@Published 数据传递给 Textfield() 的最简单方法?
- windows - 如何使用设备实例 ID 打开设备句柄?
- excel - 如何加快 VBA 将数据从 Word 提取到 Excel
- command-line - 与 Snowsql 连接