У меня есть 16-битные данные в следующем битовом формате LE:
В4 | В5 | С1 | С2 | С3 | Д1 | Д2 | Д3
А1 | А2 | А3 | А4 | А5 | Б1 | Б2 | Б3
Каждая буква представляет одну категорию данных, которую я хочу извлечь и сделать отдельное изображение.
Используя этот код Python, мне удалось создать изображение из слоя A, но мне не удалось извлечь B, C и D.
# using numpy and PIL
data = np.fromfile(i, dtype=np.dtype('<u2')).reshape(size, size)
A = ((data & 31) - 1).astype('uint8')
image_A = Image.fromarray(A)
Кто-нибудь знает, как это будет работать?






Используя словарь битовых масок и некоторые биты, чтобы вычислить необходимые сдвиги:
import numpy as np
from PIL import Image
def extract_mask(arr, mask):
# bit twiddling magic (count trailing zeros)
shift = int(np.log2(mask & -mask))
return (arr & mask) >> shift
masks = {
"A": 0b000_000_00000_11111,
"B": 0b000_000_11111_00000,
"C": 0b000_111_00000_00000,
"D": 0b111_000_00000_00000,
}
filename = "512x512.buffer"
size = 512
data = np.fromfile(filename, dtype = "<u2").reshape(size, size)
images = {
k: Image.fromarray(extract_mask(data, mask).astype(np.uint8))
for k, mask in masks.items()
}
Это кажется простым способом сделать это:
import numpy as np
from PIL import Image
# Load image as 16-bit LE and reshape
size = 512
data = np.fromfile('512x512.buffer', dtype='<u2').reshape(size, size)
A = Image.fromarray(((data ) & 31).astype(np.uint8))
B = Image.fromarray(((data >> 5) & 31).astype(np.uint8))
C = Image.fromarray(((data >> 10) & 7).astype(np.uint8))
D = Image.fromarray(((data >> 13) & 7).astype(np.uint8))
Отлично работаете, спасибо! Единственное отличие от моего результата A состоит в том, что ваши значения на 1 выше (255 => 0, 0 => 1), но это не проблема, на самом деле совсем наоборот.