Resumen

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.