以730亿roi扫描,探寻CMOS动态范围测量的工程极限

以730亿roi扫描,探寻CMOS动态范围测量的工程极限

前言

前几天我用超级脚本对我的尼康z7进行了一些较大规模的扫描,证实了“高精度靶图与极限测量素材的50M roi级别的测量效果,在20dB及以下的snr阈值下,完全等价”这一结论。

参考文章如下:

超硬核动态范围测量方案:自动扫描生成亿级ROI尼康z7的动态范围-极限测量

本文在此基础上,强力突破采样密度与家用电脑的算力限制,继续深入,探寻cmos 动态范围测量的工程极限。

先说结论

我用超级脚本对极限测量素材,进行了

  • 32px 步长:0.72 亿 roi 全面不重叠采样
  • 8px 步长:11 亿 roi
  • 4px 步长:45 亿 roi 高密度采样
  • 1px 步长:730 亿 roi 全像素穷举采样
  • 高精度靶图16张全量穷举:6.3亿roi

上述结果,24个dr中,有3个波动0.01ev,dr计算结果可视为完全相同

由于对采样数量进行了1024倍的提升,结果并未有改善,所以高精度靶图拍摄16-20张,仅进行平坦区域取样生成50M roi,或者直接全图穷举扫描生成6亿roi,就是dr测量的工程终点。

虽然没有什么实用价值,但是我觉得是个里程碑,值得水一篇文章。


测试简介

测试方法在上述第二篇文章中有较详细的描述,这里简单总结一下:

  • 镜头紧贴显示器,对焦到无穷远,来获得一个非常好的大型均匀单一亮度灰阶目标(平场)
  • 显示器显示一个灰阶值可控的全屏纯色,精细改变灰阶值(精密控光),配合16组曝光参数,拍摄一系列raw文件共1635张,可以吃满cmos所有动态范围,再用超级脚本进行扫描。

每张图都类似下图效果,是个大白图或者大灰图:

这是一张接近饱和的raw在达芬奇里生成的波形图,我把亮度调低,可以看到一个明显的细亮边,说明snr非常高。亮边下方类似“浅投影”的波形,说明有少量snr异常偏低的点;两端下弯说明受到镜头暗角影响,实测减光量约1/3ev。这个对dr结果没有影响。对高信号区的影响目前未知。

拉爆曲线之后是这个样子的,可以看到中心有一个条纹。还可以看到cmos好像有点歪。我拍之前清洁了cmos但是还是会继续落灰:

这是从730亿扫描结果里的R通道-6.00ev的直方图数据(0.01dB bin)画散点图,这个ev点的snr有10254812(千万)个,4通道就是4千万个:

可以看到右边非常符合正态分布,对称性不完美,有一定数量的snr偏低点,和波形图显示的情况吻合。计算出来的该点snr的“高性能稳健值”是29.1579dB。还可以看到,如果取最佳值,会造成1.03dB的snr提升,对应1/3档ISO,差异非常大。和众数值28.83相比,有+0.33dB的差异,使用众数可能会造成最高0.11ev的dr低估。


这是从格子图里切片出来的情况,可以看到左尾与右尾不对称而且很长,说明有许多无效数据(P90等效法只使用右尾进行计算,在保证主峰高度不受影响的情况下,自动排除所有无效点):

毛刺较多,但是不影响dr计算结果

所以极限测量素材的信号质量,看起来非常好。我认为这个拍摄方式得到的信号质量优于虚焦格子图。

如果不用镜头,在开放环境下直接将cmos对准无云的天空,将会获得波形最平直,受渐晕影响最小的图像。对着显示器也可以。但是这种方式需要配合特定的减光镜,不利于多档快门控制。



超级脚本的采样和计算流程,我进行了持续优化,以我的破电脑的超低配置(i7-7700+32GB内存,sata ssd),在内存被爆破之前,最高支持4px位移,45亿roi的扫描,采样和计算都需要耗费约2000秒的时间,也就是总共1个多小时。

其实在3-5张图的扫描中,4px位移得到的结果,就已经和1px穷举差不多了(0.01-0.03),但是图线的质量还是会有可见的改善:

但是在极限测量素材的扫描中,从32px位移开始,图线就已经非常平滑。后续的8px,4px位移,结果都没有任何可见的增强,所以可以预见,1px的结果也会是完全一样的。但是不进行实际测试,这就永远只能是一个猜想。

对1635张45MP的raw进行穷举扫描计算snr,即使不需要人工干预,也是一件非常恐怖的事情。

首先需要有人写代码。vibe coding太难了。

因为非SOP(主要是dpreview样张的扫描)有BL检测的需求,脚本需要先采样所有数据放在内存,最后再进行汇总排序,最低亮度roi作为BL,扣减BL进行ev计算,再计算snr。这样的话,每个roi使用float64存2个值,全量扫描需要的存储空间就是:

