Отличная наводка! сразу пришла на ум еще одна палитра подобной структуры: LAB. Она есть в фотошопе, поэтому я сразу проверил — превосходный результат кеинга по каналу A. Попробую утром.
Единственное, чем подкупает мой алгоритм — он примитивен при очень хорошем результате. Так что необходимо, чтобы новый алгоритм оправдал вычисления (RGB2LAB или RGB2YUV) существенно лучшим кеингом, особенно упакованных изображений — видео.
Отпишусь )
Добавлено через 2 часа 40 минут
YUV отлично "пилит" синий — у него второй канал хранит именно эту составляющую.
Для зеленого нужно просто в формуле подсчета U поменять каналы, что вкупе c финальными коррекциями удивительным образом напоминает мои манипуляции =)
а вот Lab не дал того результата, ради которого стоит столько считать:

Код:
<languageVersion : 1.0;>
kernel GreenscreenKeyingLAB
<
namespace : "ChromaKeying";
vendor : "Vadim BELLinSKY";
version : 1;
description : "Greenscreen keying";
>
{
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
dst = sampleNearest( src, outCoord() );
float var_R = dst.r;
float var_G = dst.g;
float var_B = dst.b;
if ( var_R > 0.04045 ) { var_R = pow( ( var_R + 0.055 ) / 1.055, 2.4 ); }
else { var_R = var_R / 12.92; }
if ( var_G > 0.04045 ) { var_G = pow( ( var_G + 0.055 ) / 1.055, 2.4 ); }
else { var_G = var_G / 12.92; }
if ( var_B > 0.04045 ) { var_B = pow( ( var_B + 0.055 ) / 1.055, 2.4 ); }
else { var_B = var_B / 12.92; }
var_R = var_R * 100.0;
var_G = var_G * 100.0;
var_B = var_B * 100.0;
float X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805;
float Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722;
float Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505;
X /= 95.047;
Y /= 100.0;
Z /= 108.883;
float a = 17.5 * ( ( ( 1.02 * X ) - Y ) / sqrt( Y ) );
dst.a = a * 350.0 + 350.0;
}
}