색상 빼기 및 투명도 값 추출

색상 빼기 및 투명도 값 추출

그림을 반투명하게 만들고 평평한 배경색을 추가했다고 가정해 보겠습니다. 원본 사진, 배경색, 결과(혼합물)를 알 수 있습니다. 그러나 추가된 투명도(알파 값)는 알 수 없으며 그림에 따라 다릅니다. 이미지의 각 픽셀에 대해 추가된 투명도 값을 자동으로 계산하는 방법이 있습니까? 이 값을 복사하여 다른 그림에 적용할 수 있나요?

[ 그림 + 투명도(알 수 없으며 다양함) ] + FlatBackground = 혼합(불투명)

= [ 반투명 그림 ] + FlatBackground = 혼합(불투명)

그림의 픽셀에 해당하는 추가된 각 투명도 값을 복사하는 예:

for pixel(0,0) added 127
for pixel(1,0) added 124
for pixel(0,1) added 124
for pixel(1,1) added 120

하지만 물론 나는 이 값을 인쇄하고 싶지 않습니다. 그냥 마스크(?)처럼 사용하고 싶어요. 따라서 이 값을 다른 사진에 적용하여 동일한 효과를 만들 수 있습니다.

답변1

혼합 픽셀을 얻기 위해 원본 픽셀에 투명도를 더하는 것이 아니라 곱합니다. 다음의 토론을 참조하세요.PNG 사양.

0..255 범위의 8비트 색상 샘플을 가정하고 0..1.0 범위로 정규화한다고 가정하면 이미지의 각 픽셀에 대해 다음을 수행합니다.

m = Mix/255
p = Picture/255
a = alpha = Transparency/255

m = (p * a) + (b * (1.0 - a))

"a"를 풀다

a = (m - b) / (p - b)

원래 범위로 다시 변환합니다(예: 0..255).

Transparency = a * 255

불행하게도 이는 모든 픽셀에서 투명도(알파)를 추출할 수 없음을 의미합니다. 특히 Picture == Background (p - b == 0) 인 경우 투명도는 0..255 범위(a == 0.0에서 1.0 사이)일 수 있습니다. 코드에서 이 수식을 사용하는 경우 0으로 나누는 것을 방지해야 합니다.

그림-배경이 0이 아니면 투명도를 얻을 수 있지만 차이(p - b)가 작으면 정확도가 떨어집니다.

관련 정보