Mapas de bits
Un mapa de bits (BMP) es esencialmente lo que usted describe, una matriz de números que representan colores de píxeles. Por ejemplo, algo como
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Compresión sin perdidas
Ahora, definamos un esquema de compresión. En nuestro esquema de compresión, tendremos una serie de pares de números. P.ej
3, 1, 1, 0, 7, 1
Ahora, lo primero que quiero señalar es que este esquema de compresión representa los mismos píxeles que la primera matriz. La primera matriz tiene tres 1 seguidos de un solo 0 y luego siete 1. Y eso es lo que estamos representando aquí. Este formato es más corto, ya que representa múltiples píxeles con dos números. El formato de mapa de bits tiene que usar un número para cada píxel.
Obviamente, esta es una vista algo simplificada de una imagen (por ejemplo, es solo una fila) y un esquema de compresión. Pero es de esperar que esto le permita ver cómo un esquema de compresión cambia el formato de una imagen. Así es como un GIF se relaciona con un BMP. GIF utiliza un esquema de compresión llamado Lempel-Ziv-Welch en lugar de este simplista.
Lo que hemos descrito aquí es un esquema de compresión sin pérdidas. Un problema con los esquemas de compresión sin pérdida es que, para algunas entradas, la forma codificada puede ser más larga que la original. Por ejemplo para
1, 0, 1, 0, 1
La codificación es
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Bueno, eso fue inútil. Hicimos la entrada el doble de tiempo.
Otra compresión sin pérdidas.
Ahora, consideremos un esquema de compresión diferente. En este, representaremos la imagen como círculos superpuestos. Para cada círculo, definiremos un centro, un radio y un color.
Nuestro primer mapa de bits se convertiría
5, 5, 1, 3, 0, 0
Esta es la misma longitud que nuestro primer método de compresión.
Y nuestro segundo podría ser
2, 2, 1, 2, 1, 0, 2, 0, 1
Estos son tres círculos centrados en el elemento central (que en el conteo de computadoras es el número 2, ya que las computadoras comienzan a contar en 0). Un círculo tiene radio 2 y color 1. Luego agregamos un círculo de color 0 y radio 1. Finalmente, tenemos un círculo de color 1 y radio 0. En pasos, esto sería
1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1
O
2, 2, 1, 1, 0, 0, 3, 0, 0
Este es el mismo círculo inicial pero cubierto por dos círculos de puntos. En pasos, sería
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Ambos son uno más corto que la primera versión codificada pero aún más largo que el original.
Quizás se pregunte por qué estoy hablando de círculos y no de rangos. La razón principal es que los círculos están más cerca de lo que usan las imágenes bidimensionales reales.
Compresión con pérdida
También tenemos el concepto de esquemas de compresión con pérdida. Estos esquemas de compresión sin pérdida se pueden volver a convertir en la matriz de mapa de bits original. Los esquemas de compresión con pérdida pueden no ser reversibles.
Consideremos una versión con pérdida de nuestro método de círculos. En esto, usaremos una regla simple. No almacenaremos ningún círculo con un radio inferior a 1. Por lo tanto, en nuestras dos últimas codificaciones, tendríamos
2, 2, 1, 2, 1, 0
y
2, 2, 1
que convertidos a píxeles de nuevo son
1, 0, 0, 0, 1
y
1, 1, 1, 1, 1
La primera versión es solo un elemento más larga que la original. La segunda versión es más corta. Ambos son válidos, por lo que el algoritmo es libre de desarrollar ambos y elegir el más corto.
Describimos imágenes con reglas más restrictivas como de menor calidad.
Esta representación de imágenes como colecciones superpuestas de formas circulares es similar a cómo funciona el Joint JPEG Photographic Experts Group o el formato JPEG . Sus formas son elipses en lugar de círculos, pero la idea es similar. En lugar de nuestro método simplista, utiliza la transformada discreta del coseno para codificar imágenes.
A diferencia de GIF, JPEG es en realidad una forma diferente de representar la imagen. GIF sigue siendo píxeles. Simplemente se almacenan de una manera diferente. JPEG es formas. Para ver un JPEG, luego convertimos las formas en píxeles porque así es como funcionan las pantallas. En teoría, podríamos desarrollar una pantalla que no funcionara de esta manera. En lugar de píxeles, podría producir formas para que coincida mejor con el formato JPEG. Por supuesto, esa pantalla no podría mostrar mapas de bits. Para mostrar un BMP o GIF, tendríamos que convertir a JPEG.
Si convierte un GIF estándar, digamos 300x300 píxeles, conviértalo en JPEG y reduzca la calidad, las formas de base que usa deben ser visibles. Muchos archivos JPEG evitan estos artefactos comenzando con una imagen de resolución mucho más alta.
Los JPEG escalan bien porque son formas en lugar de píxeles. Entonces, si comienza con una imagen de 8000x8000, la convierte a JPEG y la muestra como una imagen de 300x300, gran parte del detalle que se perdió se habría perdido de todos modos. Si convirtió el mapa de bits de 8000x8000 a un mapa de bits de 300x300 primero y luego a JPEG, los resultados a menudo serán de menor calidad.
MPEG
Hemos estado hablando de imágenes fijas. El formato Grupo de expertos en imágenes en movimiento o MPEG utiliza el mismo tipo de compresión que JPEG, pero también hace algo más. Si bien una forma simple de hacer videos es enviar una secuencia de imágenes fijas, MPEG en realidad envía un cuadro, seguido de cierto número de cuadros que enumeran los cambios, y termina con un cuadro final. Debido a que la mayoría de los cuadros son similares al cuadro anterior, la lista de cambios a menudo es más pequeña de lo que sería una segunda imagen.
La secuencia normalmente no es tan larga, digamos cinco cuadros. Pero ayuda a hacer que la transmisión sea más pequeña de lo que sería.
Simplificaciones
He ignorado mucho Mis imágenes solo tienen dos colores (1 bit), no el 256 de una imagen de 8 bits y ciertamente no el 4,294,967,296 de una imagen de 32 bits. Incluso con imágenes de 8 bits, tenga en cuenta que a menudo puede elegir diferentes paletas para la imagen. Por lo tanto, dos mapas de bits de 8 bits con las mismas secuencias pueden representar imágenes que se ven diferentes (misma forma pero diferentes colores).
Mis imágenes son filas individuales, no bidimensionales. La mayoría de las imágenes tendrán un tamaño de fila específico almacenado, haciendo que las matrices sean bidimensionales.
No he tratado de representar las codificaciones reales en absoluto. Son mucho más complejos que los simples que usé. Hice esto porque quería poder describir las codificaciones en esta publicación. No estoy convencido de que pueda explicar Lempel-Ziv mucho menos el refinamiento más complejo de Lempel-Ziv-Welch en una sola respuesta. Y no entiendo las transformadas de Fourier lo suficientemente bien como para explicarlas en detalle.
Esta es una versión simplificada del manejo real de imágenes. Sin embargo, creo que para fines didácticos, es más fácil de entender que la realidad más compleja mientras se alcanzan los puntos esenciales.