如何在应用颜色校正之前线性化输入图像?
How to Linearise an Input Image before applying Color Correction?
我正在对直接从相机拍摄的原始图像进行色彩校正。我想让我的相机重现与我的 Target 相机相同的颜色。
以下是我要执行的步骤:
- 通过使用目标相机捕获 Macbeth 颜色图表并获取一组 24 个调色板来获取目标颜色值。
- 通过使用参考相机捕获相同的 Macbeth 颜色图表并获取 24 个调色板的集合来获取输入颜色值。
现在,如果我在这个阶段直接计算色彩校正,所有白色都呈现玫瑰色或不正确。
所以我按如下方式应用 Gamma 校正:
拆分三个通道。对于每种颜色,使用此公式找到该调色板的 Gamma。
浮动Gamma_R = log10(Target_R/255.0))/(log10(Input_R/255.0);
错误Cases: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 时该怎么办?
使用 3x3 矩阵应用 Gamma 校正和颜色校正后(假设我做的正确)仍然无法正确再现颜色。
如果我使用此公式使用前一阶段的相同 Gamma 值对 Gamma 进行编码,颜色将再次无法正确再现。
Corrected_R = 255 * (Input_R/255)^(Gamma_R)
所以我需要从色彩校正输出中再次计算 Gamma 吗?
非常感谢任何建议或参考!
我认为您需要以不同的方式处理这个问题
检查您的相机是否使用相同的波段。如果不是,那你就有大麻烦了。这个:
可能会发光。您需要将波段作为连续光谱来处理,以便将一台摄像机的颜色作为曲线的控制点来处理,并获取第二台摄像机的波段的点。但仅对于 3 个波段(标准相机的通常情况),这不是很精确。只有在这之后你才能申请以下
如果条带相同或非常接近,则执行此操作:
获取每个相机每个波段的传递函数
它将采用以下形式:
R'=r0+r1*R+r2*R*R+...
其中 R'
是红色波段的实际强度。 R
是相机 return 的强度
r0,r1,..
是传递函数常量,如偏差、亮度、伽玛...
这只能从颜色渐变中获得。不要使用调色板,而是使用色带渐变
当你看多项式时它们是曲线
因此计算您相机的实际强度并找到曲线上的点,该点 return 与您的第二台相机的强度相同,这是每个波段的结果输出...
您可以对此使用 bin 搜索...或计算反多项式
在不影响 Spektre 的回答的情况下,请注意,使用正确的近似值可以获得良好的结果,而我首先尝试的是线性近似值。一些注意事项:
- 您提到的“伽马”似乎混淆了两个截然不同的事情:(a) 可能已或可能未应用于线性传感器值的“伽马扩展” post 数字转换, (b) 幂律曲线,您可能想使用它来匹配颜色 spaces。这里我们将集中讨论(a)。例如,如果您知道您的传感器以每个物理(拜耳模式)像素 10 或 12 位记录,但相机在彩色拼接后以每通道 8 位产生图像,通常会有非线性(通常是功率-law) 在彩色拼接之前应用扩展步骤,以匹配人眼对强度的反应(人类对低强度值不太敏感,因此应将更多位分配给强度范围的较高端)。这与在 CRT 显示器上显示时使用的旧“伽马压缩”变换的想法相同(但应用程序不同)。
- 上述观点意味着,如果您怀疑此类伽马扩展已应用于图像的亮度值,则应在尝试任何颜色之前将其反转以获得(近似)亮度线性值space匹配。如果您打算使用线性匹配方法,这一点尤为重要,正如我接下来要建议的那样。
- 一旦您的输入图像和参考(目标)图像都具有线性亮度 space,您可以尝试使用 Macbeth 颜色图表的图像在它们之间进行线性匹配。为此,您首先必须以(数学)线性 space 表示您的颜色,例如“CIELAB”。在维基百科上查找从 RGB 到 CIELAB 的转换方程。他们要求您指定色温,这应该与捕获色卡图像时的色温相同(或接近)(例如日光 ~= 6500K)。
- 然后可以线性匹配输入和参考 CIELAB 值。这意味着为所有参考和输入颜色值估计 3x3 颜色变换 Q,使得 reference_lab ~= Q * input_lab。要计算估计值,您可以在两个图像上 select Macbeth 图表彩色块上的像素(每个块通常有几百个),然后对它们进行平均以获得每个图像中每个块的单个值。这些是您估计 Q 所依据的输入输出值。估计使用标准线性最小二乘算法(例如,匹配问题隐含的设计矩阵的 RQ 或 SVD 分解)。
- 至于实用性,匹配时要注意异常值 - 异常值肯定会使任何非稳健的线性算法变得毫无意义。特别是,确保您 select 用于匹配的像素完全位于每个彩色补丁的图像内部,以避免在补丁边界处混合。另外,请注意以大致相同的方式保持图表的方向 w.r.t。两个摄像头,照明尽可能均匀。
稍加注意,线性近似值应该可以为您提供非常接近的匹配。请记住,估计的变换仅在线性 CIELAB 颜色 space 中有效,因此要应用于自然(非图表)图像,您必须遵循整个变换链:撤消强度的伽玛扩展 => 转换为Lab => 应用 Q => 反向转换为 RGB => 伽玛压缩返回 8bpp。
线性近似通常也是非线性细化的良好起点,您可以在其中尝试估计“小”(通常是多项式)对 Q 变换值的校正以改善输出的视觉外观。
我对Gamma校正有个小建议:
不要对您获得的伽玛进行平均,而是执行如下所示的小型最小化过程:
找到最小化 |ref-F(qry,**Gamma**)|
的 Gamma ; ref 是第一个相机图像,qry 是第二个相机图像。
此致
我正在对直接从相机拍摄的原始图像进行色彩校正。我想让我的相机重现与我的 Target 相机相同的颜色。
以下是我要执行的步骤:
- 通过使用目标相机捕获 Macbeth 颜色图表并获取一组 24 个调色板来获取目标颜色值。
- 通过使用参考相机捕获相同的 Macbeth 颜色图表并获取 24 个调色板的集合来获取输入颜色值。
现在,如果我在这个阶段直接计算色彩校正,所有白色都呈现玫瑰色或不正确。
所以我按如下方式应用 Gamma 校正:
拆分三个通道。对于每种颜色,使用此公式找到该调色板的 Gamma。
浮动Gamma_R = log10(Target_R/255.0))/(log10(Input_R/255.0);
错误Cases: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 时该怎么办?
使用 3x3 矩阵应用 Gamma 校正和颜色校正后(假设我做的正确)仍然无法正确再现颜色。
如果我使用此公式使用前一阶段的相同 Gamma 值对 Gamma 进行编码,颜色将再次无法正确再现。
Corrected_R = 255 * (Input_R/255)^(Gamma_R)
所以我需要从色彩校正输出中再次计算 Gamma 吗?
非常感谢任何建议或参考!
我认为您需要以不同的方式处理这个问题
检查您的相机是否使用相同的波段。如果不是,那你就有大麻烦了。这个:
可能会发光。您需要将波段作为连续光谱来处理,以便将一台摄像机的颜色作为曲线的控制点来处理,并获取第二台摄像机的波段的点。但仅对于 3 个波段(标准相机的通常情况),这不是很精确。只有在这之后你才能申请以下
如果条带相同或非常接近,则执行此操作:
获取每个相机每个波段的传递函数
它将采用以下形式:
R'=r0+r1*R+r2*R*R+...
其中R'
是红色波段的实际强度。R
是相机 return 的强度r0,r1,..
是传递函数常量,如偏差、亮度、伽玛...这只能从颜色渐变中获得。不要使用调色板,而是使用色带渐变
当你看多项式时它们是曲线
因此计算您相机的实际强度并找到曲线上的点,该点 return 与您的第二台相机的强度相同,这是每个波段的结果输出...
您可以对此使用 bin 搜索...或计算反多项式
在不影响 Spektre 的回答的情况下,请注意,使用正确的近似值可以获得良好的结果,而我首先尝试的是线性近似值。一些注意事项:
- 您提到的“伽马”似乎混淆了两个截然不同的事情:(a) 可能已或可能未应用于线性传感器值的“伽马扩展” post 数字转换, (b) 幂律曲线,您可能想使用它来匹配颜色 spaces。这里我们将集中讨论(a)。例如,如果您知道您的传感器以每个物理(拜耳模式)像素 10 或 12 位记录,但相机在彩色拼接后以每通道 8 位产生图像,通常会有非线性(通常是功率-law) 在彩色拼接之前应用扩展步骤,以匹配人眼对强度的反应(人类对低强度值不太敏感,因此应将更多位分配给强度范围的较高端)。这与在 CRT 显示器上显示时使用的旧“伽马压缩”变换的想法相同(但应用程序不同)。
- 上述观点意味着,如果您怀疑此类伽马扩展已应用于图像的亮度值,则应在尝试任何颜色之前将其反转以获得(近似)亮度线性值space匹配。如果您打算使用线性匹配方法,这一点尤为重要,正如我接下来要建议的那样。
- 一旦您的输入图像和参考(目标)图像都具有线性亮度 space,您可以尝试使用 Macbeth 颜色图表的图像在它们之间进行线性匹配。为此,您首先必须以(数学)线性 space 表示您的颜色,例如“CIELAB”。在维基百科上查找从 RGB 到 CIELAB 的转换方程。他们要求您指定色温,这应该与捕获色卡图像时的色温相同(或接近)(例如日光 ~= 6500K)。
- 然后可以线性匹配输入和参考 CIELAB 值。这意味着为所有参考和输入颜色值估计 3x3 颜色变换 Q,使得 reference_lab ~= Q * input_lab。要计算估计值,您可以在两个图像上 select Macbeth 图表彩色块上的像素(每个块通常有几百个),然后对它们进行平均以获得每个图像中每个块的单个值。这些是您估计 Q 所依据的输入输出值。估计使用标准线性最小二乘算法(例如,匹配问题隐含的设计矩阵的 RQ 或 SVD 分解)。
- 至于实用性,匹配时要注意异常值 - 异常值肯定会使任何非稳健的线性算法变得毫无意义。特别是,确保您 select 用于匹配的像素完全位于每个彩色补丁的图像内部,以避免在补丁边界处混合。另外,请注意以大致相同的方式保持图表的方向 w.r.t。两个摄像头,照明尽可能均匀。
稍加注意,线性近似值应该可以为您提供非常接近的匹配。请记住,估计的变换仅在线性 CIELAB 颜色 space 中有效,因此要应用于自然(非图表)图像,您必须遵循整个变换链:撤消强度的伽玛扩展 => 转换为Lab => 应用 Q => 反向转换为 RGB => 伽玛压缩返回 8bpp。
线性近似通常也是非线性细化的良好起点,您可以在其中尝试估计“小”(通常是多项式)对 Q 变换值的校正以改善输出的视觉外观。
我对Gamma校正有个小建议:
不要对您获得的伽玛进行平均,而是执行如下所示的小型最小化过程:
找到最小化 |ref-F(qry,**Gamma**)|
的 Gamma ; ref 是第一个相机图像,qry 是第二个相机图像。
此致