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)
この手順には、大きな画像に非常に時間がかかります。だから、誰かがより速い方法を知っているかどうか尋ねたいのです。 Pythonのさまざまな変数のアクセス速度についてはあまり知りません。あるいは、誰かが私が使用できるLibaryを知っているかもしれません。よろしくお願いします、マリオ
解決
あなたは間違いなく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)
各行に沿った最小値のインデックスを提供します。これが必要なものです。簡単に再構築すると、画像に期待される長方形の形式が提供されます。
他のヒント
トーマスKに同意します:使用 ピル, 、またはc機能を書いて、eg ctypesを使用してラップするか、少なくとも一部を使用してください Numpy Matrix操作。または、既存のコードでPypyを使用します(JITコンパイルコードは、画像コードで100倍高速になります)。 Pypyを試して、どのようなスピードアップを得たか教えてください。
結論:cpythonでネイティブにこのようにピクセルごとに物事を行わないでください。通訳とメモリ-MGTオーバーヘッドがあなたを殺します。