Hacker News 中文摘要

RSS订阅

RGB值应归一化至255还是256? -- Should you normalize RGB values by 255 or 256?

文章摘要

文章讨论了图像处理中将8位RGB值转换为浮点数的两种方法:标准方法是用255归一化,将0映射到0.0,255映射到1.0;另一种方法是用256归一化并加0.5偏移,但会导致处理逻辑与8位输入绑定。标准方法更通用且被GPU采用。

文章总结

标题:RGB值归一化应该用255还是256?

在图像处理程序中,将8位整型颜色值转换为浮点数时存在两种主流方法:

标准方法(除以255): python pixels = img / 255.0 # 0映射为0.0,255映射为1.0 result = process(pixels) output = np.trunc(result * 255 + 0.5)

替代方法(除以256): python pixels = (img + 0.5) / 256.0 # 0映射为0.001953125 result = process(pixels) output = np.trunc(result * 256)

关键差异分析:

  1. 数值分布特性:
  • 标准方法会导致极端值(0和255)的量化区间比其他值小50%
  • 替代方法所有量化区间均匀分布,但黑色像素检测需要额外处理
  1. 量化误差:
  • 标准方法存在约0.00001%的舍入误差(如128/255≈0.501961)
  • 替代方法能保持精确中间值(如128/256=0.5)
  1. 理论框架:
  • 标准方法属于"mid-riser"量化器(L=255)
  • 替代方法属于"mid-tread"量化器(L=256)

实际应用建议: - 处理第三方图像时应使用标准方法(除以255),确保兼容性 - 当完全控制图像生成和处理流程时,可考虑替代方法以获得更均匀的量化分布

注意事项: - 两种方法的编解码步骤不可混用 - 标准方法虽然理论误差略高(1/1020 vs 1/1024),但对已有图像的处理更可靠

(注:原文中的代码示例、数学公式和参考文献链接等专业内容已保留核心信息,删减了部分辅助说明性文字)

评论总结

以下是评论内容的总结:

  1. 支持0-255范围的观点

    • 认为0-255符合无符号字节的规范
      "Should always be 0-255 as that fits an unsigned byte."(评论4)
    • 256会失去设置0值的能力
      "255 gives 0-255...256 is 1-256, you lose the option of setting 0."(评论1)
  2. 支持256范围的观点

    • 类比尺子刻度,应该按长度而非点数归一化
      "If you have a ruler...normalize by the length L and not by 13"(评论2)
    • 建议乘以255.0并使用FPU默认舍入
      "You should multiply by 255.0...let the FPU round"(评论8)
  3. 中间派/混合方案

    • 推荐混合方法:float转uint8用floor(f*256),uint8转float用i/255
      "i = min(floor(f * 256), 255)...f = i / 255"(评论10)
    • +0.5方案可避免边缘半区间问题,且SDR图像不需要绝对零值
      "I don't like half-sized intervals...no absolute zero in the system"(评论3)
  4. 技术实现讨论

    • 指出线性传输函数的假设通常不成立
      "Both assume a linear transfer function, which is rarely the case."(评论5)
    • 建议使用专业库而非自行实现
      "you should use openimageio...more likely to have the right answer"(评论11)
  5. 其他相关讨论

    • 音频领域存在类似非对称范围问题
      "16-bit integer audio is between [-32768, 32767]"(评论7)
    • 网页显示问题影响阅读体验
      "read in landscape mode...most important piece was off-screen"(评论6)

关键分歧点:
- 范围选择(255 vs 256)的核心争议在于是否保留零值
- 技术实现上存在舍入策略(floor/round)和归一化标准的差异
- 实际应用中需考虑专业库方案与非线性传输等复杂因素