¿Dividir entre 255 o entre 256 al normalizar valores RGB?

Fuentes: Should you normalize RGB values by 255 or 256?
Imagen generada por IA con el prompt: A number line diagram showing quantization bins: brown circles at integer positions with vertical arrows indicating floating-point ranges, clean technical illustration, neutral background
Imagen generada con IA

En el procesamiento de imágenes, al convertir valores enteros de 8 bits a coma flotante surge una duda recurrente: ¿conviene dividir entre 255 o entre 256 con un sesgo de 0,5? El artículo examina ambas fórmulas — x/255 y (x+0.5)/256 — y compara sus consecuencias prácticas.

La fórmula estándar x/255 asigna el entero 0 al valor 0.0 y el 255 al 1.0. Es la convención adoptada por las GPU y permite que el código de procesamiento asuma sin más que el negro puro equivale a 0.0 y el blanco puro a 1.0. La alternativa, (x+0.5)/256, sitúa los valores flotantes en el centro de cada intervalo entre dos enteros consecutivos, pero mapea el 0 a 0,5/256, lo que obliga a conocer esa constante para detectar, por ejemplo, píxeles negros.

Al representar las dos conversiones sobre una recta numérica se observa que los "bins" extremos del método estándar se extienden más allá del rango operativo de 0 a 1, ocupando aproximadamente la mitad del ancho de los demás intervalos. Como consecuencia, al generar ruido uniforme y redondearlo, los valores 0 y 255 aparecen con la mitad de frecuencia que el resto. Aun así, esta asimetría rara vez resulta problemática: cualquier valor ligeramente fuera del rango se redondea al bin correcto, y una conversión de ida y vuelta (uint8 → float → uint8) sigue siendo exacta.

Una segunda diferencia es que los valores generados por la fórmula estándar no son representaciones binarias exactas — por ejemplo, 1/255 y 254/255 no se almacenan con precisión —, mientras que la alternativa coloca cada valor justo en el centro entre dos enteros. El error de redondeo asociado es minúsculo, inferior al bit menos significativo de un float de 32 bits, por lo que se trata más de una cuestión estética que técnica.

La propiedad de la fórmula alternativa de centrar los valores en cada intervalo resulta atractiva para el dithering, ya que permite añadir ruido sin preocuparse por los casos extremos. Un post de 2015 de Andrew Kesler defiende este enfoque, mientras que la fórmula estándar exige un clamp cuidadoso para mantener la coherencia de la distribución.

El artículo conecta ambas estrategias con la teoría de cuantización uniforme. Wikipedia distingue los cuantizadores "mid-tread" y "mid-riser": los primeros tienen un nivel de reconstrucción igual a cero, los segundos un umbral de clasificación en cero. Aplicando esta terminología, dividir entre 255 corresponde a un cuantizador mid-riser con L=255, mientras que la alternativa es un cuantizador mid-tread con L=256. La fórmula estándar resulta así una combinación peculiar: un mid-riser aplicado a entradas sin signo con códigos enteros elegidos para que los extremos caigan en 0.0 y 1.0, lo que en un sistema genérico de codificación supondría un desperdicio de ancho de banda.

En definitiva, la fórmula x/255 se mantiene como opción sólida por su conveniencia y su adopción mayoritaria, mientras que (x+0.5)/256 ofrece pequeñas ventajas en contextos específicos como el dithering.