GDAL과 Python을 사용한 최소 거리 알고리즘
-
29-10-2019 - |
문제
구현하려고 하는데 최소 거리 알고리즘 GDAL과 Python을 사용한 이미지 분류.샘플 영역의 평균 픽셀 값을 계산하고 이를 배열 목록("sample_array")에 저장한 후 이미지를 "값"이라는 배열로 읽어 들였습니다.다음 코드를 사용하여 이 배열을 반복합니다.
values = valBD.ReadAsArray()
# loop through pixel columns
for X in range(0,XSize):
# loop thorugh pixel lines
for Y in range (0, YSize):
# initialize variables
minDist = 9999
# get minimum distance
for iSample in range (0, sample_count):
# dist = calc_distance(values[jPixel, iPixel], sample_array[iSample])
# computing minimum distance
iPixelVal = values[Y, X]
mean = sample_array[iSample]
dist = math.sqrt((iPixelVal - mean) * (iPixelVal - mean)) # only for testing
if dist < minDist:
minDist = dist
values[Y, X] = iSample
classBD.WriteArray(values, xoff=0, yoff=0)
이 절차는 큰 이미지의 경우 매우 오래 걸립니다.그래서 누군가 더 빠른 방법을 알고 있는지 묻고 싶습니다.나는 파이썬에서 다양한 변수의 액세스 속도에 대해 잘 모릅니다.아니면 누군가 내가 사용할 수 있는 라이브러리를 알고 있을 수도 있습니다.미리 감사드립니다. 마리오
해결책
반드시 NumPy를 사용해야 합니다.저는 꽤 큰 래스터 데이터세트로 작업하는데 NumPy는 이를 통해 데이터를 처리합니다.내 컴퓨터에서는 아래 코드를 사용하면 1000 x 1000 배열에 대해 눈에 띄는 지연이 없습니다.이것이 어떻게 작동하는지에 대한 설명은 코드를 따릅니다.
import numpy as np
from scipy.spatial.distance import cdist
# some starter data
dim = (1000,1000)
values = np.random.randint(0, 10, dim)
# cdist will want 'samples' as a 2-d array
samples = np.array([1, 2, 3]).reshape(-1, 1)
# this could be a one-liner
# 'values' must have the same number of columns as 'samples'
mins = cdist(values.reshape(-1, 1), samples)
outvalues = mins.argmin(axis=1).reshape(dim)
CDIST()
각 요소로부터의 "거리"를 계산합니다. values
각 요소에 samples
.이는 1,000,000 x 3 배열을 생성합니다. 여기서 각 행은 n
픽셀과의 거리가 있습니다 n
원래 배열에서 각 샘플 값으로 [1, 2, 3]
. argmin(axis=1)
원하는 각 행의 최소값 인덱스를 제공합니다.빠른 모양 변경을 통해 이미지에 대해 기대하는 직사각형 형식을 얻을 수 있습니다.
다른 팁
Thomas K와 동의하기 : pil 또는 else aC-Function 및 EG.를 사용하여 랩핑합니다ctypes 또는 Numpy Matrix Operations 를 사용하십시오. 또는 기존 코드에서 pypy를 사용하십시오 (JIT 컴파일 된 코드는 이미지 코드에서 100 배 빠르게 될 수 있습니다).Pypy를 시도하고 어떤 속도를 얻는지 알려주십시오.
수익 : CPYTHON에서 기본적으로 픽셀 지혜로운 물건을하지 마십시오. 해석 및 메모리 - MGT 오버 헤드가 당신을 죽일 것입니다.