[1] 測試了怎么手動加 alpha 通道設(shè)置透明度后,用 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_bgra.png
conclusion
- 不加 alpha 就還是 opencv 的 BGR 順序,加了之后就是簡單地變成 BGRA。
- 3、4 通道 png 寫都是一樣的,不用帶特殊參數(shù)。
- 讀 3 通道 png 普通讀就好,4 通道如果普通讀就是簡單舍棄 alpha,要保留 alpha 就加
cv2.IMREAD_UNCHANGED
。
1-channel
即灰度圖,例如 MNIST 的數(shù)據(jù)。文章來源:http://www.zghlxwxcb.cn/news/detail-486554.html
- 寫時普通寫就好;
- 讀時加
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
文章來源地址http://www.zghlxwxcb.cn/news/detail-486554.html
References
- python設(shè)置圖像透明度
- How to save png images with OpenCV
- How to load png images with 4 channels?
到了這里,關(guān)于opencv讀寫png的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!