如何将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
相关产品推荐
相关产品推荐

