Compresión de imágenes con SVD en Python
Curso Avanzado de Álgebra Lineal y Machine Learning: PCA y SVD
Contenido del curso
Eigen-Análisis
Reducción de Dimensionalidad con PCA
Descomposición en Valores Singulares (SVD)
Compresión de imágenes con SVD en Python
Resumen
La compresión de imágenes con SVD te permite reducir el tamaño de una foto conservando su estructura visual, usando solo los componentes más importantes de su descomposición matricial. Aprenderás a aplicarlo en Python con scikit-image y NumPy, una técnica clave si trabajas en machine learning y necesitas datasets más ligeros.
La idea central es tratar una imagen como una matriz de píxeles, descomponerla con Singular Value Decomposition y reconstruirla con solo los K valores singulares más representativos. Lo demás, en muchos casos, es ruido.
¿Por qué funciona SVD para comprimir imágenes?
Una imagen en escala de grises es, en esencia, una matriz numérica donde cada celda guarda la intensidad de un píxel. Al aplicar SVD, esa matriz se descompone en tres: U, Sigma y V transpuesta [0:30].
La matriz Sigma contiene los valores singulares ordenados de mayor a menor importancia. Los primeros valores capturan la estructura principal: formas, contrastes, bordes. Los últimos suelen representar ruido o detalles muy finos.
¿Qué es un valor singular en SVD? Es un número que mide cuánta información aporta cada componente de la descomposición. Mientras más alto, más relevante es ese componente para reconstruir la imagen original.
Descartando los componentes menos relevantes y reconstruyendo con los K más importantes, obtienes una imagen casi idéntica usando muchísima menos información.
¿Cómo aplicar SVD a una imagen en Python?
El primer paso es preparar la imagen. SVD no trabaja directamente con imágenes a color, así que necesitas convertirlas a escala de grises y opcionalmente redimensionarlas para que el cómputo sea más rápido [2:15].
Desde skimage importas tres piezas clave:
datapara acceder a imágenes de prueba.resizedesdeskimage.transformpara ajustar dimensiones.rgb2graydesdeskimage.colorpara pasar a escala de grises.
Una vez tienes la imagen como matriz, la redimensionas a 300 por 200 píxeles para manejarla con eficiencia y aplicas la descomposición:
python U, S, Vt = np.linalg.svd(imagen)
Esto te devuelve U con forma 300 por 300, un vector S con 200 valores singulares y Vt con forma 200 por 200 [3:45].
¿Cómo reconstruir la imagen con K componentes?
La reconstrucción consiste en quedarte solo con las primeras K columnas de U, los primeros K valores singulares de S (convertidos a matriz diagonal con np.diag) y las primeras K filas de Vt. Después multiplicas las tres:
python def reconstruir_con_k(k): U_k = U[:, :k] S_k = np.diag(S[:k]) Vt_k = Vt[:k, :] return U_k @ S_k @ Vt_k
Probando con valores K de 5, 20 y 50, y graficando con matplotlib en una rejilla de subplots, puedes comparar visualmente cómo crece la fidelidad a medida que sumas componentes [5:50].
¿Qué resultados obtienes al variar el valor de K?
En el ejemplo de un cohete, la reconstrucción cuenta una historia clara:
- Con K=5, la imagen es borrosa y apenas reconocible.
- Con K=20, ya distingues que se trata de un cohete aunque falten detalles.
- Con K=50, la similitud con la original es prácticamente idéntica.
Y aquí viene lo interesante: pasaste de necesitar 60.000 números (300 x 200 píxeles) a representar la misma imagen con apenas 50 valores singulares. Eso es una compresión cercana a seis veces.
¿Cuántos valores singulares necesito para una buena reconstrucción? Depende de la imagen, pero entre el 10% y el 25% de los valores totales suele ser suficiente para conservar la estructura visual reconocible.
¿Qué beneficios tiene la compresión SVD en machine learning?
Reducir dimensiones con SVD no es solo un truco visual, tiene impacto directo en el rendimiento de tus modelos.
Eficiencia en almacenamiento y velocidad
Pasar de 60.000 valores a 50 por imagen ahorra gigabytes cuando trabajas con datasets de millones de imágenes. Los tiempos de carga y procesamiento se aceleran de forma drástica [9:20].
Aceleración del entrenamiento
Si alimentas tu modelo con 50 valores singulares en lugar de 60.000 píxeles por imagen, el entrenamiento es muchísimo más rápido. Conservas la esencia de la información sin cargar al modelo con detalles redundantes.
Eliminación de ruido o denoising
Los componentes con valores singulares más pequeños suelen capturar grano de la imagen o imperfecciones del sensor. Al descartarlos, aplicas un filtrado automático de ruido que ayuda a que los modelos generalicen mejor, aprendiendo la estructura fundamental en lugar de memorizar imperfecciones específicas [10:40].
¿Cuál es el K mínimo para reconocer una imagen?
Este es el reto práctico: vuelve a ejecutar el código con distintos valores de K y descubre cuál es el mínimo con el que todavía identificas claramente el objeto. Comparte tu valor y una captura de pantalla en los comentarios para comparar resultados con otros estudiantes.