如何将RGB数组映射为16×16网格并绘制归一化RGB图?
如何将RGB数组绘制成16×16网格图
首先你需要修正颜色生成代码的一个小问题:np.linspace需要指定生成256个点,否则默认只生成50个。另外可以用更高效的numpy原生操作替代生成器转换RGB,避免循环开销。
接下来,核心步骤是将rgb_colors重塑为16×16×3的三维数组(对应网格的行、列、RGB通道),然后用matplotlib的imshow直接绘制——因为imshow支持直接输入RGB格式的图像数组。
完整实现代码
import numpy as np import matplotlib.pyplot as plt # 生成256个均匀分布的RGB整数(0到0xFFFFFF) all_colors_int = np.linspace(0, (255 << 16) + (255 << 8) + 255, 256, dtype=np.uint32) # 用numpy原生操作转换为RGB数组,比生成器更高效 r = ((all_colors_int >> 16) & 255).astype(np.uint8) g = ((all_colors_int >> 8) & 255).astype(np.uint8) b = (all_colors_int & 255).astype(np.uint8) rgb_colors = np.stack([r, g, b], axis=1) # 将RGB数组重塑为16×16×3的网格形状 rgb_grid = rgb_colors.reshape(16, 16, 3) # 绘制网格图 plt.figure(figsize=(8, 8)) # 关闭坐标轴,让网格更清晰 plt.axis('off') # imshow接受0-255的uint8类型RGB数组,直接显示 plt.imshow(rgb_grid) plt.show()
关键说明
- 重塑数组:
reshape(16,16,3)把一维的256个RGB元素转换成16行16列的网格,每个单元格对应一个RGB颜色。 imshow的输入要求:如果是uint8类型的RGB数组,数值范围0-255直接可用;如果是float类型则需要归一化到0-1区间。- 你定义的
data数组其实不需要用到,因为我们直接用颜色数组的位置对应网格的行列,不需要额外的数值数据映射颜色。
如果需要带网格线的效果,可以额外添加:
# 添加网格线(可选) plt.grid(True, color='white', linewidth=1) plt.gca().set_xticks(np.arange(-0.5, 16, 1)) plt.gca().set_yticks(np.arange(-0.5, 16, 1))
内容的提问来源于stack exchange,提问作者doomsk
相关产品推荐
相关产品推荐

