opencv读写png

文章详细介绍了如何使用OpenCV和numpy处理PNG图像的通道,包括创建带有alpha通道的透明图像,以及读取时如何保留alpha通道。在没有alpha通道时,OpenCV的通道顺序为BGR,添加alpha后变为BGRA。读取4通道PNG图像时,需使用cv2.IMREAD_UNCHANGED参数来保持alpha通道不变。
摘要由CSDN通过智能技术生成

[1] 测试了怎么手动加 alpha 通道设置透明度后,用 PIL.Image 存 png,通道顺序是 RGBA。这里测试用 opencv 读、写 1、3、4 通道的 png。

png 可以只存 3 通道的,即不要 alpha,也可以加上 alpha。而无 alpha 时 opencv 的通道顺序是 BGR,那加上 alpha 之后呢?

3-channel

import numpy as np
import cv2

# 写
bgr = np.zeros((28, 256, 3), dtype=np.uint8)
bgr[:, :, 0] = 255 # blue
cv2.imwrite("blue.png", bgr) # 3 通道,BGR
a = np.zeros((28, 256, 1), dtype=np.uint8) # alpha 通道
for i in range(256): # 渐变透明度
    a[:, i] = i
bgra = np.concatenate((bgr, a), axis=2) # BGRA 顺序
print(bgra.shape) # (28, 256, 4)
cv2.imwrite("blue_bgra.png", bgra) # 4 通道,BGRA

# 读
bgr_in = cv2.imread("blue.png") # 3 通道普通读
bgra_in = cv2.imread("blue_bgra.png") # 4 通道普通读
bgra_in2 = cv2.imread("blue_bgra.png", cv2.IMREAD_UNCHANGED) # 4 通道特殊操作
print(bgr_in.shape, bgra_in.shape, bgra_in2.shape) # (28, 256, 3) (28, 256, 3) (28, 256, 4)

# 对拍
print("diff bgr:", (bgr != bgr_in).sum()) # 0
print("diff bgr v.s. bgra_in:", (bgr != bgra_in).sum()) # 0
print("diff bgra:", (bgra != bgra_in2).sum()) # 0

output image

  • blue.png
    blue
  • blue_bgra.png

blue_bgra

conclusion

  • 不加 alpha 就还是 opencv 的 BGR 顺序,加了之后就是简单地变成 BGRA。
  • 3、4 通道 png 写都是一样的,用带特殊参数。
  • 读 3 通道 png 普通读就好,4 通道如果普通读就是简单舍弃 alpha,要保留 alpha 就加 cv2.IMREAD_UNCHANGED

1-channel

即灰度图,例如 MNIST 的数据。

  • 写时普通写就好;
  • 读时加 cv2.IMREAD_UNCHANGED,否则 opencv 会自动改成 3 通道。
import cv2
import numpy as np
from PIL import Image

img = np.tile(np.arange(256)[np.newaxis, :], (10, 1)).astype(np.uint8)
print(img.shape) # (10, 256)
cv2.imwrite("grey-cv2.png", img)
im1 = cv2.imread("grey-cv2.png")
print(im1.shape, im1.dtype) # (10, 256, 3), uint8
im2 = cv2.imread("grey-cv2.png", cv2.IMREAD_UNCHANGED)
print(im2.shape, im2.dtype) # (10, 256), uint8
print("diff:", (img != im2).sum()) # 0

grey-cv2

References

  1. python设置图像透明度
  2. How to save png images with OpenCV
  3. How to load png images with 4 channels?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值