C++ 确定没有EXIF数据的图像之间的停止差异
我有一组相同场景的图像,但是用不同的曝光拍摄。这些图像没有EXIF数据,因此无法提取有用的信息,如f-stop、快门速度等 我要做的是确定图像之间的停止差,即Image1是Image0的+1.3次停止 我目前的方法是首先使用公式从图像的RGB值计算亮度C++ 确定没有EXIF数据的图像之间的停止差异,c++,c,image-processing,C++,C,Image Processing,我有一组相同场景的图像,但是用不同的曝光拍摄。这些图像没有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)) 但不知何
L=0.2126*R+0.7152*G+0.0722*B
我在等式中看到了不同的数字,但一般来说,它不会对最终结果L产生太大影响
之后,我推导出图像的对数平均亮度
exp(avg of log(luminance of image))
但不知何故,对数平均亮度似乎并没有给出多少关于曝光差异的指示。
关于如何确定曝光差异有什么想法吗
编辑:在c/c++上,通常需要解决两个问题: 1。线性化图像数据 (如果不清楚这意味着什么:像素收集的光线增加两倍,将导致线性化图像中的强度值增加两倍。) 您的图像输入可能已经(充分)线性化->您可以跳到第2部分。如果您的内容来自一个摄像头,并且是JPEG格式,那么情况肯定不是这样 这个问题的真正“解决方案”是找到相机响应函数,您希望将其反转并应用于图像数据以获得线性强度值。这绝不是一项微不足道的任务。该模型广泛应用于各种软件(Photoshop、PTGui、Photomatix等)中,用于描述相机响应功能。一些解决这个问题的开源软件(但使用不同的iirc模型)是不可靠的 话虽如此,您可以使用一个简单的反gamma应用程序。通过执行以下操作,可以找到正确gamma值的粗略“手势”:
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:
if或if abs(log2(p1/p2)-估计值)>0.5:
在固定的迭代次数之后,或者如果两个连续的估计值彼此足够接近,我会停止重复
编辑:关于转换为亮度的注释
你根本不需要这样做(正如Tony D已经提到的),如果你坚持,那么在线性化步骤之后再做(正如Mark Ransom所指出的)。在完美的设置(静态场景、无噪声、无去镶嵌、无量化)中,每个像素的每个通道将具有相同的比率
p1/p2
(如果两者都不饱和)。因此,不同通道的相对权重无关。您可以对所有像素/通道进行求和(R、G和B的权重相等),也可以只使用绿色通道。如果您在图像中选择几个点,比较图像中这些点的值,然后对差异求平均值,是否可行,也许可以排除异常值?亮度的差异应该在任何一个通道中都是明显的-不需要特别组合它们。正如user1118321所说,您希望扔掉异常值(任何接近0或255的点),因为它们可能是添加到图像曝光不足或曝光过度部分的噪声。之后,这可能取决于保存图像时应用的伽马-您可以拍摄一些具有已知f-stop差异的图像,并绘制它们的平均亮度以揭示关系。假设您没有EXIF数据,则无法知道快门速度是否不同?因此,观察亮度的方法只有在快门速度相同的情况下才有效。有一件事你没有提到,你应该在转换为亮度之前进行线性化。问题中给出的常数应适用于线性值,例如,参见