top of page

K-MEANS en FOTOGRAFÍA

  • fjroar
  • 12 may 2024
  • 2 Min. de lectura

Una de las aplicaciones que me sorprendió del curso de Andrew Ng sobre entrenamiento no supervisado, fue la posibilidad de resumir la información dada en una imagen, a partir de todos sus píxeles, en un conjunto resumido de estos que permitiesen destacar ciertas zonas de esta.


Así pues, mientras en dicho curso se toma la fotografía de un pájaro (cuya especie no sé cuál es), a mi me dio por ver qué pasaba cuando tomaba una imagen hecha por mí mismo de algo que me gusta bastante, la fotografía planetaria, por tan tome como referencia la siguiente imagen, no tratada a ver qué es lo que sucedía:

En este caso lo que hice fue adaptar el código de Andrew Ng y preparar una versión más hispanizada que puede consultarse en:

 

                              https://github.com/FJROAR/CLUSTEREDIMAGE

 

Con python en esta ocasión puede leer fácilmente la imagen y tenerla separada por sus matrices, donde haciendo uso la función reshape() de la librería numpy, se preparan los datos para ser pasados por las funciones de ayuda que prepara se preparan en el propio curso (con alguna modificación por mi parte) y que son:

 

  • kMeans_init_centroids(X, K, seed = 155)

  • find_closest_centroids(X, centroids)

  • compute_centroids(X, idx, K)

  • run_kMeans(X, initial_centroids, max_iters=10)

 

Así pues, mediante la llamada run_kMeans se orquesta todo para generar una nueva matriz que de nuevo con la mencionada reshape() se convierte en una nueva matriz tridimensional donde haciendo uso matplotlib.pyplot se llega al siguiente resultado:



Lo que se ha hecho es básicamente aplicar la filosofía del kmeans generando sus centroides y asociándolos a los píxeles que se encuentren más cerca entre sí, de modo que finalmente se crean agrupaciones con menor cantidad de variaciones entre los datos.

 

Este tipo de tratamiento de imágenes es bastante conocido y en las técnicas astrofotográfica, muchas son empleadas para resaltar determinados elementos a partir de una imagen dada, pero a nivel instructivo, se observa que un algoritmo como el kmeans sin saber que lo que se le da es una imagen (o matriz tridimensional) organizada por píxeles y tras hacer un reshape() donde se transforma en una matriz bidimensional de (en este caso) 30.272 filas y 3 columnas, es capaz de asociar adecuadamente los datos para que de nuevo, tras la aplicación inversa, se recupere una nueva imagen con pleno sentido y no un desastre, tomando como lección que cuando en los datos hay patrones, estos son encontrados adecuadamente.


De hecho es sorprendente como cuando aumentamos el número de centroides, el resultado sigue siendo totalmente coherente destacándose claramente rasgos en la imagen que merecen ser también tenidos en cuenta:



Finalmente indicar que el algoritmo es un poco lento y con imágenes de cierto peso, no se ejecuta de modo rápido. Por supuesto hay opciones mejores para realizar lo anterior, no obstante aquí lo que se quería mostrar era simplemente un ejemplo instructivo sobre la capacidad del algoritmo kmeans de hacer asociaciones coherente cuando existen asociaciones entre los datos.

Comments


© 2021 by Francisco J. Rodríguez Aragón. Proudly created with Wix.com

bottom of page