使用 numpy 将 BGR 图像转换为灰度

Posted

技术标签:

【中文标题】使用 numpy 将 BGR 图像转换为灰度【英文标题】:Converting BGR image to grayscale using numpy 【发布时间】:2021-11-24 04:11:23 【问题描述】:

我有一个小问题希望你们能帮助我。我知道要在不使用 numpy 的情况下将 RGB 图像转换为灰度,我们可以使用:

img = cv2.imread(input_file, cv2.IMREAD_COLOR)
r, g, b = img[:, :, 0], img[:, :, 1], img[:, :, 2]
img_gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

现在我想通过 BGR 比例读取图像,然后将该 BGR 图像转换为灰度而不使用 cv2.COLOR_BGR2GRAY,我该如何使用上面的类似代码来做到这一点?

【问题讨论】:

我不明白。你已经不用COLOR_BGR2RGB了? 已编辑。为错误的输入道歉。 我还是不明白。你的代码也没有使用cv2.COLOR_BGR2GRAY - 你已经实现了你的既定目标,确定吗? 我认为上面的代码是读取RGB图像并将其转换为灰度。实际上我想知道 BGR 到灰度的相同方式。 【参考方案1】:

OpenCV 将按照 BGR 顺序将文件读​​入内存,即使它在磁盘上是 RGB。这就是它的工作方式。因此,您需要将第二行更改为:

b, g, r = img[:, :, 0], img[:, :, 1], img[:, :, 2]

然后您的第三行将正常工作,尽管您可能希望使用以下方法制作无符号 8 位整数:

img_gray = (0.2989 * r + 0.5870 * g + 0.1140 * b).astype(np.uint8)

顺便说一句,您实际上可以像这样使用numpy 更快地做到这一点:

import numpy as np

grey = np.dot(img[...,::-1], [0.299, 0.587, 0.114]).astype(np.uint8)

【讨论】:

以上是关于使用 numpy 将 BGR 图像转换为灰度的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 matplotlib/numpy 将数组保存为灰度图像?

[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)

在 DLIB 中将 RGB 图像转换为灰度图像

将numpy数组转换为rgb图像

如何在保持分辨率的同时将2D float numpy数组无损保存到灰度图像中?

opencv学习-第三节:图像色彩空间转换和保存函数