래스터 픽셀을 값으로 버퍼링하는 방법은 무엇입니까?


28

왼쪽의 픽셀은 트리 위치 및 관련 크라운 반경 (즉, 2-5 범위의 픽셀 값)을 나타냅니다. 이 래스터 픽셀을 크라운 반경 값으로 버퍼링하고 싶습니다. 오른쪽 이미지는 래스터 처리 방법 만 사용하여 달성하고자하는 것 입니다.

이웃 설정은 고정 된 값이지만 가변 크기 크라운 반경을 고려하지 않지만 처음에는 ArcGIS에서 원형 초점 합계를 사용하려고 생각합니다.

값으로 픽셀을 "버퍼링"하는 좋은 방법은 무엇입니까?

여기에 이미지 설명을 입력하십시오


2
래스터를 포인트로 변환 한 다음 필드별로 버퍼링 한 다음 다시 래스터로 변환하려고 했습니까?

2
로컬 이 아닌 작업은 계산 수행 방법에 고유 한 제한이 있음을 나타 내기 때문에 로컬 이 아닌 작업 임을 인식하는 데 도움이 됩니다. 예를 들어, 입력에서 단 하나의 분리 된 픽셀 만 큰 값으로 변경하면 출력은 거의 모든 곳에서 근본적으로 변경됩니다. 따라서 입력 값에 대한 제한 사항을 알고 있으면 솔루션을 개선 할 수 있으므로 공유하십시오. 예를 들어 모든 입력 값이 항상 {2,3,4} 세트에 있습니까?
whuber

@ Dan Patterson 그것이 오른쪽 이미지를 생각해 낸 방법입니다. 그러나 벡터 작업을 완전히 피하고 이러한 단계를 피하려고합니다.
Aaron

2
@whuber이 데이터 세트는 다양한 크라운 직경을 가진 나무를 나타냅니다. 이를 감안할 때 트리 크라운 반경 측정 값은 실제로 1-10에서 달라질 수 있습니다. 또한 버퍼링 된 출력은 크라운 부재의 경우 0이고 크라운 존재의 경우 1입니다.
Aaron

1
알았어 고마워. 값이 3 인 포인트의 3 버퍼, 값이 4 인 포인트의 4 버퍼 및 값이 5 인 포인트의 5 버퍼를 통합하여 예제 출력을 생성 한 것 같습니다. 이 프로세스는 귀하의 질문에 대답 할뿐만 아니라 Spatial Analyst에서 제공되는 도구를 사용하는 가장 간단한 솔루션이라고 생각합니다.
whuber

답변:


14

여기에 순수한 래스터 솔루션을 Python 2.7사용 numpy하고 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()

입력: 여기에 이미지 설명을 입력하십시오

산출: 여기에 이미지 설명을 입력하십시오


1
팽창 접근법에 +1! 가까운 지점에서도 작동합니다.
Antonio Falciano

이것은 오래된 제트 색채가 끔찍한 이유의 훌륭한 예입니다. 이것은 viridis에서 훨씬 더 명확 해 보입니다.
naught101

8

벡터 기반 접근

이 작업은 세 단계로 수행 할 수 있습니다.

참고 : 버퍼 필드를 사용하면 각 크라운 반경 값에 대한 버퍼 계산을 피할 수 있습니다.


래스터 기반 접근

벡터 기반 솔루션을 피하면서이 문제는 가장 가까운 이웃에 기반한 일종의 셀룰러 오토마타 를 사용하는 것이 좋습니다 . 모든 검은 색 픽셀이 0이고 픽셀이 정사각형이고 크기가 1과 같거나 (또는 ​​적절하게 조정 됨) 가정하는 규칙은 매우 간단합니다.

  1. 픽셀 값 ( VALUE)이 1보다 크면 해당 값이 VALUE-1되고 주변 픽셀을 고려합니다. 그 값보다 작은 경우 VALUE-1, 이러한 픽셀 출생 이나 성장 과 그 값이된다을 VALUE-1. 그렇지 않으면,이 픽셀은 생존 하고 변경되지 않은 상태로 남아 있습니다.
  2. 인 경우 VALUE<=1아무것도하지 마십시오 (픽셀이 죽었습니다!).

이 규칙은 모든 픽셀이 죽을 때까지, 즉 그 값이 0 또는 1이 될 때까지 적용되어야합니다. 따라서 N-1시간 N은 입력 래스터에있는 최대 값입니다. 이 접근법은 약간의 파이썬과 숫자로 쉽게 구현할 수 있습니다.


