31 votos

Cómo búfer de trama de píxeles por sus valores?

Los píxeles a la izquierda representan el árbol de ubicaciones y sus asociados de la corona de los radios (es decir, los valores de los píxeles que van desde los 2 - 5). Me gustaría búfer de esta trama de píxeles por su corona valor del radio. La imagen de la derecha es lo que estoy esperando a lograr usando sólo raster métodos de procesamiento.

Yo inicialmente se podría pensar que el uso de una circular focal suma en ArcGIS, aunque el entorno del barrio es un valor fijo, que no tenga en cuenta la variable de tamaño de la corona de radio.

¿Qué es un buen método para "buffer" píxeles por sus valores?

enter image description here

15voto

Jess Chadwick Puntos 1053

Aquí es pura trama de la solución en Python 2.7 uso de numpy y scipy:

import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

#create tree location matrix with values indicating crown radius
A = np.zeros((120,320))
A[60,40] = 1
A[60,80] = 2
A[60,120] = 3
A[60,160] = 4
A[60,200] = 5
A[60,240] = 6
A[60,280] = 7

#plot tree locations
fig = plt.figure()
plt.imshow(A, interpolation='none')
plt.colorbar()

#find unique values
unique_vals = np.unique(A)
unique_vals = unique_vals[unique_vals > 0]

# create circular kernel
def createKernel(radius):
    kernel = np.zeros((2*radius+1, 2*radius+1))
    y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
    mask = x**2 + y**2 <= radius**2
    kernel[mask] = 1
    return kernel

#apply binary dilation sequentially to each unique crown radius value 
C = np.zeros(A.shape).astype(bool)   
for k, radius in enumerate(unique_vals):  
    B = ndimage.morphology.binary_dilation(A == unique_vals[k], structure=createKernel(radius))
    C = C | B #combine masks

#plot resulting mask   
fig = plt.figure()
plt.imshow(C, interpolation='none')
plt.show()

Entrada: enter image description here

Salida: enter image description here

8voto

Nikola Puntos 21

Vector-enfoque basado en

Esta tarea se puede realizar en tres pasos:

Nota: utilizando el buffer de campo, se evita el cálculo de un buffer para cada corona valor del radio.


Raster-enfoque basado en

Evitar el vector basado en la solución de este problema sugiere la utilización de un tipo de Autómata Celular basado en los vecinos más próximos. Suponiendo que todos los píxeles negros son ceros, los píxeles son cuadrados y su tamaño es igual a 1 (o, alternativamente, son oportunamente a escala), las reglas para adoptar son muy simples:

  1. Si el valor del píxel (VALUE) es mayor que 1, su valor se convierte en VALUE-1 y, a continuación, considere la posibilidad de los píxeles que lo rodean. Si sus valores son inferiores a VALUE-1, estos píxeles de nacer o crecer , y su valor se vuelve VALUE-1. De lo contrario, estos píxeles sobrevivir y se deja sin cambios.
  2. Si VALUE<=1, no hacer nada (el píxel está muerto!).

Estas reglas deben aplicarse hasta que todos los píxeles muertos, es decir, sus valores es igual a 0 o 1. Por lo N-1 veces N es el máximo valor que tiene en la entrada de la trama. Este enfoque puede ser muy fácil de implementar con un poco de Python y numpy.

7voto

xenny Puntos 670

Es una pregunta difícil de contestar para ello en trama, porque usted no tiene la oportunidad de utilizar el valor del píxel para definir el tamaño de la memoria intermedia. Por lo tanto, usted necesita para hacer el centro de filtro para cada valor, como ya se ha dicho.

Aquí hay una posible respuesta a hacerlo con sólo 3 filtros (no he podido encontrar menos), pero no a la perfección, como es mencionado por Whuber : su búferes se truncará cuando los árboles están cerca unos de otros.

1) EDITAR : Euclidiana de asignación (esto no resuelve completamente el problema, ya que reduce los búferes en la vecindad de los árboles más pequeños, pero es mejor que los artefactos de mi primera solución).

2) la distancia euclidiana alrededor de cada píxel

3) raster calculator (mapa álgebra) con una instrucción condicional

Con("allocation_result" > ("distance_result" / pixel_size) , 1 , 0)

Tenga en cuenta que usted puede ajustar el condtion dependiendo de sus necesidades en términos de radio (con o withot la central de píxeles)

7voto

user10775 Puntos 121

Otra opción sería crear distintos rásteres para cada valor de píxel, en este caso 4 rásteres, con una condición. A continuación, expanda los rásteres por un número de píxeles correspondientes a la trama del valor (posiblemente la iteración sobre un valor de la lista). Por último, se unen los rásteres (algebraica o espacialmente), para crear un binario trama de las copas de los árboles.

2voto

huckfinn Puntos 698

Si usted tiene la posición de los píxeles, el radio y el punto Medio del círculo algoritmo (una variante de la Bresenham de Alg.) te da una pista. La OMI es fácil crear un polígono a partir de este enfoque y creo que es fácil de implementar esto en Python. Una unión de este conjunto de polígonos que se le da el área de la cubierta. Bye Huck

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X