如何将RGB图像(3通道)转换为灰度(1通道)并保存?

使用深度学习项目,我有很多图像,不需要颜色。我救了他们做:


import matplotlib.pyplot as plt


plt.imsave('image.png', image, format='png', cmap='gray')

但是后来当我检查图像的形状时,结果是:


import cv2

img_rgb = cv2.imread('image.png')

print(img_rgb.shape)

(196,256,3)

所以即使我查看的图像是灰度的,我仍然有 3 个颜色通道。我意识到我必须做一些代数运算才能将这 3 个通道转换为 1 个单通道。


我已经尝试了线程“如何在 Python 中将 RGB 图像转换为灰度? ”中描述的方法,但我很困惑。


例如,何时使用以下方法进行转换:


from skimage import color

from skimage import io

img_gray = color.rgb2gray(io.imread('image.png'))

plt.imsave('image_gray.png', img_gray, format='png')

但是,当我加载新图像并检查其形状时:


img_gr = cv2.imread('image_gray.png')

print(img_gr.shape)

(196,256,3)

我在该线程上尝试了其他方法,但结果相同。我的目标是获得具有 (196,256,1) 形状的图像,考虑到卷积神经网络的计算强度会降低多少。


偶然的你
浏览 551回答 1
1回答

慕尼黑的夜晚无繁华

你的第一个代码块:import matplotlib.pyplot as pltplt.imsave('image.png', image, format='png', cmap='gray')这是将图像保存为 RGB,因为cmap='gray'在向 imsave 提供 RGB 数据时会被忽略(请参阅pyplot 文档)。您可以通过取三个波段的平均值将您的数据转换为灰度,您可以使用color.rgb2gray,或者我倾向于使用 numpy:import numpy as npfrom matplotlib import pyplot as pltimport cv2img_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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python