You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将plt.imshow()的输出转换为NumPy数组?含Viridis色图场景

实现方法

你可以通过两种方式获取Viridis色图映射后的NumPy数组,直接映射的方式更高效且无额外画布元素干扰:

方法一:直接用色图映射灰度值

不需要先绘制图像,直接通过Matplotlib的色图对象将灰度数组转换为对应Viridis色的RGB数组:

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

# 加载彩色图像并转为灰度数组
img = Image.open("your_image.jpg").convert("L")
gray_array = np.array(img)

# 创建Viridis色图映射器,归一化灰度值到[0,1]范围
norm = plt.Normalize(vmin=gray_array.min(), vmax=gray_array.max())
viridis_cmap = plt.cm.viridis
# 映射得到RGBA数组,若只需要RGB则取前3通道
viridis_rgba = viridis_cmap(norm(gray_array))
viridis_rgb = (viridis_rgba[:, :, :3] * 255).astype(np.uint8)  # 转为0-255的uint8格式

# viridis_rgb就是你需要的NumPy数组,可直接用于后续处理

方法二:从已绘制的画布提取像素

如果已经完成图像显示,可从Matplotlib的画布中提取像素数据(注意会包含画布的边框、坐标轴等元素,若只需要图像区域需额外裁剪):

# 假设你已经绘制了图像:
fig, ax = plt.subplots()
ax.imshow(gray_array, cmap="viridis")
plt.axis("off")  # 关闭坐标轴避免干扰

# 从画布提取像素
fig.canvas.draw()
# 获取画布的RGB数组,形状为(height, width, 3)
canvas_rgb = np.array(fig.canvas.renderer.buffer_rgba())[:, :, :3]

# canvas_rgb即为提取到的数组,若需要裁剪掉画布边缘,可根据图像位置调整切片

两种方法中,方法一直接对灰度数组进行色图映射,得到的结果更纯净,适合后续处理;方法二则适合已经完成可视化后直接提取画布内容的场景。

内容的提问来源于stack exchange,提问作者Key76

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:20:40