3840x2400单灰度图转伪RGB时numpy reshape报错如何解决
问题解决
错误根因
- 你读取的源图像是三通道RGB格式,不是单通道灰度格式:3840*2400分辨率的三通道图像总元素数为
3840 * 2400 * 3 = 27648000,和目标reshape形状的总元素数2400 * 1280 * 3 = 9216000数值不匹配,因此触发维度错误。 - 哪怕源图像只有灰度内容,只要存储时用了RGB格式,PIL默认读取都会返回三通道数组,不会自动转换为单通道。
修复代码
只需要在打开图像后强制转为单通道灰度模式即可,修正后代码如下:
from PIL import Image import numpy as np def TransTo1224(SourcePngFileName, DestPngFileName): #trans png file from 3840x2400 to 1280X2400(RGB) print('~~~~~~~') print(SourcePngFileName) # 打开图像后强制转单通道灰度模式 imgSrc = Image.open(SourcePngFileName).convert('L') dataSrc = np.array(imgSrc) # 此时dataSrc形状为(2400, 3840),总元素数刚好匹配目标形状 dataDest = dataSrc.reshape(2400,1280,3) imgDest = Image.fromarray(dataDest, 'RGB') imgDest.save(DestPngFileName) TransTo1224("./source/test1.png","./output/test1.png")
逻辑验证
numpy的reshape操作默认按行优先顺序排列元素,刚好可以把每行3个连续的灰度像素,依次映射为目标RGB图像同位置的R、G、B三个通道值,完全符合你显示驱动的像素映射要求。
内容的提问来源于stack exchange,提问作者Daphaz
相关产品推荐
相关产品推荐

