使用cv2读取28*28灰度PNG得到4维numpy数组,如何获得期望的3维数组
问题原因
OpenCV的cv2.imread()接口默认使用cv2.IMREAD_COLOR参数读取图像,该模式下无论输入原图是否为灰度图,都会强制转换为3通道BGR格式的图像,因此你读取的每一张28*28灰度图都会得到形状为(28,28,3)的数组,全部堆叠后就得到了4维的(5103, 28, 28, 3)结果。
解决方法
方法1:读取时直接指定灰度模式(推荐)
在调用cv2.imread()时传入第二个参数cv2.IMREAD_GRAYSCALE,即可直接读取为单通道灰度数组,无需额外转换,效率最高。
修改后的完整代码如下:
import cv2 import glob import numpy as np X_data = [] files = glob.glob ("/content/gdrive/MyDrive/newtest/*.png") for myFile in files: # 指定灰度模式读取图像 image = cv2.imread (myFile, cv2.IMREAD_GRAYSCALE) X_data.append (image) print(np.array(X_data).shape) # 输出将为 (5103, 28, 28)
小提示:cv2.IMREAD_GRAYSCALE对应的数值常量为0,你也可以简写为cv2.imread(myFile, 0),效果完全一致
方法2:读取后手动转换为灰度图
如果你已经将图像读取为3通道格式,也可以通过颜色空间转换得到灰度图:
image = cv2.imread(myFile) # 将BGR3通道图转换为单通道灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
该方法适合需要同时使用彩色图和灰度图的场景,仅需灰度图的情况下优先使用方法1。
内容的提问来源于stack exchange,提问作者Libnah Pratheeth Bollam
相关产品推荐
相关产品推荐

