Segmentación de imágenes#

La segmentación de imágenes es el proceso de separar una imagen en múltiples regiones.

Ver también

Comencemos de nuevo definiendo una imagen como un arreglo bidimensional y visualizándola usando pyclesperanto.

import numpy as np
from pyclesperanto_prototype import imshow
import matplotlib.pyplot as plt
image = np.asarray([
    [1, 0, 2, 1, 0, 0, 0],
    [0, 3, 1, 0, 1, 0, 1],
    [0, 5, 5, 1, 0, 1, 0],
    [0, 6, 6, 5, 1, 0, 2],
    [0, 0, 5, 6, 3, 0, 1],
    [0, 1, 2, 1, 0, 0, 1],
    [1, 0, 1, 0, 0, 1, 0]
])
imshow(image, colorbar=True)
../_images/e9018d44e3b10b0c8ec07b305396d770892e70160b50a4f961d71e65b9b449bf.png

Imágenes binarias#

La forma más básica de hacer esto es la binarización, convirtiendo la imagen en una región “positiva” y una “negativa”. Típicamente, se utilizan imágenes binarias para ello, que podrían contener, por ejemplo, dos valores de píxel diferentes True y False representando “positivo” y “negativo”, respectivamente. Técnicamente, cualquier imagen puede interpretarse como una imagen binaria utilizando la lógica “Todo píxel se considera positivo si no es ni False ni 0.”

Umbralización de imágenes#

Un algoritmo muy básico para separar regiones de baja intensidad de regiones de alta intensidad en la imagen es la umbralización. Ahora crearemos una nueva imagen que contenga True y False como valores de píxel dependiendo de si la imagen original tenía una intensidad menor o mayor que un umbral dado. Como esta imagen tiene solo dos valores de píxel diferentes, es una imagen binaria:

threshold = 4

binary_image = image > threshold
binary_image
array([[False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False],
       [False,  True,  True, False, False, False, False],
       [False,  True,  True,  True, False, False, False],
       [False, False,  True,  True, False, False, False],
       [False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False]])
imshow(binary_image)
../_images/a5726ca9774e9154f37546248aca81196d0b745fef2b0184202be81623215c84.png

Matplotlib puede ser más flexible al visualizar imágenes, por ejemplo, para dibujar contornos alrededor de regiones de interés:

# crear una nueva gráfica
fig, axes = plt.subplots(1,1)

# añadir dos imágenes
axes.imshow(image, cmap=plt.cm.gray)
axes.contour(binary_image, [0.5], linewidths=1.2, colors='r')
<matplotlib.contour.QuadContourSet at 0x1a542ce37f0>
../_images/f785b9e70d05de726bf0548c034aad985cf6dd73403d5ef894965ec767da293a.png