【问题标题】:Convert RGB channels to integer ratios将 RGB 通道转换为整数比率
【发布时间】:2015-08-05 08:57:42
【问题描述】:

当我获得 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)

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

我尝试将所有通道除以它们的最小值,然后对其进行四舍五入,但它会为 (3, 2, 0) 生成 (2, 1, 0),这不必要地不精确。

【问题讨论】:

  • 我认为您将需要一个通道,通过某种算法将其声明为足够重要以成为单位比率。例如 (255, 128, 0) 以某种方式将 128 声明为单位比 1,然后其余通道将除以 128,然后将其四舍五入。我们只需要计算“单位比率的通道”算法,如果没有任何可行的渠道作为单位比率(例如您的情况(3,2,1),那么它只会返回(3,2,1 ). 只是我的想法,希望对您有所帮助:)
  • 您在这里的最终目标是什么?这解决了什么问题?如果你想节省内存,这不会节省太多。如果您想表征色调,您可能应该将 RGB 转换为 HSV 颜色空间。
  • @David 在游戏中混合灯光对象以产生某种颜色的灯光。只有红、蓝、绿灯。我不想创建 255 个红灯,因为这不会影响色调。
  • 我知道这是一个老问题,但我实际上认为您正在寻找 alpha 混合。 stackoverflow.com/questions/2780/…

标签: algorithm language-agnostic


【解决方案1】:

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

  1. 找出比率不大于给定 maxRatio 的最佳解决方案:

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

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

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

【讨论】:

    【解决方案2】:

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

    -或-

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-01
      • 2012-08-27
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 2015-07-05
      相关资源
      最近更新 更多