0
私はこのアプローチ次の24ビット配列にJPEGファイルを読み取る画像ヒストグラムを生成し、numpy.histogramで処理する32ビットnumpyのいずれかに変換している:パイソンJPEGファイル24から32ビット変換
-
numpyのアレイ状に
- 読み出しファイル: - (W、H、3)チャンクサイズのバイトに>
img=imread(file,'RGB')
- 変換する: - 構造体イテレータを使用してアンパック>
by=img.tobytes()
- - * hでW * 3>
struct.iter_unpack('<3B',by)
- intに変換 - >
int.from_bytes(c, byteorder='big')
このアプローチと(など* hで、3、Wに再形成)私が試した他の人に問題がイテレータ遅延で、私の質問は:
が直接あり方法これをPython イテレータなしで行うには、またはそれを行うには単純なC関数を書くべきですか?
def jpeg2colors(fnme):
return np.asarray(
[int.from_bytes(c, byteorder='big')
for c in struct.iter_unpack('<3B', imread(fnme).tobytes())])
他の遅い実装:
def conversionSLOW(fnme): # reshape to (w*h,3)
img = imread(fnme, mode='RGB')
return np.array([int.from_bytes(c, byteorder='big')
for c in img.reshape((img.shape[0] * img.shape[1], 3))])
def conversionbyte01(fnme): # int iteration -> closer to fastests
by = imread(fnme, mode='RGB').tobytes()
return np.asanyarray([int.from_bytes(by[c:c + 3], byteorder='big')
for c in range(0, len(by) - 3, 3)],
dtype=np.int32)
def conversionbyte02(fnme):
img = imread(fnme)
return np.array([int.from_bytes(c, byteorder='big') for c in img.reshape(img.shape[0] * img.shape[1], 3)])
def conversionbyte03(fnme):
img = imread(fnme)
return np.array([int.from_bytes(img.reshape(img.shape[0] * img.shape[1], 3), byteorder='big')])
EDIT1:
は(W、H 4)作成解決策を見つけたnumpyの配列とコピー画像を読み取り、残りは簡単かつ迅速です(最速の反復溶液からX40改善)
def fromJPG2_2int32_stbyst(fnme): # step by step
img = imread(fnme)
# create a (w,h,4) array and copy original
re = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.uint8)
re[:, :, :-1] = img
# lineup to a byte structure ready for ' frombuffer'
re1 = re.reshape(img.shape[0] * img.shape[1] * 4)
by = re1.tobytes()
# got it just convert to int
cols = np.frombuffer(by, 'I')
return cols
def fromJPG2_2int32_v0(fnme): # more compact & efficient
img = imread(fnme)
re = np.zeros((img.shape[0], img.shape[1], 4), dtype=np.uint8)
re[:, :, :-1] = img
return np.frombuffer(re.reshape(img.shape[0] * img.shape[1] * 4).tobytes(), 'I')
def fromJPG2_2int32(fnme): # even better using numpy.c_[]
img = imread(fnme)
img = np.c_[img, np.zeros((img.shape[0], img.shape[1], 1), dtype=np.uint8)]
return np.frombuffer(img.reshape(img.shape[0] * img.shape[1] * 4).tobytes(), 'I')