Python 灰度图像np.array维数的改变

Python 灰度图像np.array维数的改变,python,numpy,keras,Python,Numpy,Keras,我有以下代码来加载图像: img=imread(os.path.join('./Faces/','10.png')) 打印(图像形状) img=np.平均值(img,轴=2) img=img.astype(int) 打印(图像形状) 此代码的输出如下所示: (200, 180, 3) (200, 180) 我知道我正在将RGB层平均化为灰度值,但我用shape(200280,1)定义了Keras输入层。有没有办法把形状改成这个?上面输出的两种形状的矩阵在功能上有什么区别吗?您可以使用nump

我有以下代码来加载图像:

img=imread(os.path.join('./Faces/','10.png'))
打印(图像形状)
img=np.平均值(img,轴=2)
img=img.astype(int)
打印(图像形状)
此代码的输出如下所示:

(200, 180, 3)
(200, 180)

我知道我正在将RGB层平均化为灰度值,但我用shape
(200280,1)
定义了Keras输入层。有没有办法把形状改成这个?上面输出的两种形状的矩阵在功能上有什么区别吗?

您可以使用numpy中的
expand_dims
功能(请参阅)

在您的情况下,它的工作原理如下:

img = img.astype(int)
print(img.shape)
# Prints (100, 100)

img = np.expand_dims(img, axis=2)
print(img.shape)
# Prints (100, 100, 1)

您可以在numpy中使用
expand_dims
功能(请参阅)

在您的情况下,它的工作原理如下:

img = img.astype(int)
print(img.shape)
# Prints (100, 100)

img = np.expand_dims(img, axis=2)
print(img.shape)
# Prints (100, 100, 1)

你不应该把频道平均化。RGB通道之间有一种特殊的平衡,可以将图片转换为灰度,并且每个通道不方便达到0.33%。是这样的:

((0.3*R) + (0.59*G) + (0.11*B))
我建议您使用:

import cv2 

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
然后添加一个维度:

img = img[..., np.newaxis]


功能上的区别是,很明显,如果你把它变成灰度,你的CNN将看不到颜色。因此,它将无法使用此信息进行分类。

您不应该对通道进行平均。RGB通道之间有一种特殊的平衡,可以将图片转换为灰度,并且每个通道不方便达到0.33%。是这样的:

((0.3*R) + (0.59*G) + (0.11*B))
我建议您使用:

import cv2 

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
然后添加一个维度:

img = img[..., np.newaxis]


功能上的区别是,很明显,如果你把它变成灰度,你的CNN将看不到颜色。因此,它将无法使用此信息进行分类。

谢谢您的回答。这一切都是关于结构,而不是关于颜色,所以在我的情况下,失去颜色是很好的。我不知道你提到的具体的灰度平衡。很高兴有人指出这一点。谢谢!很高兴我能帮忙。我看到你已经接受了另一个答案,但是我希望你会考虑把彩色图像转换成灰度级。你真的不应该只是总结渠道。这正是我现在做的,尼古拉斯,我接受了两个答案(先是你的,然后是另一个)。但是我不知道只有一个“被接受”的答案,所以你的答案是“不被接受”,现在我明白了,谢谢你的回答。这一切都是关于结构,而不是关于颜色,所以在我的情况下,失去颜色是很好的。我不知道你提到的具体的灰度平衡。很高兴有人指出这一点。谢谢!很高兴我能帮忙。我看到你已经接受了另一个答案,但是我希望你会考虑把彩色图像转换成灰度级。你真的不应该只是总结渠道。这正是我现在做的,尼古拉斯,我接受了两个答案(先是你的,然后是另一个)。但我不知道只有一个“被接受”的答案,所以你的答案是“不被接受”,现在我明白了