Автоматизация баланса телесных тонов.

  • Автор темы Автор темы chesen
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

chesen

Топикстартер
20 лет на форуме
Сообщения
553
Реакции
49
При потоке портретов для выравнивания оттенков лица пользуюсь методом опорного цвета.
Экшеном выделяется охват телесных тонов, из выделения создается корректирующий слой кривых. При диалоге белой пипеткой кликаю на более светлый участок лица, обычно щека или лоб. Белая пипетка переназначена CMYK из 0.0.0.0. в 0.25.28.0. Это условно евротип лица и тема не об этом)).
Как показывает практика, это один из наиболее предсказуемых способ приведения картинки в съедаемый вид. Конечно, профессионалы работают в RAW и т.д., но это не тот случай- на входе очень разные по балансу файлы и их очень много.
Вопрос: можно ли это автоматизировать- привязать блик (самый светлый участок) на выделении к белому опорному цвету 0.25.28.0., т.е. типа автоколор, только по-элегантнее, что-ли. Как-то так.
 
насколько я понимаю, желаемого эффекта можно добиться путем запуска selective color, где в white как раз добавить 25m 28y
 
Теоретически да, практически нет. Важны локальные изменения, а здесь белое становится желтым, что недопустимо.
 
Вопрос: можно ли это автоматизировать- привязать блик (самый светлый участок) на выделении к белому опорному цвету 0.25.28.0., т.е. типа автоколор
Тогда поподробнее об этом 'hmmm'
 
@Йожег, давайте не тратить время впустую.
@_MBK_, тут надо пробовать самому, много нюансов с местом клика и размером пипетки. Но способ РАБОТАЕТ.
И вытягивает БЫСТРО снимки практически безнадежные. Т.е. делает исходник ЛУЧШЕ.
А это важно в наше кризисное время воинствующих нигилистов.
 
в диалоге curves можно белой пипетке target color задать, потом тыкаешь куда-нить и кривые перестраиваются.
 
Подозреваю, что можно обойтись без клика по изображению.
Просто математически заставить программу провести коррекцию, по аналогии с автоуровнями, но не так горбато. Если мы меняем белый опорный цвет, то можно наверное(в рамках выделения телесных цветов или канала красного накрайняк) произвести процедуру привязки цвета в новых условиях.
Т.е. вызов диалога с пипеткой полезен, но крайне субъективен: от места указания цвета картинка сильно меняется, а стоит задача только подровнять баланс цвета лица в сторону здорового розового оттенка.
 
в диалоге curves можно белой пипетке target color задать, потом тыкаешь куда-нить и кривые перестраиваются.
Ну и в чем проблема? Я так понимаю, это действие в экшн пишется нормально.
 
Найти координаты этого пикселя, полагаю.
 
Я так полагаю, ищется самое светлое место?
 
Можно ли обойтись без клика пипетки по документу? Применить что-то типа автоуровней?
 
@chesen, смотрите actions от известных свадебных фотографов. Насколько мне известно, лучшие считаются от Kevin Kubota. Стоят дорого, но качество обработки очень высокое, и скорость тоже.
 
  • Спасибо
Реакции: chesen
Так в экшн же записывается не координата тыка пипетки а цвет данной точки
Данный процесс вполне себе скриптуется
 
@_MBK_, похоже, вы правы.
Про скрипт я не думал, но все пытался использовать наложения слоев, автоуровни, но все работает непредсказуемо.
М.б. кто-то реализует эту идею?
 
М.б. кто-то реализует эту идею?
А что тут сложного? Вашего уровня, IMHO, должно хватить
Берете scriptlistener записываете скрипт. Я вам даже скажу какой
Код:
var id274 = charIDToTypeID( "Crvs" );
    var desc65 = new ActionDescriptor();
    var id275 = stringIDToTypeID( "presetKind" );
    var id276 = stringIDToTypeID( "presetKindType" );
    var id277 = stringIDToTypeID( "presetKindCustom" );
    desc65.putEnumerated( id275, id276, id277 );
    var id278 = charIDToTypeID( "Adjs" );
        var list19 = new ActionList();
            var desc66 = new ActionDescriptor();
            var id279 = charIDToTypeID( "Chnl" );
                var ref16 = new ActionReference();
                var id280 = charIDToTypeID( "Chnl" );
                var id281 = charIDToTypeID( "Chnl" );
                var id282 = charIDToTypeID( "Rd  " );
                ref16.putEnumerated( id280, id281, id282 );
            desc66.putReference( id279, ref16 );
            var id283 = charIDToTypeID( "Crv " );
                var list20 = new ActionList();
                    var desc67 = new ActionDescriptor();
                    var id284 = charIDToTypeID( "Hrzn" );
                    desc67.putDouble( id284, 0.000000 );
                    var id285 = charIDToTypeID( "Vrtc" );
                    desc67.putDouble( id285, 0.000000 );
                var id286 = charIDToTypeID( "Pnt " );
                list20.putObject( id286, desc67 );
                    var desc68 = new ActionDescriptor();
                    var id287 = charIDToTypeID( "Hrzn" );
                    desc68.putDouble( id287, 255.000000 );
                    var id288 = charIDToTypeID( "Vrtc" );
                    desc68.putDouble( id288, 162.000000 );
                var id289 = charIDToTypeID( "Pnt " );
                list20.putObject( id289, desc68 );
            desc66.putList( id283, list20 );
        var id290 = charIDToTypeID( "CrvA" );
        list19.putObject( id290, desc66 );
            var desc69 = new ActionDescriptor();
            var id291 = charIDToTypeID( "Chnl" );
                var ref17 = new ActionReference();
                var id292 = charIDToTypeID( "Chnl" );
                var id293 = charIDToTypeID( "Chnl" );
                var id294 = charIDToTypeID( "Grn " );
                ref17.putEnumerated( id292, id293, id294 );
            desc69.putReference( id291, ref17 );
            var id295 = charIDToTypeID( "Crv " );
                var list21 = new ActionList();
                    var desc70 = new ActionDescriptor();
                    var id296 = charIDToTypeID( "Hrzn" );
                    desc70.putDouble( id296, 0.000000 );
                    var id297 = charIDToTypeID( "Vrtc" );
                    desc70.putDouble( id297, 0.000000 );
                var id298 = charIDToTypeID( "Pnt " );
                list21.putObject( id298, desc70 );
                    var desc71 = new ActionDescriptor();
                    var id299 = charIDToTypeID( "Hrzn" );
                    desc71.putDouble( id299, 255.000000 );
                    var id300 = charIDToTypeID( "Vrtc" );
                    desc71.putDouble( id300, 56.000000 );
                var id301 = charIDToTypeID( "Pnt " );
                list21.putObject( id301, desc71 );
            desc69.putList( id295, list21 );
        var id302 = charIDToTypeID( "CrvA" );
        list19.putObject( id302, desc69 );
            var desc72 = new ActionDescriptor();
            var id303 = charIDToTypeID( "Chnl" );
                var ref18 = new ActionReference();
                var id304 = charIDToTypeID( "Chnl" );
                var id305 = charIDToTypeID( "Chnl" );
                var id306 = charIDToTypeID( "Bl  " );
                ref18.putEnumerated( id304, id305, id306 );
            desc72.putReference( id303, ref18 );
            var id307 = charIDToTypeID( "Crv " );
                var list22 = new ActionList();
                    var desc73 = new ActionDescriptor();
                    var id308 = charIDToTypeID( "Hrzn" );
                    desc73.putDouble( id308, 0.000000 );
                    var id309 = charIDToTypeID( "Vrtc" );
                    desc73.putDouble( id309, 0.000000 );
                var id310 = charIDToTypeID( "Pnt " );
                list22.putObject( id310, desc73 );
                    var desc74 = new ActionDescriptor();
                    var id311 = charIDToTypeID( "Hrzn" );
                    desc74.putDouble( id311, 255.000000 );
                    var id312 = charIDToTypeID( "Vrtc" );
                    desc74.putDouble( id312, 56.000000 );
                var id313 = charIDToTypeID( "Pnt " );
                list22.putObject( id313, desc74 );
            desc72.putList( id307, list22 );
        var id314 = charIDToTypeID( "CrvA" );
        list19.putObject( id314, desc72 );
    desc65.putList( id278, list19 );
executeAction( id274, desc65, DialogModes.NO );
Цифры Double под тэгами Hrzn и Vrtc как я понимаю - начальные и конечные значения по каждому каналу.
 
  • Спасибо
Реакции: chesen
Надо пробовать.
 
Ну, если цвет принять за постоянную, можно и просто кривые сохранить как пресет и применять.
 
За постоянную нельзя, там же смысл в том, что на каждом фото своя освещенность. Впрочем, думаю, идея все таки дохлая - самая светлая точка на фото вовсе не обязательно на лице
Причем, скорее всего, не на лице :(
 
Статус
Закрыто для дальнейших ответов.