Нужна помощь в понимании альфа-каналов - PullRequest
1 голос
/ 30 января 2011

У меня есть RGB-кортеж пикселя, который мы назовем P.

(255, 0, 0) - цвет P с альфа-каналом в 1.0.

При альфа-канале 0,8 цвет P становится (255, 51, 51).

Как я могу получить цвет пикселя, который влияет на цвет P?

Ответы [ 2 ]

6 голосов
/ 30 января 2011

Начнем с самого начала. Пиксель с альфа-каналом имеет смысл только тогда, когда он смешан с чем-то другим. Если у вас есть верхний слой U с альфа-каналом и нижний слой L, который полностью непрозрачен, уравнение:

P = (alpha * U) + ((1.0 - alpha) * L)

Переставляя формулу, вы получаете:

L = (P - (alpha * U)) / (1.0 - alpha)

Очевидно, что уравнение не имеет смысла, когда альфа равна 1,0, так как вы бы делили на ноль.

Подключение ваших чисел показывает, что R = 255, G = 255 и B = 255 для пикселя L.

Практически универсально, что самый нижний слой на изображении будет белым (255,255,255) по соглашению.

3 голосов
/ 30 января 2011

Просто посмотрите на указанные вами числа:

(1.0-0.8)*255 ~= 50.9 = 51

Где:

  • 1.0 - максимальная альфа-интенсивность
  • 0.8 - текущая альфа-интенсивность
  • 255 - максимальная интенсивность каждого из каналов RGB (цвет фона)

Это соответствует каналам B и G. вашего примера.

Таким образом, в общем случае это, кажется, простое взвешенное среднее между значением канала (RGB) и цветом фона (в вашем случае, белый - 255).В качестве веса используется альфа.

Вот некоторый код Python:

MIN_ALPHA=0.0
MAX_ALPHA=1.0
MIN_CH=0
MAX_CH=255
BG_VAL=255

def apply_alpha(old, alpha, bg=255):
    assert alpha >= MIN_ALPHA
    assert alpha <= MAX_ALPHA
    assert old >= MIN_CH
    assert old <= MAX_CH

    new = old*alpha + (MAX_ALPHA - alpha)*bg
    return new

if __name__ == '__main__':
    import sys
    old, alpha = map(float, sys.argv[1:])
    print apply_alpha(old, alpha)

И некоторый вывод:

misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 255 0.8
255.0
misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 0 0.8
51.0

Попробуйте это для других примеров (в частности,не белый фон) - это наверное так просто.Если нет, то отредактируйте свой ответ новыми примерами, и я посмотрю по-другому.

...