Descomposición de imágenes: reducción de tamaño y reconstrucción eficaz

Clase 11 de 18Curso de Álgebra Lineal Aplicada para Machine Learning

Resumen

¿Cómo aplicar la descomposición SVD a una imagen?

La descomposición en valores singulares (SVD) es una técnica matemática potente que nos permite reducir la dimensionalidad de una matriz sin perder información esencial. A menudo, se aplica en el procesamiento de imágenes para comprimir archivos manteniendo una buena calidad visual. Pero, ¿cómo aplicamos esta técnica a una imagen concreta? Veamos el proceso completo y cómo esto afecta la reconstrucción de la imagen.

¿Qué librerías son esenciales para el procesamiento de imágenes?

Para comenzar con nuestro análisis, es necesario importar las librerías adecuadas. Utilizaremos principalmente matplotlib para graficar y tratar imágenes, y numpy para manejar números y realizar operaciones matemáticas:

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image

Estas librerías nos permitirán cargar, manipular y visualizar nuestra imagen de manera eficiente.

¿Cómo cargar y preparar la imagen?

Primero, cargamos nuestra imagen y la convertimos a escala de grises. Esto simplifica el proceso al reducir la información de color a una sola banda:

img_path = "ruta/a/tu/imagen.jpg"
imagen_color = Image.open(img_path)
imagen_gray = imagen_color.convert('L')
imagen_array = np.array(imagen_gray, dtype=float)

Esta conversión a escala de grises también nos facilita realizar la descomposición SVD, ya que trabajaremos con una matriz más sencilla.

¿Cómo se realiza la descomposición en valores singulares (SVD)?

Utilizamos numpy para calcular la descomposición SVD de la matriz que representa nuestra imagen:

U, S, Vt = np.linalg.svd(imagen_array, full_matrices=False)

Aquí, U y Vt son matrices ortogonales, mientras que S es un vector que contiene los valores singulares. Estos valores singulares están ordenados de mayor a menor, identificando los componentes más significativos de la imagen.

¿Cómo reconstruir la imagen utilizando SVD?

La reconstrucción de la imagen usando una cantidad reducida de valores singulares es clave para la compresión. Utilizamos solo los valores singulares más grandes, ya que representan la mayor parte de la información visual:

k = 50  # número de valores singulares considerados
S_k = np.diag(S[:k])
U_k = U[:, :k]
Vt_k = Vt[:k, :]
imagen_reconstruida = np.dot(U_k, np.dot(S_k, Vt_k))

Al variar k, podemos observar el efecto que tiene en la calidad de la imagen reconstruida. Cuanto mayor sea k, mejor será la calidad visual pero también mayor el tamaño del archivo.

¿Qué tamaño de archivo y calidad de imagen obtenemos al variar k?

La elección de k afecta directamente al tamaño final de nuestro archivo y la claridad de la imagen reconstruida. Aquí algunas consideraciones:

  • Con pocos valores singulares: Tendremos un archivo muy comprimido pero con pérdida de detalles. La imagen será menos clara.
  • Con muchos valores singulares: Conservamos más detalles finos pero el tamaño del archivo es mayor.

La habilidad para elegir el k óptimo depende del propósito: si se necesita reconocimiento más que calidad visual, menos valores serán suficientes.

Concluyendo, la técnica SVD aplicada a imágenes logra un equilibrio único entre compresión y calidad, permitiendo optimizar recursos de almacenamiento sin sacrificar demasiada información visual. Te invitamos a experimentar y determinar cuál es el valor k ideal para tus necesidades específicas. ¡Explora nuevas formas de eficientizar tus proyectos de imágenes!