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

Статус
Закрыто для дальнейших ответов.

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
При потоке портретов для выравнивания оттенков лица пользуюсь методом опорного цвета.
Экшеном выделяется охват телесных тонов, из выделения создается корректирующий слой кривых. При диалоге белой пипеткой кликаю на более светлый участок лица, обычно щека или лоб. Белая пипетка переназначена CMYK из 0.0.0.0. в 0.25.28.0. Это условно евротип лица и тема не об этом)).
Как показывает практика, это один из наиболее предсказуемых способ приведения картинки в съедаемый вид. Конечно, профессионалы работают в RAW и т.д., но это не тот случай- на входе очень разные по балансу файлы и их очень много.
Вопрос: можно ли это автоматизировать- привязать блик (самый светлый участок) на выделении к белому опорному цвету 0.25.28.0., т.е. типа автоколор, только по-элегантнее, что-ли. Как-то так.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
насколько я понимаю, желаемого эффекта можно добиться путем запуска selective color, где в white как раз добавить 25m 28y
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Теоретически да, практически нет. Важны локальные изменения, а здесь белое становится желтым, что недопустимо.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Вопрос: можно ли это автоматизировать- привязать блик (самый светлый участок) на выделении к белому опорному цвету 0.25.28.0., т.е. типа автоколор
Тогда поподробнее об этом 'hmmm'
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
@Йожег, давайте не тратить время впустую.
@_MBK_, тут надо пробовать самому, много нюансов с местом клика и размером пипетки. Но способ РАБОТАЕТ.
И вытягивает БЫСТРО снимки практически безнадежные. Т.е. делает исходник ЛУЧШЕ.
А это важно в наше кризисное время воинствующих нигилистов.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
в диалоге curves можно белой пипетке target color задать, потом тыкаешь куда-нить и кривые перестраиваются.
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Подозреваю, что можно обойтись без клика по изображению.
Просто математически заставить программу провести коррекцию, по аналогии с автоуровнями, но не так горбато. Если мы меняем белый опорный цвет, то можно наверное(в рамках выделения телесных цветов или канала красного накрайняк) произвести процедуру привязки цвета в новых условиях.
Т.е. вызов диалога с пипеткой полезен, но крайне субъективен: от места указания цвета картинка сильно меняется, а стоит задача только подровнять баланс цвета лица в сторону здорового розового оттенка.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
в диалоге curves можно белой пипетке target color задать, потом тыкаешь куда-нить и кривые перестраиваются.
Ну и в чем проблема? Я так понимаю, это действие в экшн пишется нормально.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Найти координаты этого пикселя, полагаю.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Я так полагаю, ищется самое светлое место?
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Можно ли обойтись без клика пипетки по документу? Применить что-то типа автоуровней?
 

Dmitrij M

15 лет на форуме
Сообщения
11 046
Реакции
5 944
@chesen, смотрите actions от известных свадебных фотографов. Насколько мне известно, лучшие считаются от Kevin Kubota. Стоят дорого, но качество обработки очень высокое, и скорость тоже.
 
  • Спасибо
Реакции: chesen

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Так в экшн же записывается не координата тыка пипетки а цвет данной точки
Данный процесс вполне себе скриптуется
 

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
@_MBK_, похоже, вы правы.
Про скрипт я не думал, но все пытался использовать наложения слоев, автоуровни, но все работает непредсказуемо.
М.б. кто-то реализует эту идею?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
М.б. кто-то реализует эту идею?
А что тут сложного? Вашего уровня, 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

chesen

Топикстартер
15 лет на форуме
Сообщения
553
Реакции
49
Надо пробовать.
 

Skvoznyak

15 лет на форуме
Сообщения
5 500
Реакции
2 168
Ну, если цвет принять за постоянную, можно и просто кривые сохранить как пресет и применять.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
За постоянную нельзя, там же смысл в том, что на каждом фото своя освещенность. Впрочем, думаю, идея все таки дохлая - самая светлая точка на фото вовсе не обязательно на лице
Причем, скорее всего, не на лице :(
 
Статус
Закрыто для дальнейших ответов.