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

J. *_*vez 5 python rgb image grayscale python-3.x

在处理深度学习项目时,我有很多不需要颜色的图像。我救了他们:

import matplotlib.pyplot as plt

plt.imsave('image.png', image, format='png', cmap='gray')
Run Code Online (Sandbox Code Playgroud)

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

import cv2
img_rgb = cv2.imread('image.png')
print(img_rgb.shape)
(196,256,3)
Run Code Online (Sandbox Code Playgroud)

因此,即使我查看的图像是灰度图像,我仍然有 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')
Run Code Online (Sandbox Code Playgroud)

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

img_gr = cv2.imread('image_gray.png')
print(img_gr.shape)
(196,256,3)
Run Code Online (Sandbox Code Playgroud)

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

任何帮助,将不胜感激。

jms*_*usa 5

你的第一个代码块:

import matplotlib.pyplot as plt
plt.imsave('image.png', image, format='png', cmap='gray')
Run Code Online (Sandbox Code Playgroud)

这会将图像保存为 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)
Run Code Online (Sandbox Code Playgroud)

输出:

RGB image shape: (196, 256, 3)
Grayscale image shape: (196, 256)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

输出:

Loaded image shape: (196, 256, 3)
Run Code Online (Sandbox Code Playgroud)

避免这种情况的一种方法是将图像保存为 numpy 文件,或者实际上将一批图像保存为 numpy 文件:

np.save('np_image.npy', img_gray)
new_np = np.load('np_image.npy')
print('new_np shape:', new_np.shape)
Run Code Online (Sandbox Code Playgroud)

输出:

new_np shape: (196, 256)
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是保存灰度 png (使用imsave),但只在第一个波段中读取:

finalimg = cv2.imread('image_gray.png',0)
print('finalimg image shape:', finalimg.shape)
Run Code Online (Sandbox Code Playgroud)

输出:

finalimg image shape: (196, 256)
Run Code Online (Sandbox Code Playgroud)

  • 您可以在输入上使用 numpy.expand_dims(array, 2) 来添加额外的预期维度。 (2认同)