如何在应用颜色校正之前使输入图像线性化
How to Linearise an Input Image before applying Color Correction?
我正在对直接从相机拍摄的原始图像进行颜色校正。我想让我的相机重现与目标相机相同的颜色。
以下是我正在执行的步骤:
- 通过使用Target Camera&取一套24个调色板
- 通过使用Reference Camera&取一套24个调色板
现在,如果我在这个阶段直接计算颜色校正,则所有白色都显示为玫瑰色或不正确。
所以我应用伽玛校正如下:
-
拆分三个通道。对于每种颜色,使用此公式找到该调色板的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答案的情况下,请注意,使用正确的近似可以获得良好的结果,我首先尝试的是线性近似。几个注意事项:
- 你提到的;γ";似乎混淆了两件非常不同的事情:(a);伽马膨胀";可能已经或可能没有应用于数字转换后的线性传感器值,以及(b)您可能想要用来匹配颜色空间的幂律曲线。在这里我们将集中讨论(a)。例如,如果你知道你的传感器以每个物理(拜耳模式)像素10或12位的速度进行记录,但在颜色镶嵌后,相机以每个通道8位的速度生成图像,那么在颜色镶嵌之前通常会应用非线性(美国幂律)展开步骤,以匹配人眼对强度的反应(人类对低强度值不太敏感,因此应该将更多的比特分配给强度范围的高端)。这与旧的";伽玛压缩";在CRT监视器上显示时使用的变换
- 以上这一点意味着,如果您怀疑这样的伽马展开已应用于图像的亮度值,则在尝试任何颜色空间匹配之前,应将其反转以获得(近似)亮度线性值。如果您计划使用线性匹配方法,这一点尤其重要,正如我接下来要建议的那样
- 一旦你在线性亮度空间中有了输入和参考(目标)图像,你就可以使用麦克白颜色表的图像来尝试它们之间的线性匹配。要做到这一点,你首先必须在(数学)线性空间中表示你的颜色,例如";CIELAB";。在维基百科上查找RGB到CIELAB的转换方程。它们要求您指定色温,并且这应该与拍摄彩色图表图像时的色温相同(或接近)(例如日光~=6500K)
- 然后可以线性地匹配输入和参考CIELAB值。这意味着对于所有参考和输入颜色值,估计3x3颜色变换Q,使得reference_lab~=Q*input_lab。要计算估计值,您可以在两张图像上选择麦克白图彩色补丁上的像素(通常每个补丁中有几百个),然后对它们进行平均,以获得每张图像中每个补丁的单个值。这些是你估计Q的输入输出值。估计使用标准的线性最小二乘算法(例如,匹配问题所隐含的设计矩阵的RQ或SVD因子分解)
- 至于实用性,在匹配时要注意异常值——异常值肯定会使任何非鲁棒线性算法变得毫无意义。特别是,请确保选择匹配的像素位于每个彩色补丁的图像内部,以避免在补丁边界处混合。此外,请注意保持图表的方向与两台相机的方向大致相同,并使其照明尽可能均匀
稍微小心一点,线性近似应该会给你一个非常接近的匹配。请记住,估计的变换仅在线性CIELAB颜色空间中有效,因此要应用于自然(非图表)图像,您必须遵循整个变换链:撤消强度的gamma展开=>转换为实验室=>应用Q=>向RGB的反向转换=>伽马压缩回到8bpp。
线性近似通常也是非线性精化的良好起点,在非线性精化中;"小";,通常是多项式,对Q变换值进行校正以改善输出的视觉外观。
我对伽马校正有一个小建议:
不要对你获得的gamma求平均值,而是做一个小的迷你化过程,如下所示:找到最小化|ref-F(qry,**Gamma**)|
的Gamma;ref是第一相机图像,qry是第二相机图像。问候
我认为您需要以不同的方式处理
检查你的相机是否使用相同的波段。如果没有,那么你就有大麻烦了。这个:
- 多波段渲染
可能会照射一些光。你需要将波段处理为连续光谱,因此将一个相机的颜色处理为曲线的控制点,并获得第二个相机波段的点。但对于仅3个波段(标准相机的常见情况),这不是很精确。只有在这之后,您才能应用以下
如果波段相同或非常接近,则执行以下操作:
-
获得每个相机的每个波段的传递函数
它的形式是:
R'=r0+r1*R+r2*R*R+...
其中R'
是红带的真实强度。R
是相机返回的强度
CCD_ 4是像偏压、亮度、伽玛等传递函数常数,。。。这只能从颜色梯度中获得。不要使用调色板使用带色渐变代替
-
当你看多项式时,它们是曲线
所以计算你的相机的真实强度,找到曲线上的点,它在你的第二台相机上返回相同的强度,这就是每个波段的输出。。。
你可以使用垃圾箱搜索。。。或计算逆多项式
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有没有办法将两个输入图像堆叠到卤化物发生器中的单个 4 维缓冲区中?
- 如果输入图像矩阵实际上是复杂类型,MATLAB imresize() 会怎么做?
- 输入层类型:图像数据在窗口咖啡cpp中给出空白输出
- 使用 FFMPEG 将每个输入图像转换为 H264 编译时出错,该图像在 MevisLab 中运行的 Visual St
- 键盘输入以保存从OpenCV中的视频流中检测到的图像
- 如何在应用颜色校正之前使输入图像线性化
- 在opencv中发现凸性缺陷?[崩溃取决于给定的输入图像]
- OpenCV,在显示图像时读取用户文本输入(使用 waitKey)
- 如何在大量无损压缩图像中挑选重复的图像对(完全相同)?如何在内存中输入标准::哈希
- 使用 OpenCV 显示图像,并在C++中的特定点上输入文本
- 如何在libsvm训练代码中输入样本图像
- 让用户通过控制台OpenCV c++输入图像目的地
- 如何在c++ OpenCV中将图像(Mat)转换为输入数组
- c++在WinAPI中根据用户输入改变图像
- 如何将视频文件作为输入传递给NodeJS中的子进程,并接收帧/图像作为输出
- QT在向qLabel显示图像时无法检测输入文件
- 从输入图像中提取色调范围
- 用户界面-Adobe Adam and Eve,C++:如何创建可点击按钮、轨迹栏、文本输入字段和图像
- 显示自定义图像并能够捕捉鼠标输入