Procesamiento de Imágenes con Python y Scikit-Image

Introducción:

Hola amigos de Internet, les doy la bienvenida a Mi Diario Python, el mejor blog para Aprender Python. 
En este articulo nos dedicaremos a conocer algunos algoritmos utilizados en el procesamiento de imágenes y los aplicaremos utilizando la librería Scikit-Image.

Procesamiento de Imagenes:

Antes de poder ir a la practica debemos conocer algunos conceptos básicos.
Una imagen es una función bidimensional f(x,y) que representa la intensidad de la luz, donde x e y son coordenadas espaciales y el valor de f es proporcional al brillo de la imagen en un punto cualquiera.
Sabes esto es muy importante ya que nos da la base para poder saber como obtener valores de pixeles. 
En las imágenes, estas pueden ser representadas como una matriz cuyos índices de fila y columna identifican un punto de la imagen el cual es un indicador del nivel de brillo. Estos puntos de la matriz son a los que llamamos pixeles.
 Otro punto a tener en cuenta son las imágenes en escala de grises.
Cuando hablamos de imágenes en escala de grises, nos referimos a una imagen de 8 bits donde cada pixel de la imagen tiene asignada una intensidad con un rango de 0 a 255. 
Para obtener información relevante de una imagen se utiliza el procesamiento digital de señales mediante el cual se busca transformar una imagen en otra mediante procesos algorítmicos con el objetivo de resaltar cierta información de interés o atenuar información irrelevante.

Pre-procesado:

Dentro de la etapa de pre-procesado se tienen diferentes técnicas, las cuales sin aplicadas dependiendo de problema que presenta la imagen.
A continuación realizaremos algunos ejercicios comunes en esta área.

Detección de bordes:

Esto es algo muy común. Cuando hablamos de "detección de bordes", nos referimos a detectar discontinuidades en el nivel de intensidad de la imagen. 
Para realizar este tipo de detección, existen diferentes tipos de filtros, a continuación implementaremos algunos de estos filtros utilizando scikit-imagee y matplotlib:
# Librerias necesarias
from skimage import io
from skimage import filters
from skimage.color import rgb2gray
import matplotlib.pyplot as plt

# Abrimos la imagen
imagen = io.imread("imagen.jpg")
imagen_g = rgb2gray(imagen)

# Filtros: sobel, roberts, prewitt
filtros = [filters.sobel, filters.roberts, filters.prewitt]

for filtro in filtros:
    # Aplicamos cada uno de los filtros
    img_fil = filtro(imagen_g)
    
    # Mostramos los resultados 
    plt.imshow(img_fil)
    plt.show()

png
png
png

Mejoramiento del contraste:

En algunas ocasiones se necesita aumentar el contraste de las imágenes. Al aumentar el contraste incrementa el cambio en la intensidad de la luz entre las zonas más oscuras o más claras.
Scikit-Image nos proporciona diversas funciones para el mejoramiento de contraste:
from skimage import exposure
from skimage import io
import numpy as np
import matplotlib.pyplot as plt

imagen = io.imread("imagen.jpg")

# Estiramiento de contraste
p2, p98 = np.percentile(imagen, (2,98))
img_rescale = exposure.rescale_intensity(imagen, in_range=(p2,p98))

# Ecualización
img_eq = exposure.equalize_hist(imagen)

# Ecualización adaptiva
img_adapteq = exposure.equalize_adapthist(imagen, clip_limit=0.03)

for eq in (img_eq, img_adapteq):
    plt.imshow(eq)
    plt.show()
C:UsersPILARAppDataLocalProgramsPythonPython36-32libsite-packagesskimageexposureexposure.py:63: UserWarning: This might be a color image. The histogram will be computed on the flattened image. You can instead apply this function to each color channel.
  warn("This might be a color image. The histogram will be "
C:UsersPILARAppDataLocalProgramsPythonPython36-32libsite-packagesskimageutildtype.py:130: UserWarning: Possible precision loss when converting from float64 to uint16
  .format(dtypeobj_in, dtypeobj_out))
png
png

Eliminación de ruido:

Existen diferentes tipos de ruidos que pueden reducir la calidad de la imagen. Uno de los más comunes es el ruido conocido como sal y pimienta, el cual es producido por perturbaciones agudas y repentinas en la imagen causadas por el mismo equipo de medición o el ambiente.
Para minimizar el ruido, podemos utilizar el filtro de medianas:
from skimage import io
from skimage.filters.rank import median
from skimage.morphology import disk
from skimage.color import rgb2gray
import matplotlib.pyplot as plt

imagen = io.imread("charlie.jpg")
img_gray = rgb2gray(imagen)

med = median(img_gray)

plt.imshow(med)
plt.show()
C:UsersPILARAppDataLocalProgramsPythonPython36-32libsite-packagesskimageutildtype.py:130: UserWarning: Possible precision loss when converting from float64 to uint8
  .format(dtypeobj_in, dtypeobj_out))
png

Restauración:

Al restaurar una imagen se busca normalmente eliminar el ruido, mejorar el brillo, el color y los detalles de la misma, recuperando de esta forma aquellas partes que han sido deterioradas
Para la restauración, utilizaremos el filtro Wiener:
from skimage import restoration
from scipy.signal import convolve2d
from skimage import io
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt

imagen = io.imread("imagen_ruido.jpg")

img = rgb2gray(imagen)

psf = np.ones((5,5)) / 25

img = convolve2d(img, psf, 'same')
img += 0.1 * img.std() * np.random.standard_normal((img.shape))
deconvolved_img = restoration.wiener(img, psf, 100)

plt.imshow(deconvolved_img)
plt.show()
png

Suavizar y resaltar contornos:

En algunos casos no basta con detectar los bordes en la imagen, sino que se necesita detectarlos y suavizarlos. Para esto se utiliza el filtro Canny, el cual se compone de tres etapas: la primera dirigida a la reducción del ruido, obteniendo una imagen suavizada y la segunda donde se encuentra los gradientes en la intensidad de los píxeles.
from skimage import io
from skimage import feature
from skimage.color import rgb2gray
import matplotlib.pyplot as plt

imagen = io.imread("mario.jpg")
img = rgb2gray(imagen)
edge = feature.canny(img)
plt.imshow(edge)
plt.show()
png
Estos algunos ejemplos básicos que nos servirán mucho.
Puedes ver y descargar todos los ejemplo en formato ipynb: https://github.com/LuisAlejandroSalcedo/Procesamiento-de-Imagenes-con-Python-y-Scikit-Image.
¿Alguna duda ? No dudes en dejar tu comentario.
Mi nombre es Luis y fue un placer compartir mis conocimientos con todos ustedes :D. 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir
White Monkey