我正在处理一个包含rgba图像的字符串(每个通道8位),因此字符串的每四个字符就是一个像素,每个字符是该像素的一个通道,例如:
#4x4 pixel image
img_str = 'rgbargbargbargba'
现在想象一个更大的图像,使用以下方法提取alpha通道非常快:
img_str_a = img_str[3::4]
# result applying this to the 4x4 image would be 'aaaa'
对于1350x765图像,这在大约2ms内执行。但现在我需要提取RGB通道,以4x4图像的'rgbrgbrgbrgb'字符串结尾。我试过这个:
img_str_rgb = ''.join('' if i%4 == 0 else char for i, char in enumerate(img_str, 1))
哪个有效,但相同的1350x765图像大约需要700毫秒。这是很多,因为我正在处理视频,所以我需要更低的时间。
答案 0 :(得分: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]