不使用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
相关产品推荐
相关产品推荐

