Изменение некоммутативных свойств изображения (таких как яркость и контрастность) с помощью ползунков, способ Adobe Lightroom

Я работаю над приложением, в котором я хочу изменить несколько свойств изображения, таких как яркость, контрастность, насыщенность, оттенок и т. Д., С помощью ползунков (вариант использования аналогичен рабочему процессу Lightroom, где пользователь может изменить эти свойства, просто перемещая ползунки).

введите здесь описание изображения

Проблема:

Моя проблема в том, что эти свойства не коммутативны.

Пример

  1. Я меняю яркость на значение +30 на изображении I, т.е. B(I), затем контраст на полученном изображении на -60, т.е. C(B(I)), результат отличается от B(C(I)).
  2. После описанной выше операции C(B(I)), если я попытаюсь вернуть яркость на -30, чтобы свести на нет эффект яркости, то есть B(C(B(I))), результат не будет таким же, как C(I).

Подходы, которые я пробовал:

Я пробовал два разных подхода, но оба они потерпели неудачу.

  1. Продолжайте применять результаты к последнему изображению, т.е. если я хочу снова изменить яркость, я применяю его к результату C (B (I)). Это, очевидно, дает неправильные результаты и не отменяет эффект более раннего применения яркости.
  2. Всякий раз, когда эффект применяется повторно, удалите первый. Пример: если я применил C(B(I)) и снова хочу изменить яркость, я бы удалил первый эффект яркости и, следовательно, получил бы C(I), а затем применил бы результат к этому новому результату. Таким образом, новый эффект будет выглядеть как B(C(I)). Проблема с этим подходом заключается в том, что он медленный, так как эффекты необходимо повторно применять, как только вы меняете ползунок (из-за удаления предыдущего эффекта). И это также приводит к внезапному изменению изображения (очень наглядному), если я верну ползунок обратно на яркость (потому что результат не изменится с C (B (I)) на B (C (I))).

Lightroom и многие другие программы для обработки изображений достигают этого, но я не знаю, как они полностью сводят на нет изменения, когда пользователь перемещает ползунок, независимо от порядка применения свойств. Я не знаю, как они это делают, поэтому мне нужна помощь.

Примечание. В последнее время мне было интересно, можно ли этого добиться путем смешивания (не знаю, какой тип смешивания) результата каждого эффекта, примененного к исходному изображению, а не применения их к результатам предыдущего. .


person Shashank Tomar    schedule 03.05.2014    source источник


Ответы (1)


Это работает следующим образом: создается график операций, которые вы хотите выполнить с изображением, и повторно выполняется весь график всякий раз, когда изменяется какой-либо параметр. Итак, если вы хотите, чтобы за Яркостью следовал Контраст, вы должны создать узел Яркость и узел Контрастности, а затем соединить их вместе следующим образом:

Изображение -> Яркость -> Контрастность -> Выходное изображение

Когда пользователь меняет ползунок яркости или контрастности, вы выполняете весь график с новыми параметрами. Если вы разумно написали свои узлы обработки изображений, то это не должно быть слишком медленным для чего-то вроде регулировки яркости и контрастности.

Если ваш график очень большой и сложный, может иметь смысл кэшировать некоторые промежуточные изображения и пересчитывать только части после промежуточного. Но, честно говоря, для вещей, показанных на вашей картинке, в этом нет необходимости.

person user1118321    schedule 03.05.2014