You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用cv2.COLOR_BGR2GRAY 用Numpy将BGR图像转为灰度图的方法

问题解答

你给出的示例代码本身存在逻辑误区:cv2.imread 使用 cv2.IMREAD_COLOR 参数读取图像时,默认返回的就是 BGR通道顺序 的数组,你原来的代码里把第0通道识别为R通道的写法是错误的。

灰度转换的权重公式是固定的,和通道读取顺序无关,只需要把对应通道的数值代入公式即可:

灰度值 = 0.2989 * R通道值 + 0.5870 * G通道值 + 0.1140 * B通道值

实现代码

import cv2
import numpy as np

# 读入BGR格式图像
img = cv2.imread(input_file, cv2.IMREAD_COLOR)
# 按顺序拆分BGR三个通道
b, g, r = img[:, :, 0], img[:, :, 1], img[:, :, 2]
# 代入灰度公式计算
img_gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

# 可选步骤:转换为uint8类型,和OpenCV原生接口输出格式完全对齐
img_gray = img_gray.astype(np.uint8)

无误差对齐原生接口的优化写法

如果需要100%匹配cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)的输出结果,可以用OpenCV官方使用的整数运算版本,避免浮点计算带来的微小误差:

img_gray = (r * 299 + g * 587 + b * 114) // 1000
img_gray = img_gray.astype(np.uint8)

内容的提问来源于stack exchange,提问作者hhhhh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 23:27:01