为神经网络训练重塑灰度图像——如何正确地做到这一点
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 表示它将在前面添加一个新维度。
如果您的图像是灰度图像,我有一个关于用于训练的卷积神经网络和图像处理的一般性问题。
以此图为例:
它是一张灰度图像,但当我这样做时
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 表示它将在前面添加一个新维度。