python小工具,float数组内的数据块用伪彩色着色生成图片
import numpy as np
from PIL import Image, ImageDraw, ImageFont, ImageOps
# 读取二进制文件
file_path = 'float_data.bin' # 替换为你的文件路径
with open(file_path, 'rb') as f:
data = f.read()
# 将二进制数据转换为float数组(小端模式)
float_array = np.frombuffer(data, dtype='<f4') # '<f4'表示小端32位浮点数
# 检查数据大小是否正确
expected_size = 1024 * 1024
if len(float_array) != expected_size:
raise ValueError(f"文件大小不匹配,期望{expected_size}个浮点数,实际得到{len(float_array)}个")
# 重塑为1024x1024的二维数组
image_data = float_array.reshape((1024, 1024))
binary_image = image_data.astype(np.uint8)
binary_image.tofile("u8_data.bin")
tmp_mul = 10
binary_image *= tmp_mul
# 创建灰度图像
image = Image.fromarray(binary_image, mode='L')
# 定义颜色映射(蓝→绿→红)
pseudo_color_img = ImageOps.colorize(
image,
black=(0, 0, 255), # 最小值(0)映射为蓝色
mid=(0, 255, 0), # 中间值(128)映射为绿色
white=(255, 0, 0), # 最大值(255)映射为红色
midpoint=128 # 中间点位置
)
draw = ImageDraw.Draw(pseudo_color_img)
# 定义块大小和 dim 参数
block_size = 128 # 1024 / 8 = 128
dim_x, dim_sx = 2, 4
# 计算块的数量
num_blocks = 8 # 1024 / 128 = 8 blocks per dimension
# 设置字体
font = ImageFont.truetype("DejaVuSans.ttf", size=20) # 需要指定字体文件路径
# 遍历每个块
for i in range(num_blocks):
for j in range(num_blocks):
# 获取当前块的起始位置
start_x = i * block_size
start_y = j * block_size
# 取出块正中间的 val(位置 (64,64))
val = binary_image[start_x + 64, start_y + 64]
val = val // tmp_mul
# 计算 x, y, sx
x_sx = dim_x * dim_sx
y = val // x_sx
x = (val % x_sx) // dim_sx
sx = (val % x_sx) % dim_sx
# print(f"Block ({i}, {j}): val={val}, x={x}, y={y}, sx={sx}")
# 在块中间绘制 x,y,sx
text = f"{y},{x},{sx}"
text_position = (start_y + 64 - 20, start_x + 64 - 10) # 调整位置居中
draw.text(text_position, text, fill=255, font=font) # 白色文字
# 保存或显示图片
pseudo_color_img.save('float_data.png')
浙公网安备 33010602011771号