3

我有一组相同场景但曝光不同的图像。这些图像没有 EXIF 数据,因此无法提取 f-stop、快门速度等有用信息。

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

我目前的方法是首先使用公式从图像的 RGB 值计算亮度

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

我已经看到方程式中使用了不同的数字,但通常它不会对最终结果 L 产生太大影响。

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

exp(avg of log(luminance of image))

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

编辑:在 C/C++ 上

4

1 回答 1

1

您通常必须解决两个问题:

1.线性化你的图像数据

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

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

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

话虽如此,您可能会使用一个简单的逆伽马应用程序。可以通过执行以下操作找到正确 gamma 值的粗略“估计”:

  1. 使用两个曝光时间ee/2捕捉均匀照明的静态场景
  2. 在两个图像上应用几个逆伽马变换(例如,以 0.1 步长从 1.8 到 2.4)
  3. 将所有短曝光图像乘以 2.0,然后从相应的长曝光图像中减去它们
  4. 选择导致最小整体差异的伽玛

2.求出实际的辐照度差,即log2(scale factor)

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

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 进行同等加权),或者只使用绿色通道。

于 2013-02-23T21:56:36.673 回答