Каков алгоритм изменения светлых участков или теней в Photoshop?

Я хочу написать алгоритм улучшения изображения, который похож на функцию изменения светлых и теневых участков в фотошопе. Можете ли вы помочь мне относительно того, что эта функция Photoshop делает с изображением внутри?

Вы спрашиваете об алгоритме, используемом в стороннем программном обеспечении. Это не открытый исходный код, поэтому это может быть трудно узнать, потому что: 1- У вас нет кода, чтобы увидеть, какой алгоритм в нем реализован. 2- Скорее всего, в фотошопе есть защита от реверс-инжиниринга. 3- Обратный инжиниринг программы Photoshop может быть незаконным в некоторых странах и, скорее всего, противоречит лицензионному соглашению.

Cleptus 30.07.2018 12:07

Мне не нужен точный алгоритм. Ищу нечто подобное. Просто старт, чтобы я мог написать что-нибудь сам.

Sahil Garg 30.07.2018 12:12

"какиеделаетэтохарактерная чертаизфотошопделатьвнутрикан _image?" Невозможно узнать без реверс-инжиниринга.

Cleptus 30.07.2018 12:17

Что еще ты исследовал / пытался? Поделитесь своими выводами.

MrSmith42 30.07.2018 16:45

Существует ли такая же функция в программном пакете с открытым исходным кодом (возможно, в GIMP)?

cybernetic.nomad 31.07.2018 13:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
5
2 139
2

Ответы 2

Простой подход

Начнем с того, что вы уже можете найти подсказку в их документации: https://helpx.adobe.com/photoshop/using/adjust-shadow-highlight-detail.html

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

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

  • Размер окружения (или ядра)
  • Порог выделения: все вышеупомянутое считается выделенным.
  • Порог тени: все, что ниже, считается принадлежащим тени

Другие упомянуты в документации, но они бесполезны для понимания алгоритмической концепции.

1. Определите, к какой категории принадлежит пиксель: Highlight / Shadow / none.

В этой части вы можете рассмотреть возможность использования либо изображения в градациях серого, либо канала Value из преобразования HSV.

Я бы посмотрел на пиксель и его окрестности. Вычислите статистику локального распределения (среднее значение и дисперсию).

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

2. Применить обработку

В случае, если пиксель принадлежит к классу тени или светлого тона, вы хотите улучшить его контраст, но не «серый», а «цветной» контраст.

Тупой подход:
Будет взвешивать ваш цветовой канал в соответствии с их внутренними отклонениями.

Вот пример: представьте, что ваш пиксель: (32, 35, 50) (R, G, B) и принадлежит классу тени. Я определю 3 коэффициента Rc, Gc, Bc, которые определены от 0,5 до 1,5 (произвольно), которые применяются к соответствующему каналу.

Поскольку синий является доминирующим, я бы имел высокий коэффициент для синего, например 1,3, и меньшую важность каналов R и G с коэффициентом около 0,8.

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


Другие (высокоуровневые) подходы

Лапласианские пирамиды

Использование пирамид для различения деталей в разных масштабах и лапласиана для улучшения контраста.

Эти ссылки могут быть действительно полезны для вас, особенно потому, что источники доступны, а концепция хорошо объяснена. Я бы посоветовал вам продолжить поиски, чтобы глубже заглянуть в darktable. Это мощная бесплатная альтернатива Lightroom с открытым исходным кодом. Я уже нахожу кое-что интересное, просто просматривая их блог.

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

Вы можете следовать следующей методике. Это неточно, но хорошо имитирует.

lumR = 0.299;
lumG = 0.587;
lumB = 0.114;

// we have to find luminance of the pixel
// here 0.0 <= source.r/source.g/source.b <= 1.0 
// and 0.0 <= luminance <= 1.0

luminance = sqrt( lumR*pow(source.r,2.0) + lumG*pow(source.g,2.0) + lumB*pow(source.b,2.0));



// here highlights and and shadows are our desired filter amounts
// highlights/shadows should be >= -1.0 and <= +1.0
// highlights = shadows = 0.0 by default
// you can change 0.05 and 8.0 according to your needs but okay for me

h = highlights * 0.05 * ( pow(8.0, luminance) - 1.0 );
s = shadows * 0.05 * ( pow(8.0, 1.0 - luminance) - 1.0 );

output.r = source.r + h + s;
output.g = source.g + h + s;
output.b = source.b + h + s;

Когда вы увеличиваете параметр «тени» в Photoshop, абсолютный черный остается черным, в то время как вы увеличиваете его больше всего.

Ivan Kuckir 02.06.2020 00:46

@IvanKuckir Я сказал, что это не совсем точно, просто мой обходной путь.

ZeroOneZero 10.06.2020 07:01

Другие вопросы по теме