lunes, noviembre 28, 2011

Leyendas urbanas sobre el JPEG

Una amiga me comentó hace poco que un profesor suyo le había dicho que la calidad de las imágenes guardadas en JPEG se degradaba cada vez que se abrían para visualizarlas.

Le expliqué que es cierto que las imágenes en JPEG pierden calidad, pero sólo cada vez que se escriben. Me quedé pensando un momento en mis días de la universidad, en la transformada del coseno y en su puta madre, y pensé que seguramente llegaría un punto en el que después de codificar y decodificar varias veces en cadena una imagen, se llegaría a un punto fijo, en el que no se perdería más calidad.

Me daba bastante pereza ponerme a probarlo, pero al final tiré de scripting en Python una vez más y he aquí los resultados:



import Image
import ImageMath
import sys

def main():
    prefix, suffix = sys.argv[1].split('.')

    prev = Image.open(sys.argv[1])
    go_on = True
    i = 0
    while go_on and i < 100:
        name = prefix + str(i) + '.' + suffix
        print 'name=',name
        prev.save(name)
        next = Image.open(name)
        diff = ImageMath.eval('abs(float(a) - float(b))', a=next, b=prev)
        go_on = tuple(next.getdata()) != tuple(prev.getdata())
        prev = next
        hist = diff.histogram()
        i += 1
        print hist


if __name__ == "__main__":
    sys.exit(main())

El programilla va imprimiendo el histograma de la diferencia entre dos imágenes consecutivas y se para cuando todos los píxels están a cero. Probando con un par de imágenes, parece que el punto fijo se alcanza tras unas cuantas iteraciones, entre 8 y 40. Así que no temáis demasiado por una degradación sin límites de vuestras fotos si las andáis retocando sobre los JPEGs, aunque nunca está de más guardar los originales en RAW, TIFF o PNG.

No hay comentarios: