sábado, 18 de diciembre de 2010

Compresión de imagenes y jpg

Voy a iniciar una serie de árticulos que los ire poniendo aqui en mi blog, espaciados en el tiempo, que van a hablar de ciertos temas ya con algo más de profundidad y nivel, para los que quieran saber ese poquito más de la fotografía y la técnica asociada a ella. Creo que pueden ser muy interesantes para todos, y de esa forma también, atiendo a los que me habeís solicitado estas cosas.
Voy a comenzar hablando de la compresión en general y de la compresión de imagen en particular, el por qué de esta técnica y terminaré describiendo cómo se genera un archivo jpg.
Voy de todas formas a intentar escribirlos para que todo el mundo los entienda a pesar de que ya no tratan temas básicos de fotografía. Pero seguro que todos lo entenderéis y sino podéis preguntarme que aquói estaré
Muchas veces estamos hablando de formatos como RAW , TIFF, jpg etc, pero no sabemos realmente que son, si sabemos que son formatos comprimidos, o que no lo son, o cosas así, pero ¿entendemos que significa esto?, ¿qué entendemos?.
Voy a hablar del formato que más usan nuestras cámaras que es el formato jpg, pero antes hablare de lo que es la compresión de los datos para que así nos entendamos todos. Espero que se pueda entender por todos ya que es algo más complejo que las cosas que suelo escribir por aquí.
Os planteo el problema y la solución para la discusión.
Normalmente los medios que tenemos de almacenamiento de datos (memorias ó discos duros) o de canales de transmisión (internet), son limitados en el ancho de banda, ¿Qué quiere decir esto de limitados en el ancho de banda? Pues que son capaces de almacenar hasta un cierto valor de datos sin son discos y no más, o si es transmisión por internet, el canal es capaz de transmitir como máximo una cierta velocidad de datos por segundo y nada más.
Es como las carreteras, o los parkings, si tenemos una carretera que caben 1000 coches /hora, no caben más o si tenemos un parking que caben 1000 coches no caben más.

Esta limitación está en contra de lo que necesitamos en la actualidad para nuestras necesidades fotográficas, ¿a quién no se le ha quedado una memoria pequeña al cambiar a una cámara de más resolución?. Las fotos o los videos al ser cada vez de mas resolución, necesitan mayor espacio para poder ser guardados, (los detalles hay que pagarlos), y si lo enviamos por un medio de transmisión limitado tardaran más en transmitirse. Esto es un fastidio para todos.Vistos estos problemas a los técnicos se les ocurrió el intentar que en las memorias, cupiesen mas fotos o videos, y en las “carreteras de internet” se transmitiese en el mismo tiempo más cantidad de información. La idea fue entonces manipular de alguna manera los datos para que ocupasen menos pero con casi igual calidad.
¿Pero cómo hacerlo? Porque si yo tomase una foto según sale del sensor y empezase a quitarles bits para reducir su “volumen”, podría formar un pan con unas tortas y obtener una imagen hecha polvo y nada práctico. Bien pues aquí entran las terribles matemáticas que todos odiamos, o casi todos, y alguien muy listillo él, hace tiempo demostró que no hacía falta enviar toda la información, sino que con sólo enviar o guardar ciertas partes de una foto se podría reconstituir perfectamente o casi, ocupando por tanto menos. Esto es algo que tiene muchas aplicaciones y lo tenéis en las manos constantemente.Fijaros con un ejemplo se entiende esto, fijaros en lo que pone debajo lo he cortado por la mitad transmitiéndoos la mitad de información y se puede seguir entendiendo
¿Qué pone aquí?:

¿ A que lo habéis leido sin problemas? y eso que os he enviado sólo la mitad de información pero seguro que habéis podido leer lo que pone todos. Bueno pues de eso se trata de con poco que se guarde o se envié recuperar la información bien. en este ejemplo cabrian en una hoja más lineas y por tanto mas información.
Esta idea es simple y os la intento explicar ahora con unos dibujitos como funciona. Para ello vamos a ver cómo disminuir el tamaño de una señal a la que se la pretende limitar el tamaño , que podría ser música para poderla almacenar en menos sitio, o transmitir más rápido al ocupar menos…..PERO sin perder casi calidad y sin guardar o enviar todo completo, como con el ejemplo del “gatito”.
1) Imaginad una señal como la que pongo en el número uno (señal inicial).
2) Tomo de esa señal solo ciertas partes (muestras A, B y C la información de los circulitos azules).
3) Se toman esas muestras que son tres, ya no la señal completa.
4) Ahora las codifico, esto es a la A la llamo 00, a la B = 01, y a la C = 11.
5) Después hábilmente las comprimo, pasando con un cierto algoritmo de 00 01 11 a este otro valor 011 y envío esta secuencia o la grabo así 011, Fijaros que he enviado muy poca señal solo 3 bits
6) Cuando llega al destino hago el camino contrario restauro esos valores porque tengo una tabla que lo traduce 011 a 00 01 11 restaurando esas muestras de la señal
7) Y después y finalmente, obtengo la señal reconstruida a base de enviar muy poca información.
Pulsad en las imágenes para verlas más grandes.



Bien este proceso no es realmente una compresión estupenda pero sirve para que comprendáis las ideas básicas de cómo se hace.
Fijaros que esto se puede hacer si se cumplen una serie de condiciones matemáticas, que no voy a hablar aquí, pero que podéis intuir después de ver el ejemplo del “gatito”, pero si es bueno que sepáis que existen y que hay que seguirlas para que esto funcione, y no salga ese pan con esas tortas que yo mencionaba al principio.
Por ejemplo en la frase que puse quite la parte inferior, pero si quito a partir de la palabra gatito no os enteráis de nada, sólo sabríais que tengo un gatito, a eso me refiero con que se deben respetar ciertas reglas.
Con esto hemos logrado meter en unos bits una señal más grande y así aprovechar nuestro disco duro o nuestra transmisión por Internet. ¡¡¡ya está bien!!!! Es algo poderoso.
Pero ahora vayamos a la imagen. De forma parecida existen algoritmos que hacen que una imagen se pueda hacer más pequeña y luego poder ser recuperadas perfectamente o casi, dependiendo del algoritmo que se meta.
Habréis oído que cuando obtenemos una foto en jpg hay niveles en las cámaras de calidad predispuestas, bien pues esos niveles lo que marcan es la calidad de la compresión para luego al recuperarla tener una cierta calidad. Es evidente que a mas compresión peor calidad porque por medio se pierde información.
Por ejemplo fijaros en estas dos fotos comprimidas con diferentes calidades. La primera como veis esta peor debida a que se ha comprimido mucho y el algoritmo ha forzado perdiendo calidad al recuperar la imagen.
La segunda también esta comprimida pero algo mejor (no bien) pero si algo mejor.






















¿Qué es un jpg entonces?
JPG es un algoritmo de compresión que hace el tamaño de la foto más pequeño, con pérdidas lo que significa que al descomprimir la imagen no vamos a tener la misma foto que teníamos antes de la compresión, se pierde algo en el camino, pero eso que se pierde en general no lo váis a notar, al menos que seaís sólo fotografos de pixels. (que hay alguno).
Por lo tanto cada vez que abrís un jpg y lo guardáis vais perdiendo calidad, yo hecho pruebas de hacerlo hasta 50 veces, y no se aprecia demasiado pero si va perdiendo. vi en Internet una vez una prueba que hizo guillermo Luik demostrando que se perdia al hacer muchas veces esto, apareciendo rayas extrañas y demás.
¿Cómo se hace la compresión en este archivo?. Voy a intentar explicarlo sin meterme en mucha harina para que lo comprendáis todos. Antes de nada decir que jpg significa : Joint Photographic Experts Group. je je tenemos expertos en nuestras fotos.
1) Se parte de la imagen que como sabemos está constituida por tres capas de colores RGB una por color, cada pixel es la combinación de un pixel de cada capa.
2) Partiendo de que sabemos que el ojo es más sensibles a variaciones de luminancia que a otro tipo de variaciones en la crominancia en una imagen, esto es, si varía algo la luminosidad nos damos cuenta antes de que varíe un colorcillo de tono o desaparezca. Esto es muy importante porque aquí es donde mete la mano el algoritmo para aprovechar y comprimir, quitando información de color que no os dareis cuenta si no existe, salvo comparación claro.
3) Como se sabe esto, los que inventaron este algoritmo transforman la imagen inicial a una imagen donde se tiene la luminancia por un lado y dos canales mas donde se lleva la información de crominancia, lo podéis ver aquí fácilmente, ya que os represento la cantidad de información en niveles de blanco y negro. De esta manera fijaros que hábiles, separan lo que si se manipula se nota, que es la información de claridad u oscuridad, de la de color que se nota menos.
Luminosidad.
canal uno de crominancia
Canal dos de crominancia
4) Ahora que ya tenemos esos tres ficheros con información, se maniupulan los de información de color haciendo una compresión de estos dos canales enorme (hasta la mitad muchas veces), lo que hace, que de los tres canales, dos se hayan hecho mucho más pequeños dejando la luminancia igual.
Fijaros que con sólo esto, aquí ya se ha bajado el tamaño de la fotografía un montón y apenas se notará en la calidad de la imagen. Si la pudiésemos ver en este paso no notaríamos nada o casi nada y ya habriamos dejado la imagen mucho más pequeña. los de los pixels tampoco notarían nada.
5) Pero los señores que lo inventaron no se conformaron con esto siguieron asi: Ahora se toman cuadraditos pequeños de 8x8 pixel de cada capa y se les manipula de con un cierto algoritmo.
6) Una vez se ha hecho esta manipulación, viene otra interesante que se basa en que nuestro ojo sigue siendo imperfecto y es mucho más sensible a las variaciones pequeñas del color o de la luminancia en áreas grandes de la foto que a variaciones muy grandes en zonas pequeñas, con lo cual ¡zas!, van y las quitan, Aquí es donde el ajuste que tenemos de calidad en la cámara influye en esta “eliminación” y es lo que ajustamos.
7) Una vez acabado esto los datos que han quedado les meten finalmente un algoritmo de compresión que se llama de Huffman y nos sale nuestra foto en jpg.
Como veis, es más complejo que lo primero que hice para que nos enterásemos todos, pero en el fondo la idea es similar es quitar información hábilmente para que ocupe menos y se pierda poco., que es a lo que quiero ir con esta discusión. Todo esto lo hace la cámara de forma muy rápida en su procesador sin que os deis cuenta, y en el pc en vuestros programas con un software.
De esta forma imágenes de, por ejemplo, (por poner un número) 10 Mb, se pueden reducir a 2 Mb de forma casi casi sin que se note, y por lo tanto en nuestro disco caben automáticamente 5 veces más de fotos, que era lo que se quería conseguir.!!!!!!!!
Existen muchos más formas de compresión que tienen más o menos calidad y mas o menos compresión, pero todos funcionan de forma similar se aprovechan de que nuestro ojo es como es y aplican algoritmos más o menos buenos.
En fin espero no haberos aburrido y que sepamos un poquito mas de nuestro ojo, de la compresión y de las jpgs.....

6 comentarios :

  1. Nuevamente genial lección.
    ¿y cuales son los pasos para hacer una buena compresión?
    ¿hay que hacerlo de una vez o es preferible hacerlo en dos o tres veces?

    ResponderEliminar
  2. Muy interesante e instructivo.
    Para lo complejo que es el tema lo has explicado de manera muy asequible.

    Muchas gracias!

    ResponderEliminar
  3. X Juan Manuel: Eso lo explicare más adelante, pero fijate que ya eso lo hacen los programas y las cámaras

    ResponderEliminar
  4. Más claro imposible, muchas gracias.

    ResponderEliminar
  5. Muy bien explicado. Se nota la maestría.
    Ahora toca hablar de los RAW

    ResponderEliminar