1 回答
TA贡献1864条经验 获得超6个赞
你的第一个代码块:
import matplotlib.pyplot as plt
plt.imsave('image.png', image, format='png', cmap='gray')
这是将图像保存为 RGB,因为cmap='gray'在向 imsave 提供 RGB 数据时会被忽略(请参阅pyplot 文档)。
您可以通过取三个波段的平均值将您的数据转换为灰度,您可以使用color.rgb2gray,或者我倾向于使用 numpy:
import numpy as np
from matplotlib import pyplot as plt
import cv2
img_rgb = np.random.rand(196,256,3)
print('RGB image shape:', img_rgb.shape)
img_gray = np.mean(img_rgb, axis=2)
print('Grayscale image shape:', img_gray.shape)
输出:
RGB image shape: (196, 256, 3)
Grayscale image shape: (196, 256)
img_gray现在是正确的形状,但是如果您使用 保存它plt.imsave,它仍然会写入三个波段,每个像素的 R == G == B。这是因为,我相信,一个 PNG 文件需要三个(或四个)波段。警告:我不确定这一点:我希望得到纠正。
plt.imsave('image_gray.png', img_gray, format='png')
new_img = cv2.imread('image_gray.png')
print('Loaded image shape:', new_img.shape)
输出:
Loaded image shape: (196, 256, 3)
避免这种情况的一种方法是将图像保存为 numpy 文件,或者确实将一批图像保存为 numpy 文件:
np.save('np_image.npy', img_gray)
new_np = np.load('np_image.npy')
print('new_np shape:', new_np.shape)
输出:
new_np shape: (196, 256)
您可以做的另一件事是保存灰度 png(使用imsave),然后只在第一个波段中读取:
finalimg = cv2.imread('image_gray.png',0)
print('finalimg image shape:', finalimg.shape)
输出:
finalimg image shape: (196, 256)
添加回答
举报