灰度图像转numpy数组出现(.., .., 3)三通道形状该如何解决?
问题原因
你现有代码存在两个核心问题:
Image.convert()方法不会修改原图像对象,而是返回转换后的新图像对象,你没有接住返回值,相当于转换操作没有生效"1"是二值图像模式,如果你要得到单通道灰度图,应该使用参数"L"
修复方案
方案1:PIL阶段直接输出单通道数组(性能最优)
修改你的导入代码如下,可直接生成符合要求的(H, W)形状数组:
from PIL import Image import numpy as np img = Image.open(Filepath) # 接住convert返回值,用L模式转换为单通道灰度 img = img.convert("L") print(np.array(img).shape) # 输出为 (H, W)
方案2:对已生成的三通道同值灰度数组做转换
如果已经拿到了(H, W, 3)形状、三个通道值完全相同的数组,可以用numpy切片直接取第一个通道,该操作是O(1)时间复杂度,不会复制数据:
import numpy as np # 假设arr是你拿到的三通道灰度数组 if arr.ndim == 3 and arr.shape[-1] == 3: # 直接取第一个通道,所有[x,x,x]都会转为x arr = arr[..., 0]
如果不确定三个通道是否完全一致,需要做兼容处理的话,可以取三个通道的均值,性能同样很高:
if arr.ndim == 3 and arr.shape[-1] == 3: arr = arr.mean(axis=-1).astype(arr.dtype)
内容的提问来源于stack exchange,提问作者Sxmple
相关产品推荐
相关产品推荐

