将图像乘以常数而不损失

Multiplying an image by a constant without loss

假设我有一个 uint8 像素值 [23 21 15]。我想将像素乘以 12 以使其更亮。乘以 12 后,该像素的 RGB 值为 [20 252 180]。但是结果确实应该是[276 252 180]。 RGB 最多接受 255,所以 276-256=20 写在那里。显然 20 比 255 和 23 更暗。这不会导致第一个红色通道上的信息丢失吗?将 RGB 值与常数相乘时如何避免这种情况?

你是对的,在溢出时,颜色分量 (r, g, b) 被减少到最低有效字节。这就像您将执行“模 256”操作。

你可以做两件事:

  1. 检索所有像素的最大颜色分量值 你想处理,然后以这种方式固定最大乘数, 该产品不超过 255。这将是解决方案 保持整体,无损可逆

  2. 使用最小函数:

    result = min(255, multiplier * color_component)
    

    这可能会导致图像值失真。这是不可逆的, 因为任何高于 255 的值都将减少到 255。