2017-08-06 11 views
0

最初に、私はPythonとそのライブラリに比較的新しいです。ピクセル配列をnumpyですばやく繰り返し処理して変更するにはどうすればよいですか?

次のコードの目的は、WebGL Insights Chapter 16で詳しく説明するように、HDRイメージをRGBMに変換することです。

import argparse 
import numpy 
import imageio 
import math 

# Parse arguments 
parser = argparse.ArgumentParser(description = 'Convert a HDR image to a 32bit RGBM image.') 
parser.add_argument('file', metavar = 'FILE', type = str, help ='Image file to convert') 
args = parser.parse_args() 

# Load image 
image = imageio.imread(args.file) 
height = image.shape[0] 
width = image.shape[1] 

output = numpy.zeros((height, width, 4)) 

# Convert image 
for i in numpy.ndindex(image.shape[:2]): 
    rgb = image[i] 
    rgba = numpy.zeros(4) 
    rgba[0:3] = (1.0/7.0) * numpy.sqrt(rgb) 
    rgba[3] = max(max(rgba[0], rgba[1]), rgba[2]) 
    rgba[3] = numpy.clip(rgba[3], 1.0/255.0, 1.0) 
    rgba[3] = math.ceil(rgba[3] * 255.0)/255.0 
    output[i] = rgba 

# Save image to png 
imageio.imsave(args.file.split('.')[0] + '_rgbm.png', output) 

コードは正常に動作しますが、非常にゆっくりします。これはもちろん、python内で別々に各ピクセルを繰り返し処理することによって発生します。これは、大きな画像の場合には時間がかかります(3200x1600の画像の場合は約4:30分)。

私の質問は次のとおりです。私は後に何を達成するための効率的な方法がありますか?私は簡単にnumpyでベクトル化と放送を調べましたが、それらを私の問題にまだ適用する方法は見つけられていません。

編集:Mateen Ulhaqに

おかげで、私は解決策を見つけた:

# Convert image 
rgb = (1.0/7.0) * numpy.sqrt(image) 
alpha = numpy.amax(rgb, axis=2) 
alpha = numpy.clip(alpha, 1.0/255.0, 1.0) 
alpha = numpy.ceil(alpha * 255.0)/255.0 
alpha = numpy.reshape(alpha, (height, width, 1)) 
output = numpy.concatenate((rgb, alpha), axis=2) 

これは、ほんの数秒で完了します。

答えて

1

ライン

for i in numpy.ndindex(image.shape[:2]): 

だけですべてのピクセルを反復処理されます。おそらく、ループを取り除き、各行のコード( "ベクトル化")内のすべてのピクセルを処理するほうが速いでしょう。

rgb = (1.0/7.0) * np.sqrt(image) 
alpha = np.amax(rgb, axis=2) 
alpha = np.clip(alpha, 1.0/255.0, 1.0) 
alpha = np.ceil(alpha * 255.0)/255.0 
alpha = numpy.reshape(alpha, (height, width, 1)) 
output = np.concatenate((rgb, alpha), axis=2) 

私はそれも少しはっきりしていると思います。

+0

これは、「ValueError:連結ですべての入力配列が次元数が同じでなければならない」というエラーを生成します。 **編集:**それを修正しました(OPを参照)。 – tomfulghum

関連する問題