处理 RGB 到 CIEL*a*b* 到 RGB "Out-of-Gamut"颜色转换
Handle "Out-of-Gamut" Color in RGB to CIEL*a*b* to RGB Conversions
我有一些函数(c++),可以将游戏图像(SDL2 SDL_Surface)从RGB通过CIEXYZ转换为CIEL*a*b*,这样对色调、亮度和饱和度的调整将比在HSV空间中更自然。这是有效的,除了那些在这个过程中被调整出RGB色域的像素。
虽然通过以下方式强制值返回色域是很容易的:
-
分别裁剪0到0以下和255到255以上的子像素值,或
-
通过除以(max-min)并减去min/(max-min.),将整个像素或整个图像压缩并移动到0-255范围内;
当对同一图像进行多次操作时,这些选项会导致严重的伪影。我正在寻找处理代码中色域外子像素的破坏性最小的方法。在谷歌的许多页面上搜索,结果至少有数百个Photoshop链接、一些面向设计的链接和对LittleCMS等CMS的引用。
我需要一个算法解决方案来放入c++代码中。
注意:仅仅做一些基本的实验,对整个图像使用线性压缩会导致数百次迭代中亮度的巨大损失,而计算是以浮点形式进行的。欢迎进一步深入了解下面的sigmoid压缩评论。
您面临的根本问题是颜色空间之间的多次转换。如果转换不是无损的,那么你会得到累积的伪影。
更好的解决方案是将所有图像保持在一个颜色空间中,并在该颜色空间中进行所有操作。将转换视为单行道,将副本转换为RGB进行显示。不要来回转换。
相关文章:
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 解决方案在第 25 行执行错误'out of bounds'
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 从 MSVC14 切换到 MSVC16 会导致"compiler is out of heap space (C1060)"错误
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 如何解决'vector subscript out of range'错误?
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 空集"Out of bound iterator"
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 注册 Clang 检查器时出错:"out-of-line-definition of register"
- QList::operator[]中的断言失败<T>:QJoysticks 中的"index out of range"
- 尝试获取矩阵的正确对角线会导致"vector out of range"错误
- 运算符方法和返回对象"out-of-scope"?
- 如何使用 mpi 分散修复"vector subscript out of range"?
- 如何修复邻接列表中的"Debug Assertion Failed" "vector subscript out of range"
- "Vector subscript out of range",在返回声明?
- QList<T>::operator[]: "index out of range" 中的断言失败
- 多次调用存储过程时C++连接器"Commands out of sync" mySQL
- 如何处理C++'index out of bounds error'?
- 处理 RGB 到 CIEL*a*b* 到 RGB "Out-of-Gamut"颜色转换