RGBA图片格式转换为RGB格式(解决convert转换的失真问题)
使用convert转换的问题
OpenCV 的 cv2.cvtColor(…, cv2.COLOR_BGRA2GRAY) 会直接忽略 Alpha 通道的含义,将它当作第四个颜色通道来处理。
转换公式如下:
gray = 0.114*255 + 0.587*0 + 0.299*0 ≈ 29
也就是说,即使 Alpha 为 0(完全透明),它也会参与这个公式,导致原本透明区域的像素值被错误地计算成一个“伪灰度值”。
我们保留透明区域为白色背景,解决代码如下(我们此处是转为了灰度图)
import cv2
import numpy as np# 读取RGBA图像
rgba_img = cv2.imread("data\\aug_data\\augmented_masks\\a1_aug0.png", cv2.IMREAD_UNCHANGED)# 创建一个与原图相同大小的白色 BGR 图像
adjust_img = np.ones((rgba_img.shape[0], rgba_img.shape[1], 3), dtype=np.uint8) * 255# 遍历像素点并根据alpha通道进行条件替换
for i in range(rgba_img.shape[0]):for j in range(rgba_img.shape[1]):val = rgba_img[i, j] # val 是一个长度为4的数组if val[3] == 255:adjust_img[i, j] = val[:3] # 复制 BGR 三通道
gray_mask = cv2.cvtColor(adjust_img, cv2.COLOR_BGR2RGB)
print(adjust_img.shape)
# 可选:显示或保存结果
cv2.imshow("Adjusted Image", gray_mask)