在处理深度学习项目时,我有很多不需要颜色的图像。我救了他们:
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 个单通道。
我已经尝试过线程“ How can I convert an RGB image into grayscale in Python? ”中描述的方法,但我很困惑。
例如,何时使用以下方法进行转换:
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) 形状的图像,考虑到卷积神经网络的计算密集度要低得多。
任何帮助,将不胜感激。
原文由 J. Devez 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的第一个代码块:
这是将图像保存为 RGB,因为
cmap='gray'
在向 imsave 提供 RGB 数据时被忽略(参见 pyplot 文档)。您可以通过取三个波段的平均值将数据转换为灰度,或者像您一样使用
color.rgb2gray
,或者我倾向于使用 numpy:输出:
img_gray
现在是正确的形状,但是如果你使用plt.imsave
保存它,它仍然会写三个波段,每个像素 R == G == B。这是因为,我相信 PNG 文件需要三个(或四个)波段。警告:我不确定这一点:我希望得到纠正。输出:
避免这种情况的一种方法是将图像保存为 numpy 文件,或者将一批图像保存为 numpy 文件:
输出:
您可以做的另一件事是保存灰度 png(使用
imsave
),但仅在第一个波段中读取:输出: