5

GDAL と Python を使用して画像分類の最小距離アルゴリズムを実装しようとしています。サンプル領域の平均ピクセル値を計算し、それらを配列のリスト ("sample_array") に格納した後、画像を "values" という配列に読み込みました。次のコードでは、この配列をループします。

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)

大きな画像の場合、この手順には非常に時間がかかります。誰かがより速い方法を知っているかどうか尋ねたいのはそのためです。Pythonのさまざまな変数のアクセス速度についてはあまり知りません。または、誰かが私が使用できるライブラリを知っているかもしれません。前もってありがとう、マリオ

4

2 に答える 2

5

間違いなく 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()の各要素から の各要素までの「距離」を計算valuessamplesます。これにより、1,000,000 x 3 の配列が生成されます。各行には、元の配列のピクセルから各サンプル値までnの距離があります。は、各行に沿った最小値のインデックスを提供します。これは、必要なものです。すばやく変形すると、イメージに期待する長方形のフォーマットが得られます。n[1, 2, 3]argmin(axis=1)

于 2011-08-15T05:14:16.933 に答える
2

Thomas Kに同意します。PILを使用するか、C関数を記述してctypesなどを使用してラップするか、少なくともいくつかのnumPy行列演算を使用します。または、既存のコードでpypyを使用します(JITでコンパイルされたコードはイメージコードで100倍高速になる可能性があります)。pypyを試して、どのようなスピードアップが得られたかを教えてください。

結論:cPythonでネイティブにこのようなことをピクセル単位で行うことは絶対にしないでください。解釈とメモリmgtのオーバーヘッドはあなたを殺します。

于 2011-06-30T20:36:34.463 に答える