处理RGB中的“超出色域”颜色到CIEL * a * b *到RGB转换

时间:2013-12-03 21:54:04

标签: c++ image colors

我有功能(c ++)将游戏图像(SDL2 SDL_Surface)从RGB转换为CIEXYZ转换为CIEL * a * b *,以便调整色调,亮度,饱和度,在视觉上比HSV空间更自然。这是有效的,除了那些在过程中从RGB色域调整的像素。

虽然很容易通过以下方式强制将值重新调整为色域:

  • 单独裁剪低于0到0且高于255到255的子像素值,或

  • 通过除以(max-min)并减去min /(max-min)来压缩并将整个像素或整个图像移动到0-255范围内;

这些选项会导致在同一图像上进行多次操作时出现严重错误。我正在寻找在代码中处理色域外子像素的破坏性最小的方法。通过浏览Google的许多页面,可以获得至少数百个Photoshop链接,一些面向设计的链接以及对像LittleCMS这样的CMS的引用。

我需要一个算法解决方案来放入c ++代码。

注意:只是进行一些基本的实验,在整个图像上使用线性压缩会导致数百次迭代时亮度的大量损失,计算会以浮点数形式发生。下面对sigmoid压缩评论的进一步了解是最受欢迎的。

1 个答案:

答案 0 :(得分:1)

您面临的根本问题是色彩空间之间的多次转换。如果转换不是无损的,那么您将获得累积工件。

更好的解决方案是将所有图像保存在一个色彩空间中,并在该色彩空间内完成所有操作。将转化视为单行道,将副本转换为RGB以供显示。不要来回转换。