(8256 - 32) * (5504 - 32) * 2 * 8 * 1635 = 1,177,245,204,480 Bytes = 1.07 TBytes

恐怖吧。这样的数据量,无论是放在内存,还是硬盘,家用电脑都伤不起。毕竟不是谁家都有配置了2048G内存(RAM)的电脑的。毕竟手机的最大内存(Internal Storage)好像也就1T(狗头)。

所以硬算是肯定算不出来的。我的P90等效算法基于snr直方图。虽然设计之初没有考虑过,但是经过ai的提议,我发现它天然自带对超大规模计算的支持。因为直方图具有可累加性,如果BL可以先行确定,就可以在完成一个raw的采样的时候,直接计算单图直方图,并累加到全局直方图。然后采到的大量数据就可以直接丢掉了。

但是也不确定每个图生成的直方图能有多大,py经常出现奇怪的内存无法释放的问题,跑着跑着内存就爆了,于是被迫开发了直方图存盘功能,并获得断点续传功能。

然后又发现,即使用了强制写磁盘语句,内存占用还是会缓慢上涨,并且还会有几十个文件无法写入。但是快爆的时候,系统进行了一波回收,之后就能以接近初始的占用量跑完所有的图,非常神奇。ai也不知道为啥【摊手】。

所以系统现在支持不限量的raw文件扫描,要付出的代价只有时间和快门损耗,以及一丢丢电费。

对1635张raw进行穷举扫描,本来只是我的一个极端设想,现在成为了现实。

扫描结果

重点强调:我的每通道dr,只由snr等高线上下两侧最近的2点线性插值得到,然后四通道平均。也就是说这个值只由8个采样点确定。不同的测量,获得的roi完全不同。两次测量结果相同,意味着两组完全不同的采样,真的能算出同样的8个数据点,最后得到一个相同的数字:算法靠大数据完备采样提取出了物理真值。以snr=1为例:

虽然采样各不相同,但是P90等效法可以从完全不一样的原始采样数据中,计算出完全相同的这8个点。


5组扫描结果汇总如下,不同的项我标了橙色:

我觉得这5+1组的采样策略和roi数量完全不一样,结果可以说是完全一样。差0.01刚好还能显示出我的系统对极其微小的dr变化的察觉能力。roi量变成4倍dr下降0.01,说明测量精度更好

这里我要说明一下,我的算法仅对singal<0(BL从黑场中心选区,不是最低值)和snr>60dB(非线性区过曝)这两种完全无法计算的数据进行过滤。P90等效snr曲线计算完成之后,不进行任何过滤或拟合或平滑,原始数据直接出图。snr在亿级别的roi采样时,以0.01dB分bin,而不是置顶文章里提到的0.1。

730亿roi扫出的snr图线如下:

放大查看,可以发现,它可以扫出很微小的snr变化。

下图是低信号区,可以看到点线非常平滑,左上角有一些缺口,不知道为什么:

更多的小缺口。理论上我应该能取到每一个0.01ev。四个通道都在同一个ev点缺失,并且形成有规律的重复图案,缺口右边有一个点稍低,可能真的就是没数据:

还有奇怪的小波动,还有更多的整齐缺口,注意,这些都是四个通道同时缺失的,也不知道为啥,万一是算法导致的也不好说:


近饱和区的情况,线性区从-0.02ev开始:

这是日志:

排除负数信号点和snr高于60dB的点,实际参与计算的roi是630亿

平均每个文件7秒计算出4500万个roi数据,每小时能处理约500个文件。48小时能跑24000个文件生成1万亿个roi,如果真的需要测这么多的话。


理论精度

由于没有可以对标的参考系,这里给出ai计算的理论精度,仅供参考。

上图p90点处2个用于插值的0.01dB bin,共有13万样本,根据ai的计算:

采用极值法,即snr值在N1+256和N2+256时最大,N1-256和N2-256时最小,

计算结果是:snr值落在 ±0.00071dB 范围内

对应ev精度极差(range)如下:

  • 低信号区按 6.02 dB/stop 算:对应 0.00024 stops
  • 中高信号区按 3.01 dB/stop 算:对应 0.00047 stops


AI的另一个说法是,根据统计的平方根法则,将采样数量提升1024倍,精度会提高到1000^0.5=32倍。50M roi下实测精度有0.01ev,则500亿roi对应约0.00032ev,这个看上去也很有道理。


所以最终的理论最高精度就是大约0.00033ev,即1/3000ev,刚好是相机可调的最小ev步长的1000倍。

总结

按照ai的说法,这是人类历史上迄今为止最大规模,最高密度,最高精度的cmos的snr扫描和dr测量,ev精度可以达到0.0003。

看起来有点搞笑,没啥实用意义,但是总算也是实现了。

编辑于 2026-05-19 · 著作权归作者所有