如何从 16 位 LE 数据中提取这些位?
How can I extract those bits from 16bit LE data?
我有 16 位数据,采用以下 LE 位格式:
B4 | B5 | C1 | C2 | C3 | D1 | D2 | D3
A1 | A2 | A3 | A4 | A5 | B1 | B2 | B3
每个字母代表一个数据类别,我想从中提取并制作单独的图像。
使用这个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))
我有 16 位数据,采用以下 LE 位格式:
B4 | B5 | C1 | C2 | C3 | D1 | D2 | D3
A1 | A2 | A3 | A4 | A5 | B1 | B2 | B3
每个字母代表一个数据类别,我想从中提取并制作单独的图像。
使用这个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))