Python中如何将Matplotlib绘图保存为单通道黑白PNG并转Numpy数组
解决Matplotlib生成黑白图保存后读取为单通道数组的问题
你遇到的问题是因为Matplotlib默认将PNG保存为RGBA四通道格式(包含透明度通道),即使是黑白图像也会保留四个通道。下面提供两种规范的解决方式,无需手动循环提取通道:
方案一:保存时直接生成单通道灰度图
可以在保存阶段就将图像转换为灰度模式,避免后续处理:
import matplotlib.pyplot as plt import numpy as np text = 'Text' plt.text(0.4, 0.4, text) plt.axis('off') # 获取当前画布的RGBA像素数组 fig = plt.gcf() fig.canvas.draw() rgba_array = np.array(fig.canvas.renderer.buffer_rgba()) # 用ITU-R BT.601标准公式将RGB转换为单通道灰度 gray_array = np.dot(rgba_array[..., :3], [0.299, 0.587, 0.114]) # 保存为单通道灰度PNG plt.imsave('Image_gray.png', gray_array, cmap='gray', format='png')
之后读取这个文件时,直接得到的就是单通道数组:
import matplotlib.image as ima gray_image = ima.imread('Image_gray.png') print(gray_image.shape) # 输出类似 (height, width),为单通道
方案二:读取RGBA后转换为单通道灰度
如果已经保存了RGBA格式的图像,可以在读取后快速转换为单通道:
方法1:用Numpy矩阵运算转换
利用灰度转换公式直接计算,无需额外库:
import numpy numpy as np import matplotlib.image as ima image = ima.imread('Image.png') # 忽略alpha通道,将RGB通道转换为灰度 gray_image = np.dot(image[..., :3], [0.299, 0.587, 0.114]) print(gray_image.shape) # 输出单通道形状
方法2:用PIL库快速转换
借助PIL的convert('L')方法直接转为灰度模式,代码更简洁:
from PIL import Image import numpy as np # 打开图像并转为灰度模式 img = Image.open('Image.png').convert('L') gray_array = np.array(img) print(gray_array.shape) # 输出单通道形状
内容的提问来源于stack exchange,提问作者AliStonks
相关产品推荐
相关产品推荐

