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')
posted @ 2025-05-18 21:33  园友1683564  阅读(19)  评论(0)    收藏  举报