43

結果の配列にかなりの数のピクセルがある画像を numpy に読み込んでいます。

256 個の値を持つルックアップ テーブルを計算しました。今、私は次のことをしたい:

for i in image.rows:
    for j in image.cols:
        mapped_image[i,j] = lut[image[i,j]]

ええ、それは基本的に lut が行うことです。
唯一の問題は、効率的にやりたいのですが、Pythonでそのループを呼び出すと、終了するまで数秒待たなければならないことです。

私が知っているnumpy.vectorize()のは、同じ python コードを呼び出す単なる便利な関数です。

4

3 に答える 3

62

if is 1Dimageにインデックスを付けるために使用できます。 NumPy でのインデックス作成に関するスターターは次のとおりですlutlut

In [54]: lut = np.arange(10) * 10

In [55]: img = np.random.randint(0,9,size=(3,3))

In [56]: lut
Out[56]: array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])

In [57]: img
Out[57]: 
array([[2, 2, 4],
       [1, 3, 0],
       [4, 3, 1]])

In [58]: lut[img]
Out[58]: 
array([[20, 20, 40],
       [10, 30,  0],
       [40, 30, 10]])

インデックス作成が開始することにも注意してください0

于 2013-01-21T23:16:47.887 に答える
29

TheodrosZelleke の答えは正しいですが、文書化されていない知恵を少し追加したかっただけです。Numpy は関数 を提供します。この関数はnp.take、ドキュメントによると「派手なインデックス作成と同じことを行います」。

まあ、ほぼ同じですが、まったく同じではありません。

>>> import numpy as np
>>> lut = np.arange(256)
>>> image = np.random.randint(256, size=(5000, 5000))
>>> np.all(lut[image] == np.take(lut, image))
True
>>> import timeit
>>> timeit.timeit('lut[image]',
...               'from __main__ import lut, image', number=10)
4.369504285407089
>>> timeit.timeit('np.take(lut, image)',
...               'from __main__ import np, lut, image', number=10)
1.3678052776554637

np.take約3倍高速!私の経験では、3D luts を使用して画像を RGB から他の色空間に変換する場合、ロジックを追加して 3D ルックアップを 1D 平坦化ルックアップに変換すると、10 倍の速度アップが可能になります。

于 2013-01-22T03:28:55.950 に答える