Тема: Chroma Keying?
Показать сообщение отдельно
Старый 04.12.2010, 03:47
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 3  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Отличная наводка! сразу пришла на ум еще одна палитра подобной структуры: 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;
    }
}
__________________
Поймай яблоко 2!