Compresión de imágenes con SVD en Python
Clase 12 de 12 • 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)
La descomposición en valores singulares (SVD) permite comprimir imágenes sin perder la esencia visual. Al conservar solo las componentes más importantes, se reduce drásticamente la información almacenada y se mantiene la estructura clave: formas y contrastes. Aquí verás cómo aplicarlo en Google Colab con NumPy, Matplotlib y scikit-image, y por qué esto acelera el procesamiento y el entrenamiento de modelos.
¿Qué es SVD y por qué comprime imágenes?
Una imagen se trata como una matriz de píxeles. SVD la descompone en U, sigma y Vt. La matriz sigma contiene los valores singulares ordenados por importancia. Las primeras componentes capturan la estructura principal; las últimas suelen ser ruido o detalles muy finos.
La compresión consiste en descartar los valores singulares pequeños y reconstruir la imagen con los más altos. El resultado: una imagen casi idéntica con mucho menos almacenamiento. Para este flujo, se trabaja en escala de grises: primero se transforma la imagen a grises y luego se aplica SVD.
¿Cómo se prepara la imagen en Google Colab?
- Importar librerías de NumPy, Matplotlib y scikit-image.
- Cargar el dataset de ejemplo: la imagen «rocket».
- Convertir a escala de grises con rgb2gray.
- Redimensionar con resize para procesar más rápido.
import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.transform import resize
from skimage.color import rgb2gray
imagen_original = rgb2gray(data.rocket())
imagen = resize(imagen_original, (300, 200))
¿Cómo se descompone y se reconstruye con k valores?
- Aplicar SVD: u, s, vt = np.linalg.svd(imagen).
- Tomar solo las primeras k componentes.
- Reconstruir: Uk @ Sk @ Vtk.
u, s, vt = np.linalg.svd(imagen)
def reconstruir_con_k(k):
u_k = u[:, :k]
s_k = np.diag(s[:k])
vt_k = vt[:k, :]
imagen_reconstruida = u_k @ s_k @ vt_k
return imagen_reconstruida
k_valores = [5, 20, 50]
imagenes_reconstruidas = [reconstruir_con_k(k) for k in k_valores]
¿Cómo visualizar la original y las reconstrucciones?
- Crear subplots en una fila.
- Mostrar la imagen original y las reconstruidas con imshow.
- Titular cada panel con una f-string indicando k.
fig, axes = plt.subplots(1, 4, figsize=(20, 5))
axes[0].imshow(imagen, cmap='gray')
axes[0].set_title('Original')
for i, k in enumerate(k_valores):
axes[i + 1].imshow(imagenes_reconstruidas[i], cmap='gray')
axes[i + 1].set_title(f'Reconstrucción con k={k}')
plt.show()
¿Cómo implementarlo en Python con NumPy y scikit-image?
El flujo es claro: preparar datos, descomponer, reconstruir y visualizar. Con una simple función, puedes ajustar k para explorar el compromiso entre calidad y compresión. Una list comprehension facilita generar múltiples reconstrucciones de forma compacta y legible.
- U almacena combinaciones de píxeles por filas.
- Vt captura combinaciones por columnas.
- Sigma prioriza qué tanto aporta cada componente.
- Con k pequeño: fuerte compresión y más borrosidad.
- Con k mayor: más detalle, más costo de almacenamiento.
¿Qué resultados y beneficios se observan al variar k?
En la demostración con k = 5, 20 y 50: - Con 5: la imagen se ve borrosa, difícil de distinguir el cohete. - Con 20: ya se reconoce claramente el cohete. - Con 50: la similitud con la original es prácticamente idéntica.
¿Qué tamaños de matrices devuelve SVD?
- Imagen redimensionada de 300 por 200: 60,000 números.
- U con forma 300 por 300: matriz cuadrada.
- Sigma con 200 valores singulares: uno por cada columna de la imagen.
- Vt con forma 200 por 200: matriz cuadrada.
¿Qué mejoras trae para el entrenamiento?
- Menos características por imagen: de 60,000 píxeles a 50 valores singulares.
- Entrenamiento mucho más rápido: el modelo procesa datos compactos que capturan la esencia.
- Mejor generalización: aprende la estructura fundamental en lugar del ruido.
¿Cómo ayuda al denoising?
- Los últimos valores singulares capturan ruido: grano e imperfecciones del sensor.
- Al reconstruir con menos componentes, se filtra el ruido automáticamente.
-
El resultado es más limpio y útil para tareas de visión.
-
Beneficios clave.
- Eficiencia en almacenamiento y velocidad de carga.
- Aceleración del entrenamiento con menos dimensiones.
- Reducción de ruido y mejor calidad de señal.
¿Te animas a experimentar? Vuelve a ejecutar el código y prueba con distintos k: comparte cuál es el mínimo k con el que aún reconoces claramente la imagen y sube tu captura en los comentarios.