Raster pikselleri değerlerine göre tamponlama nasıl yapılır?


28

Soldaki pikseller ağaç konumlarını ve bunlarla ilişkili taç yarıçaplarını temsil eder (yani 2 ila 5 arasında değişen piksel değerleri). Bu raster pikselleri taç yarıçapı değerlerine göre tamponlamak istiyorum. Sağdaki görüntü, yalnızca raster işleme yöntemlerini kullanarak gerçekleştirmeyi umduğum şey .

Başlangıçta ArcGIS'te dairesel bir odak toplamı kullanmayı düşünürdüm, ancak mahalle ayarı değişken büyüklükteki taç yarıçapı dikkate alınmayacak sabit bir değerdir.

Pikselleri değerlerine göre "tamponlamak" için iyi bir yöntem nedir?

görüntü tanımını buraya girin


2
Rasterleri noktalara, ardından alana göre arabellek daha sonra rasterlere dönüştürmeye çalıştınız mı?

2
Bunun yerel olmayan bir işlem olduğunun farkına varmak için yardımcı olur çünkü yerel olmayan bölgelerin hesaplamanın nasıl yapılabileceğine dair doğal sınırlar olduğunu gösterir. Örneğin, girdideki yalnızca bir izole edilmiş piksel büyük bir değere değiştirildiyse, çıktınız neredeyse her yerde kökten değişecektir. Bu nedenle, giriş değerleri üzerindeki kısıtlamaları biliyorsanız, lütfen bunları paylaşın, çünkü bu, gelişmiş çözümlere yol açabilir. Örneğin, tüm giriş değerleriniz daima {2,3,4} setinde olacak mı?
whuber

@Dan Patterson Bu şekilde sağdaki görüntü ile geldim. Ancak, vektör işlemlerinden tamamen kaçınmaya ve bu adımlardan kaçınmaya çalışıyorum.
Aaron

2
@whuber Bu veri kümesi, değişken taç çaplarına sahip ağaçları temsil eder. Buna göre, ağaç taç yarıçapı ölçümleri gerçekçi bir şekilde 1-10 arasında değişebilir. Ayrıca tamponlanmış çıktının taç yokluğu için sadece 0 ve taç yokluğu için 1 olması gerektiğini de eklemeliyim.
Aaron

1
Tamam teşekkürler. Örnek çıktısını, 3 değerine sahip noktaların 3 arabelleğini, 4 değerine sahip noktaların 4 arabelleğini ve 5 değerine sahip noktaların 5 arabelleğini birleştirerek yarattığınız gibi görünüyor. puanları 2 ile işlemek için.) Bu işlem sadece sorunuzu cevaplamakla kalmaz, (inanıyorum) Spatial Analyst'te bulunan araçları kullanarak en basit çözümdür.
whuber

Yanıtlar:


14

Burada bir saf raster çözümdür Python 2.7kullanarak numpyve 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()

Giriş: görüntü tanımını buraya girin

Çıktı: görüntü tanımını buraya girin


1
Dilatasyon yaklaşımı için +1! Çok yakın noktalarla da çalışır.
Antonio Falciano

Bu eski jet coursursalının neden korkunç olduğunu gösteren harika bir örnek. Bu viridis ile çok daha net görünüyor.
naught101

8

Vektör tabanlı yaklaşım

Bu görev üç adımda yapılabilir:

Not: Tampon alanını kullanmak, her taç yarıçapı değeri için bir tampon hesaplanmasından kaçınır.


Raster tabanlı yaklaşım

Vektör tabanlı çözümden kaçınarak, bu sorun en yakın komşulara dayanan bir tür Hücresel Otomata kullanılmasını önerir . Tüm siyah piksellerin sıfır olduğunu varsayalım, pikseller karedir ve boyutları 1'e eşittir (veya alternatif olarak, fırsat ölçeklenir), kabul edilmesi gereken kurallar çok basittir:

  1. Eğer piksel değeri ( VALUE) 1'den büyükse, değeri olur VALUE-1ve çevreleyen pikselleri göz önünde bulundurun. Değerleri daha küçükse VALUE-1, bu pikseller doğar veya büyür ve değerleri olur VALUE-1. Aksi takdirde, bu pikseller hayatta kalır ve değişmeden kalır.
  2. Eğer bir VALUE<=1şey yapmazsanız (piksel ölür!).

Bu kurallar, tüm pikseller ölünceye kadar uygulanmalıdır, yani değerleri 0 veya 1'e eşittir. Öyleyse , giriş rasterinde maksimum değerin N-1olduğu zamanlar N. Bu yaklaşım biraz Python ve numpy ile kolayca uygulanabilir.


1
Cevap afalciano için teşekkürler. Bu yöntem, görüntüyü sağa nasıl oluşturduğum ve bir vektör yaklaşımını kullanıyor - biri kaçınmaya çalışıyorum.
Aaron

