Я хочу написать алгоритм улучшения изображения, который похож на функцию изменения светлых и теневых участков в фотошопе. Можете ли вы помочь мне относительно того, что эта функция Photoshop делает с изображением внутри?
Мне не нужен точный алгоритм. Ищу нечто подобное. Просто старт, чтобы я мог написать что-нибудь сам.
"какиеделаетэтохарактерная чертаизфотошопделатьвнутрикан _image?" Невозможно узнать без реверс-инжиниринга.
Что еще ты исследовал / пытался? Поделитесь своими выводами.
Существует ли такая же функция в программном пакете с открытым исходным кодом (возможно, в GIMP)?





Начнем с того, что вы уже можете найти подсказку в их документации: https://helpx.adobe.com/photoshop/using/adjust-shadow-highlight-detail.html
По этим документам сложно угадать, какой именно алгоритм они используют. Ниже я попытаюсь объяснить только некоторые подходы, которые я бы использовал, если бы столкнулся с этой проблемой. Не ждите четкого алгоритма, но используйте мой ответ как указатель, который приведет вас хотя бы к пути.
Как я понял, этот алгоритм улучшает контрастность в локальном масштабе, то есть для каждого пикселя он будет регулировать значение в зависимости от окрестности. Для этого у вас есть несколько входных параметров:
Другие упомянуты в документации, но они бесполезны для понимания алгоритмической концепции.
В этой части вы можете рассмотреть возможность использования либо изображения в градациях серого, либо канала Value из преобразования HSV.
Я бы посмотрел на пиксель и его окрестности. Вычислите статистику локального распределения (среднее значение и дисперсию).
Я сравню среднее значение с пороговым значением, определенным ранее, а затем использую дисперсию, чтобы различить, является ли пиксель зашумленным или принадлежит контуру, что в этом случае я ожидаю огромной дисперсии.
В случае, если пиксель принадлежит к классу тени или светлого тона, вы хотите улучшить его контраст, но не «серый», а «цветной» контраст.
Тупой подход:
Будет взвешивать ваш цветовой канал в соответствии с их внутренними отклонениями.
Вот пример: представьте, что ваш пиксель: (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, абсолютный черный остается черным, в то время как вы увеличиваете его больше всего.
@IvanKuckir Я сказал, что это не совсем точно, просто мой обходной путь.
Вы спрашиваете об алгоритме, используемом в стороннем программном обеспечении. Это не открытый исходный код, поэтому это может быть трудно узнать, потому что: 1- У вас нет кода, чтобы увидеть, какой алгоритм в нем реализован. 2- Скорее всего, в фотошопе есть защита от реверс-инжиниринга. 3- Обратный инжиниринг программы Photoshop может быть незаконным в некоторых странах и, скорее всего, противоречит лицензионному соглашению.