将RGB通道转换为整数比率

时间:2015-05-23 11:00:25

标签: algorithm language-agnostic

当我获得RGB格式的颜色时,如何将通道转换为(近似)整数比? 例如:

(255, 0, 0)   -> (1, 0, 0)
(255, 128, 0) -> (2, 1, 0)
(128, 64, 0)  -> (2, 1, 0)
(255, 1, 0)   -> (1, 0, 0)
(3, 2, 0) -> (3, 2, 0)
(11, 5, 0) -> (11, 5, 0) or possibly (2, 1, 0)

如您所见,结果整数应尽可能小,但仍然相当精确,因此色调中的误差与人眼无法区分。

我尝试将所有频道划分为最小值,然后将其舍入,但它为(2, 1, 0)生成(3, 2, 0),这是不必要的不​​精确。

2 个答案:

答案 0 :(得分:1)

您可以尝试减少因子(1,2,4,8,...,256)并计算一些"舍入误差"。然后坚持使用可接受误差的最大因子。

<强> -OR -

只需将RGB转换为色相,饱和度,值(HSV),并在一组有限的色调值上选择最接近的色调值。

答案 1 :(得分:1)

我可以看到两种合理的策略来计算最佳比率。它们都需要一个额外的参数,您必须进行一些实验才能看到您认为仍然可以容忍的内容(1. maxRatio,2。maxError):

  1. 找到没有大于给定maxRatio的比率的最佳解决方案:

    如果你应用这个策略,那么一个解决方案(如果你不太关心性能)是获得最大的颜色值并除以最大比率(小心,没有整数除法,可能需要施放得到因子f。现在,您将其他颜色除以f并将结果四舍五入以再次获得整数。将检索到的比率乘以f减去实际颜色值,将其平方并取所有值的总和。存储此错误并重复减少maxRatio一。直到maxRatio是两个或一个。找到最小的错误并返回相应的比率。 (这只是为了简化您到目前为止只能跟踪最佳解决方案及其错误,并且不需要存储所有这些解决方案。)

  2. 查找不超过maxError的最小比率

    这个策略有点困难。如果您更关心性能,那么您可以执行以下操作:保存原始颜色的副本作为最佳比率,一个作为当前比率。然后你开始减小当前比率的值,直到一个值为0或最大值为1,如下所示:找到当前比率的最大值,将其减1(如果有相等的值,则选择颜色较大的值)然后看看减小当前比率的其他值是否会减少误差(如果是这样,减少)。如果当前比率的误差小于maxError,则将其保存为最佳比率。并继续减少。