为神经网络训练重塑灰度图像——如何正确地做到这一点

Reshaping greyscale images for neural network training - how to do this correctly

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

以此图为例:

它是一张灰度图像,但当我这样做时

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")

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

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

  • No extra elements are included into the new matrix and no elements are excluded. Consequently, the product rows*cols*channels() must stay the same after the transformation.

而是使用 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 代码。)

这对我有用。

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 表示它将在前面添加一个新维度。