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

时间:2015-04-16 06:45:21

标签: c++ opencv image-processing colors camera

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

以下是我要遵循的步骤:

  1. 使用Target Camera& amp;拍摄Macbeth颜色图表,获取目标颜色值。取一套24个调色板。
  2. 通过使用Reference Camera& amp;获取相同的Macbeth Color图表来获取输入颜色值。取一套24个调色板。
  3. 现在,如果我在此阶段直接计算颜色校正,则所有白色颜色都显示为玫瑰色或不正确。

    所以我按照以下方式应用Gamma校正:

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

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

    2. 错误案例:1

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

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

      如果gamma_Channel> 3或gamma_Channel< 0.2使gamma_Channel为1。

      • 平均所有24种颜色的Gamma_R值和&把它作为一个 该频道的伽玛。

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

        Corrected_R = 255 *(Input_R / 255)^(1 / Gamma_R)

      我的问题:

      • 如何确保我在此阶段计算出的Gamma值是正确的?如果我做错了也要纠正我。

      • 以下错误案例:1发生时该怎么办?

      • 应用Gamma校正&使用3x3矩阵进行色彩校正(假设我正确地执行了此操作)仍然无法正确再现色彩。

      • 如果我使用此公式使用上一阶段中相同的Gamma值对伽玛进行编码,则再次无法正确再现颜色。

        Corrected_R = 255 *(Input_R / 255)^(Gamma_R)

      • 那么我需要从色彩校正输出再次计算Gamma吗?

      非常感谢任何建议或参考资料!

3 个答案:

答案 0 :(得分:2)

在不减损Spektre的答案的情况下,请注意使用正确的近似值可以获得良好的结果,并且第一次尝试是线性的。几点说明:

  1. 你提到了一个" gamma"似乎混淆了两个截然不同的事情:(a)"伽马扩展"可能会或可能不会应用于数字转换后的线性传感器值,以及(b)您可能想要用来匹配颜色空间的幂律曲线。在这里,我们将专注于(a)。例如,如果您知道您的传感器正在以每个物理(拜耳模式)像素为10或12位进行录制,但是相机会在彩色镶嵌后生成每通道8位的图像,通常会出现非线性(通常为电源)在彩色拼接之前应用扩展步骤,以匹配人眼对强度的响应(人类在低强度值时不太敏感,因此应将更多位分配到强度范围的较高端)。这与旧的"伽马压缩"相同(但是应用程序不同)。在CRT显示器上显示时使用的转换。
  2. 上述观点意味着,如果您怀疑此类伽马扩展已应用于图像的亮度值,则应先将其反转,以便在尝试任何色彩空间匹配之前获得(近似)亮度线性值。如果您计划使用线性匹配方法,这一点尤为重要,我将在下一步提出建议。
  3. 在线性亮度空间中同时输入您的输入和参考(目标)图像后,您可以使用Macbeth颜色图表的图像尝试它们之间的线性匹配。要做到这一点,你首先必须在(数学)线性空间中表示你的颜色,例如" CIELAB&#34 ;.在维基百科上查找从RGB到CIELAB的转换方程。它们要求您指定色温,这应该与捕获色图图像时的色温相同(或接近)(例如,日光〜= 6500K)。
  4. 输入和参考CIELAB值可以线性匹配。这意味着对于所有参考和输入颜色值估计3x3颜色变换Q,使得reference_lab~ = Q * input_lab。要计算估计值,您可以在两个图像上选择Macbeth图表的彩色色块上的像素(通常每个色块中有几百个),然后对它们求平均值,以便在每个图像中获得每个色块的单个值。这些是您估算Q的输入输出值。估算使用标准线性最小二乘算法(例如匹配问题隐含的设计矩阵的RQ或SVD因子分解)。
  5. 至于实用性,在匹配时要注意异常值 - 异常值肯定会使任何非鲁棒的线性算法变得毫无意义。特别是,请确保您选择匹配的像素位于每个彩色色块的图像内,以避免在色块边框处混合。另外,请注意保持图表的方向与w.r.t大致相同。两台摄像机,照明尽可能均匀。
  6. 稍加注意,线性近似应该给你一个非常接近的匹配。请记住,估计的变换仅在线性CIELAB颜色空间中有效,因此要应用于自然(非图表)图像,您必须遵循整个变换链:撤消强度的伽马扩展=>转换为Lab =>申请Q =>反向转换为RGB =>伽玛压缩回到8bpp。

    线性近似通常也是非线性细化的良好起点,在这种情况下,您尝试估计一个小的"通常是多项式,校正Q变换值以改善视觉外观。输出。

答案 1 :(得分:1)

我认为你需要稍微改变一下

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

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

如果乐队相同或非常接近,那么这样做:

  1. 获取每个摄像机每个频段的传输功能

    它将采用以下形式:

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


    其中R'是红带实际强度。 R是相机返回的强度
    r0,r1,..是偏移,亮度,伽玛等传递函数常数......

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

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

    所以从相机计算实际强度,找到曲线上的点,在第二个相机上返回相同的强度,这就是每个波段的结果输出......

    您可以使用bin搜索...或计算逆多项式

答案 2 :(得分:1)

我对Gamma校正提出了一个小建议:

不要对你获得的游戏进行平均,而是按照以下步骤进行小型缩小: 找到最小化|ref-F(qry,**Gamma**)| Gamma ; ref是第一个相机图像,qry是第二个相机图像。 此致