2014-07-01 5 views
2

У меня есть массив, который я могу обрабатывать как это:Quickest способ преобразовать массив байтов 1D в 2D Numpy массив

ba = bytearray(fh.read())[32:] 
size = int(math.sqrt(len(ba))) 

я могу сказать, если пиксель должен быть черным или белым дали

iswhite = (ba[i]&1)==1 

Как быстро преобразовать массив 1D байтов в массив 2D numpy с длиной строки size и белые пиксели для (ba[i]&1)==1 и черные для других? Я создаю массив так:

im_m = np.zeros((size,size,3),dtype="uint8) 

ответ

3
import numpy as np 

# fh containts the file handle 

# go to position 32 where the image data starts 
fh.seek(32) 

# read the binary data into unsigned 8-bit array 
ba = np.fromfile(fh, dtype='uint8') 

# calculate the side length of the square array and reshape ba accordingly 
side = int(np.sqrt(len(ba))) 
ba = ba.reshape((side,side)) 

# toss everything else apart from the last bit of each pixel 
ba &= 1 

# make a 3-deep array with 255,255,255 or 0,0,0 
img = np.dstack([255*ba]*3) 
# or 
img = ba[:,:,None] * np.array([255,255,255], dtype='uint8') 

Есть несколько способов сделать последний шаг. Просто будьте осторожны, вы получите тот же тип данных (uint8), если вам это нужно.

+0

Спасибо так много, как раз то, что мне нужно было –

+0

Ну у меня немного вопроса, вот полный код: http://pastebin.com/qX69JxpZ Я пытаюсь экспортировать в JPG, но Я получаю сообщение об ошибке «Максимальное поддерживаемое измерение изображения составляет 65500 пикселей» –

+0

Структура представляет собой единственный внешний массив с массивом внутри него пиксельных массивов (3 числа) –

Смежные вопросы