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)
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)
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>