1
Tamam Aaron, işte şimdi raster tabanlı bir yaklaşım. Bu yardımcı olur umarım.
Antonio Falciano

7

Diğer bir seçenek, her durumda bir piksel değeri için ayrı rasterler oluşturmaktır, bu durumda bir koşulla 4 raster. Ardından, rasterleri, raster değerine karşılık gelen bir piksel sayısıyla genişletin (muhtemelen bir değer listesi üzerinde yineleyerek). Son olarak, ağaç kronları için bir ikili raster oluşturmak için rasterleri (cebirsel veya uzaysal olarak) birleştirin.


1
Bu fikir doğru fikir. Ayrıntılar geliştirilebilir: (1) seçim, belirli bir tepe yarıçapı ağaçlarının ikili (0,1) göstergesini oluşturur. (2) Bu seçimin odak toplamı - verilen yarıçapın dairesel bir mahalle kullanılarak - FFT kullanılarak hesaplamak için hızlıdır. (3) Odak toplamlarının eklenmesi (noktasal olarak) ve bunu 0 ile karşılaştırmak istenen tamponu verir.
whuber

7

Rasterde bunu yapmak zor bir soru çünkü tamponun boyutunu tanımlamak için pikselin değerini kullanma fırsatınız yok. Bu nedenle, daha önce de söylediğiniz gibi her değer için odak filtresi yapmanız gerekir.

İşte sadece 3 filtre ile yapabileceğim olası bir cevap (daha az bulamadım), ancak Whuber tarafından söylendiği gibi mükemmel değil: aralarında ağaçların birbirine yakın olduğu durumlarda tamponlarınız kesilecektir.

1) EDIT: Öklidiyen tahsisi (bu, sorunu daha küçük ağaçların çevresindeki tamponları kestiği için tam olarak çözmez, ancak ilk çözümümün eserlerinden daha iyidir).

2) her pikselin etrafındaki öklid mesafesi

3) koşullu bir ifadeyle raster hesap makinesi (harita cebiri)

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

İhtiyaçlarınıza bağlı olarak, yarıçap cinsinden (merkezi piksel ile veya bu pikselle) ilgili ayarları yapabilirsiniz.


+1 Bu yaratıcı bir yaklaşım. Bu yaklaşımı kullanarak ölçeklendirmenin mümkün olup olmadığını kontrol edeceğim.
Aaron

2
Öklid mesafesi yaklaşımı işe yaramaz, çünkü yalnızca en yakın ağaca olan mesafeyi hesaplar ; bu, tacı noktayı kaplayan bir ağaca olan mesafe anlamına gelmez.
whuber

2

Acaba neden ArcGIS'in genişletme aracını kullanmıyorsunuz ?

import arcpy
from arcpy.sa import *

raster_in  = r'c:\test.tif'
raster_out = r'c:\test_out.tif'

outExpand1 = Expand(raster_in, 2, 2)
outExpand2 = Expand(outExpand1, 3, 3)
outExpand3 = Expand(outExpand3, 4, 4)
outExpand4 = Expand(outExpand4, 5, 5)

outExpand4.save(raster_out)

Çakışma durumunda: En son expandkomut öncekileri kapsayacaktır.


2

Eğer piksel konumunuz varsa, yarıçap ve Orta Nokta daire algoritması (Bresenham Alg'in bir değişkeni) size bir ipucu verir. IMO, bu yaklaşımdan çokgen oluşturmak kolaydır ve bunu Python'da uygulamanın kolay olduğunu düşünüyorum. Bu çokgen grubunun birliği size kaplama alanını verir.


Bunun bir sorun olmadığını biliyorum, ancak grafik ilkelleri ve tarama çizgisi çokgen dolgusu hakkında daha fazla bilgi edinmek ister misiniz? Daireler için çok kolaydır. Dışbükey kombinasyonu bir
terimdir

Temel raster işlemleri kullanılarak bu nasıl uygulanır?
whuber

Bunu raster alanda işlemeye çalışırsanız, daire noktalarını belirleyin, bunları y veya x ile sıralayın ve boşluğu düz bir çizgiyle doldurun (tarama çizgisi) daireyi doldurmak için yolda. Üçgensel yaklaşımda, daireyi üçgen kesimlere yaklaşarak kurar ve üçgeni doldurmaya çalışırsanız, nokta içeride veya dışarıda (dışbükey kombinasyon) ve diğer yol ise bir teste ihtiyacınız vardır. Ve "GIS" yaklaşımında, çokgenler inşa etmek (saat yönünde odaklı çokgenler) ve bir birlik kurmak üçüncü oldu (IMO en hesaplı pahalı olanı).
huckfinn

Açık olmak gerekirse: "GIS" yaklaşımında ... birlik, kesişme, dokunma gibi bir cebirsel işlem yapın .... IMO en hesaplı pahalı olan üçüncü kişi.
huckfinn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.