如何获取plt.imshow()带参数渲染的无轴图像的numpy数组?
解决imshow渲染后图像转numpy数组的问题
方法一:直接从Matplotlib画布提取渲染后的数组
这种方法能直接获取和你看到的fig(ii)完全一致的像素数组,包括无坐标轴、边框的状态,以及cmap、vmin/vmax的映射效果:
import matplotlib.pyplot as plt import numpy as np # 假设Equalized是你的原始二维数组 # Equalized = ... # 创建画布并绘制图像,关闭坐标轴与边框 fig, ax = plt.subplots() ax.imshow(Equalized, cmap='gray', vmin=0.55, vmax=0.80) ax.axis('off') # 隐藏坐标轴 for spine in ax.spines.values(): spine.set_visible(False) # 隐藏边框 # 渲染画布并提取像素数据 fig.canvas.draw() # 获取RGB格式的像素数组,形状为(高度, 宽度, 3) rgba_data = fig.canvas.tostring_rgb() pixel_array = np.frombuffer(rgba_data, dtype=np.uint8).reshape( fig.canvas.get_height(), fig.canvas.get_width(), 3 ) # 转换为单通道灰度数组(可选) gray_array = np.mean(pixel_array, axis=2).astype(np.uint8) plt.close(fig) # 释放资源
如果需要提取的数组尺寸和原始Equalized一致,可提前设置画布尺寸匹配原始图像:
h, w = Equalized.shape dpi = 100 fig, ax = plt.subplots(figsize=(w/dpi, h/dpi), dpi=dpi) # 后续绘制、提取步骤同上
方法二:手动复现imshow的颜色映射逻辑
如果不需要画布渲染的额外空白部分,可以手动实现vmin/vmax截断和cmap映射,直接生成和imshow显示效果一致的数组:
import numpy as np # 1. 截断原始数组到[vmin, vmax]范围 clipped_array = np.clip(Equalized, a_min=0.55, a_max=0.80) # 2. 归一化到[0, 1]区间 normalized_array = (clipped_array - 0.55) / (0.80 - 0.55) # 3. 转换为0-255的灰度像素值(匹配gray cmap的映射) gray_array = (normalized_array * 255).astype(np.uint8)
这种方法生成的数组尺寸和原始Equalized完全一致,且完全复现了imshow的视觉效果,适合后续的数组处理流程。
内容的提问来源于stack exchange,提问作者Key76
相关产品推荐
相关产品推荐

