Procesamiento de imágenes utilizando Python

En 1911, un artículo de un periódico discutía sobre el periodismo y la publicidad, y citando al director del periódico Tess Flandes, apareció la siguiente expresión:

Una imagen vale más que mil palabras

Una frase similar también apareció en el anuncio de un periódico en 1913:

Una mirada vale más que mil palabras.

No voy a profundizar en la importancia de esta historia. Esta introducción era sólo por hacer un poco más divertida la entrada, y mostrar cómo los refranes nos señalan la importancia de las imágenes y la forma en que pueden incrustar una gran cantidad de información dentro de ellas. Estoy seguro de que la mayoría de nosotros nos percatamos de, cómo una imagen, puede impregnarse en nuestra mente mucho mejor que el texto puro.

Por lo tanto, no cabe duda de que las imágenes juegan un papel importante en nuestras comunicaciones. Pero ya no sólo las imágenes en general, sino también las fotos especializadas como las imágenes médicas (por ejemplo, resonancias magnéticas, ultrasonidos, etc.).

Podemos obtener imágenes a través de distintos dispositivos. Por ejemplo, las imágenes para detectar un melanoma (cáncer de piel), se realizan a través de un dermatoscopio. Tomamos fotos de nosotros mismos y de nuestros amigos utilizando una cámara digital o un smartphone. E incluso, hay veces que tenemos problemas con nuestras imágenes, como que se vea borrosa, y somos capaces de analizarlas para corregirlas. Es lo que se denomina como procesamiento de imágenes.

Me gusta cómo define el término Procesamiento de imágenes el diccionario Oxford:

Es el análisis y la manipulación de una imagen digitalizada, especialmente con el fin de mejorar su calidad.

Con "Imagen digitalizada" se refiere al hecho de que la imagen se considera digital, es decir, está procesada por un ordenador.

En este tutorial te mostraré cómo podemos utilizar el lenguaje de programación Python para realizar tareas de procesamiento de imágenes.

Scikit-image

La librería que vamos a utilizar para llevar a cabo el procesamiento de imágenes es scikit-image. Lo primero que tenemos que hacer es instalar la librería, que puedes descargar a través de su web oficial. En este tutorial te enseñaremos cómo instalarla en una máquina Mac OS X, que es el equipo que suelo utilizar normalmente.

Como scikit-image es una librería externa, los primero que tienes que hacer, como hemos dicho antes, es instalar la librería. Para ello, utilizaré pip. Puedes seguir los pasos mencionados en la Python Packaging User Guide para instalar pip, pero si tienes Python 2.7.9 o superior, o Python 3.4 o superior, ya tienes pip.

Para instalar scikit-image solo tienes que escribir este comando (en el terminal de Mac OS X):

pip install -U scikit-image

Ahora ya tenemos la librería instalada y lista para utilizarse. La imagen que vamos a probar la realizar las distintas prácticas es baboon.png. Si quieres, puedes descargarla, o bien utilizar una imagen de tu elección.

Dimensiones de una imagen

Hay veces que necesitamos conocer las dimensiones de una imagen. Para comprobar las dimensiones de nuestra imagen, podemos utilizar el método guess_spatial_dimensions(), tal que así:

from skimage import io, color
img = io.imread('baboon.png')
dimensions = color.guess_spatial_dimensions(img)
print dimensions

La salida del anterior script es 3, lo que significa que tenemos una imagen que consta de tres dimensiones espaciales.

De color a escala de grises

En la sección anterior, nos hemos percatado de que nuestra imagen es una 3D array image (en formato RGBA con la forma (.., .., 4)). ¿Cómo sé que está en formato RGBA? Simplemente puedes hacer lo siguiente:

import skimage.io as io
from skimage.color import rgb2gray 
img = io.imread('baboon.png')
print img.shape

En este caso, obtendrás la siguiente salida: (512, 512, 4).

En esta sección, vamos a convertir la colorida imagen baboon.png a una imagen 2D en escala de grises (blanco y negro). Esto puede realizarse simplemente mediante el siguiente script:

import skimage.io as io
from skimage.color import rgb2gray 
img = io.imread('baboon.png')
img_grayscale = rgb2gray(img)

Vamos a guardar nuestra nueva imagen (en escala de grises) en un fichero. Vamos a realizar esto mediante la función de imsave(), de la siguiente manera (la nueva imagen la guardaremos en el archivo de baboon-gs.png):

io.imsave('baboon-gs.png',img_grayscale)

Para comprobar las dimensiones de nuestra nueva imagen podemos utilizar el script de la sección anterior, en cuyo caso obtendrás como resultado 2. O puedes utilizar img_grayscale.shape, cuyo resultado será 512x512. Por lo tanto, ahora tenemos una imagen 2D.

Si quieres mostrar la nueva imagen en escala de grises, añade lo siguiente al final del script:

show_grayscale = io.imshow(img_grayscale)
io.show()

Aplicando un filtro a la imagen

En el procesamiento de imágenes, el filtrado se realiza para hacer ciertas mejoras en la imagen. En general, el filtrado comprende las siguientes operaciones: realce de bordes, nitidez y suavizado.

En esta sección, voy a mostrar cómo podemos aplicar el filtro Sobel en nuestra imagen. Voy a utilizar el ejemplo que se muestra en la página oficial de scikit-image, pero aplicado a nuestra imagen.

El script para aplicar el filtro Sobel en nuestra imagen se realiza tal que así:

from skimage import data, io, filters
img = io.imread('baboon.png')
edges = filters.sobel(img)
io.imshow(edges)
io.show()

¿Has tenido algún problema ejecutando el script? Es cierto, no podemos llevar a cabo la operación ya que la imagen tiene que ser una imagen 2D. Así que, en lugar de utilizar baboon.png, tenemos que utilizar nuestra imagen 2D, baboon-gs.png.

Fuente: Abder-Rahman Ali

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP