jpg 图像读进来是 RGB 三阶张量,要设置透明度,可以手动加一层 alpha 通道,改成 RGBA 四阶,再用 PIL.Image 转成 png 保存。alpha 通道 [0, 255] 取值, 0 是完全透明,255 是不透明。
Example
- 网上下的一张 jpg 图,想将白色背景设为透明,存成 png。
- 先用取色器确定白色背景部分的 RGB 值,本例 R = G = B = 255。
import numpy as np
import cv2
from PIL import Image
img = cv2.cvtColor(cv2.imread("animal-horse.jpg"), cv2.COLOR_BGR2RGB)
print(img.shape, img.dtype) # (1200, 1600, 3) uint8
# 找白色背景部分
mask = (255 == img[:, :, 0]) & (255 == img[:, :, 1]) & (255 == img[:, :, 2])
# 计算 alpha 通道:反选前景并设为 255 不透明
# 转成 uint8,与原 RGB 的类型一致
alpha = (1 - mask.astype(np.uint8)) * 255
# 升维、拼接:RGB -> RGBA
img_rgba = np.concatenate((img, alpha[:, :, np.newaxis]), 2)
# 转成 PIL.Image
img_rgba = Image.fromarray(img_rgba)
# 保存
img_rgba.save("animal-horse.png")
- 效果(浏览器用 dark reader 将背景弄黑看透明效果,或下到本地用 power point 叠在另一幅图上面看)
Greyscale
用 PIL 读写灰度图,存为 .png 格式,参考 [2],opencv 版见 [3]。
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)
img_pil = Image.fromarray(img, 'L')
img_pil.save("grey-pil.png")
im1 = np.asarray(Image.open("grey-pil.png"))
print(im1.shape, im1.dtype) # (10, 256) uint8
print("diff:", (img != im1).sum()) # 0
References
- 优快云去除水印最新方法(创作中心 -> 博客设置 -> 图片水印)
- Converting 2D Numpy array of grayscale values to a PIL image
- opencv读写png