i.o. — респект! отличная наводка на подавление зеленого края!
я ее лишь несколько видоизменил и лишил настройки (она поначалу была, но все тесты показали ее ненадобность)
теперь наш фильтр имеет такой вид:

Код:
<languageVersion : 1.0;>
kernel GreenscreenKeying
<
namespace : "ChromaKeying";
vendor : "Vadim BELLinSKY feat. i.o.";
version : 3;
description : "Greenscreen keying with edge color correction";
>
{
parameter float amount
<
minValue: float(0.0);
maxValue: float(10.0);
defaultValue: float(0.0);
>;
parameter float threshold
<
minValue: float(0.0);
maxValue: float(1.0);
defaultValue: float(0.8);
>;
input image4 src;
output pixel4 dst;
void
evaluatePixel()
{
dst = sampleNearest( src, outCoord() );
// очищаем зерна от плевел
float A = clamp( 1.0 - ( dst.g * ( 1.0 + threshold ) - dst.r - dst.b ) * amount, 0.0, 1.0 );
float A1 = 1.0 - A;
// упрощенная схема поиска серого, эквивалентного(~) данной точке по яркости
float GREY = ( dst.r + dst.g + dst.b ) * 0.33;
// обесцвечивание полупрозрачных точек с акцентом на зеленый канал
dst.r += A1 * ( GREY - dst.r );
dst.g += A1 * ( GREY - dst.g ) * 2.0;
dst.b += A1 * ( GREY - dst.b );
// ну и, собственно, отсечение зеленого фона
dst.a = A;
// код ниже добавлен лишь для демонстрации и должен быть удален в релизе
// начало кода задника
dst.r = dst.r * A + A1 * ( sin( outCoord().x * 0.25 ) * cos( outCoord().y * 0.5 ) * 0.5 + 0.5 );
dst.g = dst.g * A + A1 * ( cos( outCoord().x * 0.5 ) * sin( outCoord().y * 0.25 ) * 0.5 + 0.5 );
dst.b = dst.b * A + A1;
dst.a = 1.0;
// конец кода задника
}
}
особенно показательны эти кадры:
первый: волосы в блюре — частая ситуация (наряду с прочими размытостями при быстрых движениях)
второй: весь кадр какой-то зеленоватый — нередко при съемках отражающих объектов (в данном случае ткань платья приняла на себя много рира)
как видишь, твоя подсказка позволяет более не "пережимать" настройки, что делает края более плавными.