투명 PNG를 흰색 배경에 JPEG로 저장
numpy
다음과 같이 보이는 배열 로 BGRA 이미지가 있다고 가정 해 보겠습니다 .
[[[233 228 230 128]
[233 228 230 128]
[233 228 230 0]
...
[164 160 159 65]
[199 197 196 65]
[255 255 254 120]]
3 개의 색상 채널과 픽셀의 투명도를 제어하는 1 개의 알파로 매우 간단 해 보입니다. 그 numpy 배열을 PNG 형식으로 저장하면 이미지가 반투명해야합니다.
그러나 JPEG로 저장하면 알파 채널이 완전히 삭제되고 모든 픽셀이 완전히 불투명 해집니다.
JPEG는 알파 투명도를 지원하지 않기 때문에 반투명 이미지 (위의 numpy 배열)를 대신 흰색 배경에 저장하고 싶습니다. 이렇게하면 픽셀이 여전히 반투명 한 것처럼 보입니다.
완전히 흰색 배경에 반투명 numpy 배열을 오버레이하려면 어떻게해야합니까? 나는 주로 numpy와 OpenCV를 사용하고 있습니다.
답변
Fred의 답변이 잘 보여주는 단순한 알파 임계 값보다 점진적 알파 블렌딩을 더 많이 찾고 있다고 생각합니다.
테스트 목적으로 중간에 알파 그래디언트가있는 샘플 이미지를 만들었습니다. 여기에는 일반 이미지와 같으며 Photoshop과 같은 투명도를 표시하기 위해 바둑판 위에 합성됩니다.


알파 블렌딩을 수행하려면 공식을 사용합니다.
result = alpha * Foreground + (1-alpha)*Background
여기서 값은 모두 0..1 범위에서 조정 된 부동 소수점입니다.
검은 색과 흰색 배경을 혼합하는 코드는 다음과 같습니다.
#!/usr/bin/env python3
import cv2
import numpy as np
# Load image, including gradient alpha layer
im = cv2.imread('GradientAlpha.png', cv2.IMREAD_UNCHANGED)
# Separate BGR channels from A, make everything float in range 0..1
BGR = im[...,0:3].astype(np.float)/255
A = im[...,3].astype(np.float)/255
# First, composite image over black background using:
# result = alpha * Foreground + (1-alpha)*Background
bg = np.zeros_like(BGR).astype(np.float) # black background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverBlack.png', res)
# Now, composite image over white background
bg = np.zeros_like(BGR).astype(np.float)+1 # white background
fg = A[...,np.newaxis]*BGR # new alpha-scaled foreground
bg = (1-A[...,np.newaxis])*bg # new alpha-scaled background
res = cv2.add(fg, bg) # sum of the parts
res = (res*255).astype(np.uint8) # scaled back up
cv2.imwrite('OverWhite.png', res)
그것은 이것을 검정에 제공합니다.

그리고 이것은 흰색 위에 :

키워드 : 이미지 처리, Python, OpenCV, 알파, 알파 블렌딩, 알파 합성, 오버레이.
Python OpenCV Numpy에서 이미지에서 알파 채널을 분리 할 수 있습니다. 따라서 imgA가 알파 채널이있는 이미지라면. 그런 다음 rgb 이미지 (img)와 알파 채널 (알파)을 분리합니다.
img = imgA[:,:,0:3]
alpha = imgA[:,:,3]
그런 다음 img의 색상을 알파가 검은 색인 흰색으로 설정합니다.
img[alpha == 0] = (255,255,255)