Conceptos básicos del procesamiento de imágenes en Python

Contenidos

Escribir el artículo de hoy fue una experiencia fascinante para mí y también lo sería para los lectores de este blog. ¿Qué es tan diferente? Dos cosas: en primer lugar, el artículo trata sobre algo que siempre quise hacer desde que tenía 5 años; en segundo lugar, este tema / herramientas / algoritmo también son nuevos para mí. De ninguna manera soy un maestro en el procesamiento de imágenes, pero la utilidad de este campo simplemente me dejó alucinado.

image-process-3102321

Imagínese, si puede crear una aplicación para etiquetar automáticamente una fotografía como la de Facebook, o crear su propia contraseña de reconocimiento facial para su computadora portátil. En este artículo, recogeré una aplicación muy simple pero interesante del procesamiento de imágenes. Usaremos Python para hacer el procesamiento de imágenes. En los próximos artículos, abordaré ejemplos más complejos de procesamiento de imágenes. Este es el problema en el que trabajaré en este artículo:

Planteamiento del problema

¿Adivina qué es esta imagen?

wint_sky-3146717

Tienes razón, es una imagen típica de un cielo abierto. Tomé esta foto desde la última noche hasta anoche en Bangalore desde mi terraza. En ese momento, no tenía ni idea de que este puede ser un ejercicio tan emocionante y gratificante. Cuando era niño, solía pasar horas contando estas estrellas, pero casi siempre fallaba en ir más allá de 50-60. Quería completar este ejercicio con ayuda de mi máquina. No tenía ni idea de que esto fuera posible hasta el domingo pasado, y hoy he completado esta larga tarea pendiente usando Python.

Empecemos

Paso 1: importar la biblioteca requerida

El paquete Skimage nos permite procesar imágenes usando Python. El lenguaje es extremadamente simple de entender pero realiza algunas de las tareas más complicadas. Aquí hay algunas bibliotecas que necesita importar para comenzar,

code11-5316907

Paso 2: Importa la imagen

Una vez que tengamos todas las bibliotecas en su lugar, necesitamos importar nuestro archivo de imagen a Python. A continuación se muestra el código que puede utilizar para importar el archivo de imagen. Tenga en cuenta que la imagen se importa en escala de grises, lo que básicamente significa que cada píxel tiene un tono de gris. Y cada píxel se convierte esencialmente en una celda en una matriz. En este caso, la imagen es una matriz de 480 * 581 celdas (o una imagen de 480 * 581 píxeles).

code21-9945847

Paso 3: Encuentra el número de estrellas

Ahora viene la parte crítica en la que nuestro trabajo principal se realiza mediante unos pocos comandos. Estos pocos comandos salen para buscar objetos continuos en la imagen. Blobs_log da tres salidas para cada objeto encontrado. Los dos primeros son las coordenadas y el tercero es el área del objeto. El radio de cada blob / objeto se puede estimar usando esta columna (área del objeto).

code31-2120523

Como podemos ver, el algoritmo ha estimado 308 estrellas visibles. Veamos ahora qué tan precisas son estas lecturas.

Paso 4: Validado si capturamos todas las estrellas

El número 308 todavía está saliendo de una caja negra. Veamos si hemos detectado correctamente todas las estrellas. Para ello, estoy rodeando cada posición estimada de las estrellas. Y la mirada a la imagen si nos falta alguna estrella.

code41-6557620

Aquí está el código completo:

from matplotlib import pyplot as plt
from skimage import data
from skimage.feature import blob_dog, blob_log, blob_doh
from math import sqrt
from skimage.color import rgb2gray
import glob
from skimage.io import imread
example_file = glob.glob(r"C:UsersTavishDesktopwint_sky.gif")[0]
im = imread(example_file, as_grey=True)
plt.imshow(im, cmap=cm.gray)
plt.show()
blobs_log = blob_log(im, max_sigma=30, num_sigma=10, threshold=.1)
# Compute radii in the 3rd column.
blobs_log[:, 2] = blobs_log[:, 2] * sqrt(2)
numrows = len(blobs_log)
print("Number of stars counted : " ,numrows)
fig, ax = plt.subplots(1, 1)
plt.imshow(im, cmap=cm.gray)
for blob in blobs_log:
    y, x, r = blob
    c = plt.Circle((x, y), r+5, color="lime", linewidth=2, fill=False)
    ax.add_patch(c)

Notas finales

¡El procesamiento de imágenes es fascinante! Comencé mi viaje con el procesamiento de imágenes de Python no más de 5 días. Para el beneficio de la comunidad, animaré a compartir cualquier sugerencia o mejor práctica en este foro. Es posible que este ejercicio no tenga ninguna aplicación práctica, pero se pueden realizar análisis similares para las estimaciones de pureza. Por ejemplo, en la industria del vidrio necesitamos la cantidad de partículas de sílice en el vidrio a un nivel microscópico. Al capturar los fotogramas en un video, puede usar este código simple para hacer muchas cosas. Por ejemplo, estimación del tráfico a través de imágenes de CCTV. Este código se puede adaptar fácilmente para lograr lo mismo.

¿Le resultó útil el artículo? Si ha realizado trabajos similares en el procesamiento de imágenes de Python, compártalos con nosotros. Háganos saber su opinión sobre este artículo en el cuadro a continuación.

Si le gusta lo que acaba de leer y desea continuar con su aprendizaje sobre análisis, suscríbete a nuestros correos electrónicos, Síguenos en Twitter o como nuestro pagina de Facebook.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.