如何在应用颜色校正之前使输入图像线性化

How to Linearise an Input Image before applying Color Correction?

本文关键字:输入 图像 线性化 应用 颜色      更新时间:2023-10-16

我正在对直接从相机拍摄的原始图像进行颜色校正。我想让我的相机重现与目标相机相同的颜色。

以下是我正在执行的步骤:

  1. 通过使用Target Camera&取一套24个调色板
  2. 通过使用Reference Camera&取一套24个调色板

现在,如果我在这个阶段直接计算颜色校正,则所有白色都显示为玫瑰色或不正确。

所以我应用伽玛校正如下:

  1. 拆分三个通道。对于每种颜色,使用此公式找到该调色板的Gamma。

    float Gamma_R=log10(Target_R/25.50))/(log10(Input_R/255.0);

错误案例:1

如果Input_Channel Value==255,则将其设为254

如果Input_Channel Value==0,则将其设为1

如果gamma_ Channel>3或gamma_;0.2使gamma_Channel为1。

  • 对所有24种颜色的Gamma_R的值进行平均&将此作为该通道的伽玛。

  • 使用公式为每个通道计算的Gamma为每个通道应用Gamma。

    校正的_R=255*(输入_R/255)^(1/Gamma_R)

我的问题:

  • 在这个阶段如何确保我计算的伽马值是正确的?如果我做错了,也要纠正我。

  • 发生以下错误情况:1时该怎么办?

  • 在应用伽玛校正&使用3x3矩阵进行颜色校正(假设我做得正确)仍然无法正确再现颜色。

  • 如果我使用这个公式使用上一阶段的相同gamma值对gamma进行编码,那么颜色也不会正确再现。

    校正的_R=255*(输入_R/255)^(伽马_R)

  • 那么,我需要根据颜色校正输出再次计算Gamma吗?

如有任何建议或参考,不胜感激!

在不偏离Spektre答案的情况下,请注意,使用正确的近似可以获得良好的结果,我首先尝试的是线性近似。几个注意事项:

  1. 你提到的;γ";似乎混淆了两件非常不同的事情:(a);伽马膨胀";可能已经或可能没有应用于数字转换后的线性传感器值,以及(b)您可能想要用来匹配颜色空间的幂律曲线。在这里我们将集中讨论(a)。例如,如果你知道你的传感器以每个物理(拜耳模式)像素10或12位的速度进行记录,但在颜色镶嵌后,相机以每个通道8位的速度生成图像,那么在颜色镶嵌之前通常会应用非线性(美国幂律)展开步骤,以匹配人眼对强度的反应(人类对低强度值不太敏感,因此应该将更多的比特分配给强度范围的高端)。这与旧的";伽玛压缩";在CRT监视器上显示时使用的变换
  2. 以上这一点意味着,如果您怀疑这样的伽马展开已应用于图像的亮度值,则在尝试任何颜色空间匹配之前,应将其反转以获得(近似)亮度线性值。如果您计划使用线性匹配方法,这一点尤其重要,正如我接下来要建议的那样
  3. 一旦你在线性亮度空间中有了输入和参考(目标)图像,你就可以使用麦克白颜色表的图像来尝试它们之间的线性匹配。要做到这一点,你首先必须在(数学)线性空间中表示你的颜色,例如";CIELAB";。在维基百科上查找RGB到CIELAB的转换方程。它们要求您指定色温,并且这应该与拍摄彩色图表图像时的色温相同(或接近)(例如日光~=6500K)
  4. 然后可以线性地匹配输入和参考CIELAB值。这意味着对于所有参考和输入颜色值,估计3x3颜色变换Q,使得reference_lab~=Q*input_lab。要计算估计值,您可以在两张图像上选择麦克白图彩色补丁上的像素(通常每个补丁中有几百个),然后对它们进行平均,以获得每张图像中每个补丁的单个值。这些是你估计Q的输入输出值。估计使用标准的线性最小二乘算法(例如,匹配问题所隐含的设计矩阵的RQ或SVD因子分解)
  5. 至于实用性,在匹配时要注意异常值——异常值肯定会使任何非鲁棒线性算法变得毫无意义。特别是,请确保选择匹配的像素位于每个彩色补丁的图像内部,以避免在补丁边界处混合。此外,请注意保持图表的方向与两台相机的方向大致相同,并使其照明尽可能均匀

稍微小心一点,线性近似应该会给你一个非常接近的匹配。请记住,估计的变换仅在线性CIELAB颜色空间中有效,因此要应用于自然(非图表)图像,您必须遵循整个变换链:撤消强度的gamma展开=>转换为实验室=>应用Q=>向RGB的反向转换=>伽马压缩回到8bpp。

线性近似通常也是非线性精化的良好起点,在非线性精化中;"小";,通常是多项式,对Q变换值进行校正以改善输出的视觉外观。

我对伽马校正有一个小建议:

不要对你获得的gamma求平均值,而是做一个小的迷你化过程,如下所示:找到最小化|ref-F(qry,**Gamma**)|Gamma;ref是第一相机图像,qry是第二相机图像。问候

我认为您需要以不同的方式处理

检查你的相机是否使用相同的波段。如果没有,那么你就有大麻烦了。这个:

  • 多波段渲染

可能会照射一些光。你需要将波段处理为连续光谱,因此将一个相机的颜色处理为曲线的控制点,并获得第二个相机波段的点。但对于仅3个波段(标准相机的常见情况),这不是很精确。只有在这之后,您才能应用以下

如果波段相同或非常接近,则执行以下操作:

  1. 获得每个相机的每个波段的传递函数

    它的形式是:

    R'=r0+r1*R+r2*R*R+...
    


    其中R'是红带的真实强度。R是相机返回的强度
    CCD_ 4是像偏压、亮度、伽玛等传递函数常数,。。。

    这只能从颜色梯度中获得。不要使用调色板使用带色渐变代替

  2. 当你看多项式时,它们是曲线

    所以计算你的相机的真实强度,找到曲线上的点,它在你的第二台相机上返回相同的强度,这就是每个波段的输出。。。

    你可以使用垃圾箱搜索。。。或计算逆多项式