martes, 2 de julio de 2019

Áreas, perímetros y centroides de imágenes binarias con scikit-image

Utilizando las funciones label() y regionprops() del submódulo measure de scikit-image podemos obtener varios parámetros muy útiles de regiones binarias contiguas (blobs binarios). En este ejemplo construiremos una imagen binaria con dos círculos de diferente tamaño de los cuales obtendremos sus propiedades.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 2 22:15:13 2019
@author: Rodolfo E. Escobar U.
"""
import numpy as np
import matplotlib.pyplot as plt
from skimage import draw, measure
# Generación de una imagen binaria con dos objetos separados
Bim = np.zeros([300,300])
C1i,C1j = draw.circle(80,100,70)
Bim[C1i,C1j] = 1
C2i,C2j = draw.circle(220,220,50)
Bim[C2i,C2j] = 1
#Etiquetado
E = measure.label(Bim)
#Propiedades de regiones
PR = measure.regionprops(E)
#PR[i].area => área del objeto i
#PR[i].perimeter => Perímetro del objeto i
#PR[i].centroid => centroide del objeto i
plt.imshow(Bim,cmap='gray')
plt.show()
print(u"Región 1:")
print("Area (pixeles): " + str(PR[0].area))
print("Perimetro (pixeles): " + str(PR[0].perimeter))
print("Centroide: " + str(PR[0].centroid))
print('\n')
print(u"Región 2:")
print("Area (pixeles): " + str(PR[1].area))
print("Perimetro (pixeles): " + str(PR[1].perimeter))
print("Centroide: " + str(PR[1].centroid))
view raw etiquetas.py hosted with ❤ by GitHub
Las salidas del programa son:

Región 1:
Area (pixeles): 15361
Perimetro (pixeles): 458.2741699796952
Centroide: (80.0, 100.0)


Región 2:
Area (pixeles): 7825
Perimetro (pixeles): 326.3919189857866
Centroide: (220.0, 220.0)

Es posible  construir un dataframe de pandas a partir del diccionario de propiedades generado con la función regionprops_table(). Si están comenzando con scikit-image pueden revisar mis notas de mi curso introductorio aquí.

No hay comentarios: