tamaño - que es un array en python
Calcular el perímetro de la matriz numpy (2)
Quiero calcular el perímetro de una estructura de matriz numpy dada. Con el perímetro me refiero al perímetro exacto de la estructura en la matriz numpy. La estructura podría incluir agujeros.
Mi enfoque actual es algo como esto:
import numpy
a = numpy.zeros((6,6), dtype=numpy.int)
a[1:5, 1:5] = 1;a[3,3] = 0
# Way 1
s = ndimage.generate_binary_structure(2,1)
c = ndimage.binary_dilation(a,s).astype(a.dtype)
b = c - a
numpy.sum(b) # The result, however the hole is calculated as 1, although there are 4 edges
# Way 2
b = ndimage.distance_transform_cdt(a == 0,metric=''taxicab'') == 1
b = b.astype(int)
numpy.sum(b) # same as above
Como puede ver, muestra todas las celdas adyacentes, sin embargo, la suma de ellas no es igual al perímetro del parche. El agujero en la matriz de ejemplo se calcula como 1 aunque tiene correctamente 4 bordes. Hay problemas similares con agujeros mayores de diferentes formas.
He hecho preguntas similares en el pasado, pero todas proporcionaron soluciones que de alguna manera no se resolvieron en los valores de salida correctos al final. Alguien tiene una idea de cómo lograr esto? No hay más paquetes que numpy, scipy y los paquetes base, por favor.
¿Quiere decir, en la imagen, el número total de bordes de longitud 1 que separan las fichas de color azul de las de color rojo? En la imagen de arriba, este número sería 28. En el ejemplo que das en el código (que es ligeramente diferente, sin tener las 4 esquinas diferentes del resto de las fichas del borde) sería 20.
Si eso es lo que quiere calcular, puede hacer algo como:
numpy.sum(a[:,1:] != a[:,:-1]) + numpy.sum(a[1:,:] != a[:-1,:])
Cuente el número de bordes en el interior y en los bordes (supone una imagen binaria):
n_interior = abs(diff(a, axis=0)).sum() + abs(diff(a, axis=1)).sum()
n_boundary = a[0,:].sum() + a[:,0].sum() + a[-1,:].sum() + a[:,-1].sum()
perimeter = n_interior + n_boundary
Puede dejar fuera n_boundary si la imagen está correctamente rellenada con cero.