如果您的图像是灰度级的话,我有一个关于卷积神经网络和训练图像处理的一般性问题。
以此图片为例:
它是灰度图像,但是当我做
时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")
这是否意味着在网络培训不正确之前以这种方式重塑我的图像?我希望尽可能多地保留图像中的信息,但如果不需要,我不希望有这些额外的频道。
答案 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表示它将在前面添加一个新尺寸。