重塑灰度图像以进行神经网络训练 - 如何正确执行此操作

时间:2017-12-03 15:59:27

标签: image opencv neural-network reshape

如果您的图像是灰度级的话,我有一个关于卷积神经网络和训练图像处理的一般性问题。

以此图片为例:

enter image description here

它是灰度图像,但是当我做

image = cv2.imread("image.jpg")
print(image.shape)

我得到了

(1024, 1024, 3)

我知道opencv会自动为jpg图像创建3个通道。但是当谈到网络训练时,如果我可以在(1024,1024,1)中使用图像,那么计算效率会更高 - 就像许多MNIST教程所展示的那样。但是,如果我重新塑造这个:

image.reshape(1024, 1024 , 1)

然后尝试例如显示图像

plt.axis("off")
plt.imshow(reshaped_image)
plt.show()

我得到了

raise TypeError("Invalid dimensions for image data")

这是否意味着在网络培训不正确之前以这种方式重塑我的图像?我希望尽可能多地保留图像中的信息,但如果不需要,我不希望有这些额外的频道。

2 个答案:

答案 0 :(得分:2)

您收到错误的原因是reshape的输出与输入的元素数量不同。来自reshape的文档:

  
      
  • 新矩阵中不包含额外元素,也不排除任何元素。因此,产品行* cols * channels()必须在转换后保持不变。
  •   

相反,使用cvtColor将3通道BGR图像转换为1通道灰度图像:

在Python中:

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

或者在C ++中:

cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);

您还可以通过使用IMREAD_GRAYSCALE标志读取图像来完全避免转换:

image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
or
image = cv2.imread(image_path, 0)

(感谢@Alexander Reynolds获取Python代码。)

答案 1 :(得分:0)

这对我有用。

for image_path in dir:
        img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
        X.append(img)
    X = np.array(X)
    X = np.expand_dims(X, axis=3)

set axis = Int:根据您的数组,1表示它将在前面添加一个新尺寸。