2017-12-24 29 views
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') 

答えて

1

溶液:

def fromjpg2int32(fnme): # convert jpg 2 int color array 
    img = imread(fnme) 
    return np.frombuffer(
     np.insert(img, 3, values=0, axis=2). 
      reshape(img.shape[0] * img.shape[1] * 4).tobytes(), 'I') 
関連する問題