确定没有EXIF数据的图像之间的停止差异



我有一组相同场景的照片,但拍摄的曝光不同。这些图像没有EXIF数据,所以没有办法提取有用的信息,如光圈,快门速度等。

我想做的是确定图像之间的停止差异,即Image1是Image0的+1.3停止。

我目前的方法是首先使用公式

从图像的RGB值计算亮度

L = 0.2126 * R + 0.7152 * G + 0.0722 * B

我见过在方程中使用不同的数字,但一般来说,它不应该对最终结果L影响太大。

之后,我推导出图像的对数平均亮度。

exp(avg of log(luminance of image))

但不知何故,对数平均亮度似乎并没有给出太多的指示曝光差异的图像。对如何确定曝光差有什么想法吗?

一般要解决两个问题:

1。线性化图像数据

(如果意思不明显:像素收集的光增加两倍,将导致线性化的图像中的强度值增加两倍)

您的图像输入可能已经(充分)线性化了->您可以跳到第2部分。如果你的内容来自相机,并且是JPEG格式,那么这肯定不会是这种情况。

这个问题的真正"解决方案"是找到相机响应函数,您希望将其反转并应用于图像数据以获得线性强度值。这绝不是一项微不足道的任务。EMoR模型被广泛应用于各种软件(Photoshop, PTGui, Photomatix等)中来描述相机响应函数。一些开源软件解决了这个问题(但使用不同的模型iirc)是pfcalibrate。

说到这里,你可以用一个简单的逆应用。通过这样做可以找到正确伽马值的粗略"估计":

  1. 用两个曝光时间ee/2
  2. 捕捉均匀光照的静态场景
  3. 在两个图像上应用一对反伽玛变换(例如在0.1步中从1.8到2.4)
  4. 将所有短曝光图像与2.0相乘,并从各自的长曝光图像中减去它们
  5. 选择导致最小总体差异的伽马

2。求辐照的实际差值,即log2(比例因子)

假设场景是静态的(没有移动的物体或相机),这是相对容易的:

sum1 = sum2 = 0
foreach pixel pair (p1,p2) from the two images:
  if p1 or p2 is close to 0 or 255:
    skip this pair
  sum1 += p1 and sum2 += p2
return log2(sum1 / sum2)

对于大的图像,这当然会工作得很好,如果你对图像进行子采样,速度会快得多。

如果相机是静态的,但场景不是(移动的物体),这开始工作不太好。在这种情况下,我通过简单地重复上述过程几次并使用前一次运行的输出作为正确比例因子的估计,然后丢弃商离当前估计太远的像素对,从而产生了可接受的结果。所以基本上用下面的代码替换上面的if行:

if <see above> or if abs(log2(p1/p2) - estimate) > 0.5:

我将在固定次数的迭代之后停止重复,或者如果两个连续的估计彼此足够接近。

编辑:关于亮度转换的注释

你根本不需要这样做(正如Tony D已经提到的),如果你坚持,那么在线性化步骤之后再做(正如Mark Ransom所指出的)。在一个完美的设置中(静态场景,没有噪声,没有去马赛克,没有量化),每个像素的每个通道将具有相同的p1/p2比率(如果两者都不饱和)。因此,不同信道的相对权重是不相关的。您可以将所有像素/通道相加(R, G和B的权重相等),或者可能只使用绿色通道。

最新更新