1
응답 afalciano 주셔서 감사합니다. 이 방법은 이미지를 오른쪽으로 만들고 벡터 접근 방식을 사용하는 방법입니다.
Aaron

1
아론, 여기 래스터 기반 접근법이 있습니다. 이것이 도움이되기를 바랍니다.
Antonio Falciano

7

다른 옵션은 각 픽셀 값에 대해 별도의 래스터를 만드는 것입니다 (이 경우에는 4 개의 래스터). 그런 다음 래스터의 값에 해당하는 픽셀 수만큼 래스터를 확장합니다 (값 목록을 반복하여). 마지막으로, 래스터 (대수 또는 공간)를 결합하여 트리 크라운을위한 하나의 이진 래스터를 만듭니다.


1
이 아이디어는 맞습니다. 세부 사항을 개선 할 수 있습니다. (1) 선택하면 지정된 크라운 반경의 트리에 대한 이진 (0,1) 표시기가 만들어집니다. (2) 주어진 반경의 원형 이웃을 사용하는 선택의 초점 합계는 FFT를 사용하여 계산하는 것이 빠릅니다. (3) 초점 합계를 (포인트 단위로) 추가하고 0과 비교하면 원하는 버퍼가 제공됩니다.
whuber

7

버퍼의 크기를 정의하기 위해 픽셀 값을 사용할 기회가 없기 때문에 래스터에서이 작업을 수행하는 것은 어려운 질문입니다. 따라서 이미 말했듯이 각 값에 대해 초점 필터를 수행해야합니다.

Whuber가 언급 한대로 3 개의 필터 (나는 찾을 수 없었지만)로만 수행 할 수있는 대답은 다음과 같습니다. 나무가 서로 가까이있을 때 버퍼가 잘립니다.

1) 편집 : 유클리드 할당 (작은 나무 근처에서 버퍼를 자르기 때문에 문제를 완전히 해결하지는 못하지만 첫 번째 솔루션의 인공물보다 낫습니다).

2) 각 픽셀 주변의 유클리드 거리

3) 조건문이있는 래스터 계산기 (맵 대수)

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

반경 측면에서 (중앙 픽셀이 있거나없는) 필요에 따라 조건을 조정할 수 있습니다.


+1 창의적인 접근 방식입니다. 이 방법을 사용하여 확장 할 수 있는지 테스트합니다.
Aaron

2
유클리드 거리 접근 방식은 가장 가까운 나무 까지의 거리 만 계산하기 때문에 작동하지 않습니다 . 이는 크라운이 점을 덮고있는 나무까지의 거리 일 필요는 없습니다.
whuber

2

왜 ArcGIS의 확장 도구 를 사용하지 않습니까?

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)

겹치는 경우 : 최신 expand명령이 이전 명령을 포함합니다.


2

픽셀 위치가 있으면 반지름과 중간 점 원 알고리즘 (Bresenham Alg.의 변형)이 실마리를 제공합니다. IMO이 방법으로 다각형을 쉽게 만들 수 있으며 파이썬에서 쉽게 구현할 수 있다고 생각합니다. 이 폴리곤 세트를 통합하면 커버링 영역이 제공됩니다.


나는 그것이 문제의 문제는 아니라는 것을 알고 있지만 그래픽 프리미티브와 스캔 라인 폴리곤 채우기에 대해 더 알고 싶습니까? cirles의 경우 매우 쉽습니다. 볼록한 조합은 유행어입니다 ....
huckfinn

기본 래스터 작업을 사용하여 어떻게 적용됩니까?
whuber

래스터 공간에서 이것을 처리하려고하면 원 점을 결정하고 y 또는 x로 정렬하고 원을 채우는 직선 (스캔 선)으로 공간을 채우십시오. 삼각형 접근법에서 tringular 섹터의 근사로 원을 만들고 삼각형을 채우려 고하면 점이 내부 또는 외부 (볼록한 조합)이고 다른 방법인지 테스트해야합니다. 그리고 "GIS"접근 방식에서 다각형 (시계 방향의 다각형)을 만들고 결합을 만드는 것은 세 번째 (IMO가 가장 계산 비용이 많이 드는 것)입니다.
huckfinn

명확하게 말하면 : "GIS"접근 방식에서 ... 유니온, 교차로, 터치 등과 같은 대수 연산을 수행하십시오. 세 번째 IMO가 가장 계산 비용이 많이 듭니다.
Huckfinn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.