lunes, 9 de octubre de 2017

Cómo detectar solapamiento en conjunto de glóbulos de apariencia circular

La necesidad de esta tarea surge de una pregunta realizada en el site de gis.stackexchange.com referida a una imagen. La imagen es binaria y, por tanto, fácilmente vectorizable.

Los vectores obtenidos serían cuerpos globulares, de apariencia cuasi circular, aislados o agrupados; en estos últimos con evidencia de solapamiento. Por tanto, la pregunta que surge es cómo detectar solapamiento en los grupos de glóbulos.

Para solapamiento en cuerpos perfectamente circulares es posible probar un algoritmo basado en azimuths y "segunda" derivadas; tal como el que se expone a continuación. La idea es detectar los puntos singulares (forma de "V") donde la pendiente cambia abruptamente de sentido. Por tanto, el número de solapamientos sería n/2 +1; donde n es el número de puntos singulares detectados.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
layer = iface.activeLayer()

feat = layer.getFeatures().next()

points = feat.geometry().asPolyline()

azimuths = [ points[i].azimuth(points[i+1]) for i in range(len(points)-1) ]

az_diff = [ azimuths[i+1] - azimuths[i] for i in range(len(azimuths)-1) ]

sum = 0

for item in az_diff:
    if item < 0:
        sum += 1

blobs_number = sum/2 + 1

print 'blobs_number: ', blobs_number 

Cuando se prueba con un círculo aislado:



con dos círculos solapados:



con siete círculos solapados:


el resultado es el esperado. Sin embargo, en el caso de cuerpos cuasi circulares, es posible que exista cierto ruido en la data. Por tanto, sería necesario hacer un estudio exploratorio de los arrays de puntos para detectar el umbral para el cual es seguro detectar un punto singular e integrarlo en el if que realiza la suma de estos.

No hay comentarios: