如何在 Python 中将 RGB 图像转换为灰度图像?

新手上路,请多包涵

我正在尝试使用 matplotlib 读取 RGB 图像并将其转换为灰度。

在 matlab 中我使用这个:

 img = rgb2gray(imread('image.png'));

matplotlib 教程 中,他们没有涵盖它。他们只是在图像中阅读

import matplotlib.image as mpimg
img = mpimg.imread('image.png')

然后他们对数组进行切片,但这与我所理解的将 RGB 转换为灰度不同。

 lum_img = img[:,:,0]

我很难相信 numpy 或 matplotlib 没有将 rgb 转换为灰色的内置函数。这不是图像处理中常见的操作吗?

我编写了一个非常简单的函数,可在 5 分钟内处理使用 imread 导入的图像。这是非常低效的,但这就是为什么我希望内置一个专业的实现。

Sebastian 改进了我的功能,但我仍然希望找到内置的功能。

matlab 的 (NTSC/PAL) 实现:

 import numpy as np

def rgb2gray(rgb):

    r, g, b = rgb[:,:,0], rgb[:,:,1], rgb[:,:,2]
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

    return gray

原文由 waspinator 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 792
2 个回答

Pillow 做怎么样:

 from PIL import Image
img = Image.open('image.png').convert('L')
img.save('greyscale.png')


如果输入图像中存在 alpha(透明)通道并且应该保留,请使用模式 LA

 img = Image.open('image.png').convert('LA')


使用 matplotlib 和 公式

Y' = 0.2989 R + 0.5870 G + 0.1140 B

你可以这样做:

 import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

def rgb2gray(rgb):
    return np.dot(rgb[...,:3], [0.2989, 0.5870, 0.1140])

img = mpimg.imread('image.png')
gray = rgb2gray(img)
plt.imshow(gray, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
plt.show()

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

您还可以使用 scikit-image ,它提供了一些函数来转换 ndarray 中的图像,例如 rgb2gray

 from skimage import color
from skimage import io

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

注意:此转换中使用的权重针对现代 CRT 荧光粉进行了校准:Y = 0.2125 R + 0.7154 G + 0.0721 B

或者,您可以通过以下方式读取灰度图像:

 from skimage import io
img = io.imread('image.png', as_gray=True)

原文由 yangjie 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题