2017-10-31 8 views
1

rgba(チャネルごとに8ビット)の画像を含む文字列を処理しているので、文字列の4文字ごとに1ピクセルがあり、各文字はそのピクセルの1チャンネルです例えば:文字列からn文字ごとにn文字を効率的に取得

#4x4 pixel image 
img_str = 'rgbargbargbargba' 

は今本当に速い使用しているアルファチャンネルを抽出し、はるかに大きなイメージを想像してみてください。

img_str_a = img_str[3::4] 
# result applying this to the 4x4 image would be 'aaaa' 

これは、1350x765の画像の周りを2ミリ秒で実行されます。しかし今はRGBチャンネルを抽出し、4x4画像で 'rgbrgbrgbrgb'のような文字列で終わらせる必要があります。私はこれを試しました:

img_str_rgb = ''.join('' if i%4 == 0 else char for i, char in enumerate(img_str, 1)) 

これはうまくいますが、同じ1350x765画像で約700msかかります。それは私がビデオを処理しているので、たくさんありますので、はるかに少ない時間が必要です。代わりに、単一の文字を結合する

+0

なぜ「numpy」を使用しないのですか? – Daniel

+0

あなたがしようとしていることを理解するには、さらに多くの入力と期待される出力が役立ちます。 –

+0

こんにちはダニエル、私はnumpyで試していない、いくつかのテストを行います。お返事ありがとう – ciclopez

答えて

2

、サブストリングに参加:

img_str_rbg = ''.join(img_str[j:j+3] for j in xrange(0, len(img_str), 4)) 

でも速く、あなたがzip、またはpython2 izipのために使用することができます。

from itertools import izip, imap 
img_str_rgb = ''.join(imap(''.join, izip(img_str[0::4], img_str[1::4], img_str[2::4]))) 

あなたのシナリオでは、numpyが優れている:

import numpy as np 
img = np.fromstring(img_str,dtype=np.byte).reshape(765,1350,4) 
img_alpha = img[:, :, 3] 
img_rgb = img[:, :, :3] 
+0

高速回答ありがとうございますが、それでも時間がかかりすぎます(1350x765画像の場合約220ms)。もしそれが可能であるかどうかわからない、約5msにする必要があります。 – ciclopez

+1

次に 'numpy'を使います。 – Daniel

+0

ありがとう!ナンシーははるかに高速です。 – ciclopez

関連する問題