문제

구현하려고 하는데 최소 거리 알고리즘 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 오버 헤드가 당신을 죽일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top