lengong 发表于 2024-1-26 20:15

有没有大佬指点一下 opencv2 展示图片异常

原图
https://attach.52pojie.cn//forum/202401/26/195243o1mykgy7p1xaseyk.png?l
opencv2 读取后展示的图片
https://attach.52pojie.cn//forum/202401/26/200809ym29jzhm2iimux32.png?l
python代码
import cv2
img = cv2.imread("./xx.png",-1)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

~零度 发表于 2024-1-27 00:02

本帖最后由 ~零度 于 2024-1-27 09:18 编辑

opencv显示的图像是正确的,原图是存在透明色的,有一些软件会把透明色显示为白色,所以原图看起来是白色背景,有一些软件会把透明色显示为黑色,所以opencv显示出来是黑色背景的。想要让它显示为白色,需要将原图中的透明像素替换为白色像素。具体操作如下:

import cv2
import numpy as np

# 读取PNG图片,包括透明通道
image = cv2.imread('xx.png', cv2.IMREAD_UNCHANGED)
# 判断图片的通道数,如果为小于4则没有透明度通道,如果为4则有透明度通道
if image.shape == 4:
    alpha = image[:, :, 3] / 255.0# 透明通道,值越小透明度越大
    background = np.ones(image.shape[:2], dtype=np.uint8) * 255 * (1 - alpha)# 计算背景,透明部分像素值为0,不透明部分像素值为255
    image[:, :, 0] = background + image[:, :, 0] * alpha# 背景和前景叠加
    image[:, :, 1] = background + image[:, :, 1] * alpha
    image[:, :, 2] = background + image[:, :, 2] * alpha
    image = image[:, :, :3].astype(np.uint8) # 去除透明通道,并转换数据类型
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()



sai609 发表于 2024-1-27 08:57

库.show函数
页: [1]
查看完整版本: 有没有大佬指点一下 opencv2 展示图片异常