Mar*_*ell 10
您可以像这样快速完成并矢量化:
import cv2
import numpy as np
# Load image as Numpy array in BGR order
na = cv2.imread('I5jKW.png')
# Make a True/False mask of pixels whose BGR values sum to more than zero
alpha = np.sum(na, axis=-1) > 0
# Convert True/False to 0/255 and change type to "uint8" to match "na"
alpha = np.uint8(alpha * 255)
# Stack new alpha layer with existing image to go from BGR to BGRA, i.e. 3 channels to 4 channels
res = np.dstack((na, alpha))
# Save result
cv2.imwrite('result.png', res)
Run Code Online (Sandbox Code Playgroud)
笔记:
1 您同样可以使用cv2.merge()来代替,np.dstack()而且它可能会更快。
2 您同样可以使用 PIL/Pillow 代替 OpenCV 函数来读取/保存图像。
这是在 Python/OpenCV/Numpy 中执行此操作的另一种方法。
import cv2
import numpy as np
# load image
img = cv2.imread('girl_on_black.png')
# threshold on black to make a mask
color = (0,0,0)
mask = np.where((img==color).all(axis=2), 0, 255).astype(np.uint8)
# put mask into alpha channel
result = img.copy()
result = cv2.cvtColor(result, cv2.COLOR_BGR2BGRA)
result[:, :, 3] = mask
# save resulting masked image
cv2.imwrite('girl_on_black_transparent.png', result)
# display result, though it won't show transparency
cv2.imshow("MASK", mask)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)