Как воспроизвести эффекты «Света» и «Тень» из приложения Adobe Lightroom в iOS - PullRequest
1 голос
/ 06 марта 2019

Я пытаюсь воспроизвести эффект Adobe Lightroom в своем приложении для iOS.В настоящее время я использую GPUImage для всех эффектов, но мне сложно воспроизвести эффекты «Света» и «Тени».Также я уже пытался использовать CIHighlightShadowAdjust из CIFilter, но это дает неправильный результат.

Поэтому я ищу хотя бы алгоритм, который Lightroom использует для этих эффектов.Они оба очень похожи на изменение яркости, но похоже, что они используются для изменения только светлых / темных частей изображения, в зависимости от того, были ли использованы «Светлые» или «Тени».

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

Вот примеры 1. Слева - исходное изображение, а справа - изображение с регулировкой +100 яркости (возможный диапазон -100; 100 с 0по умолчанию).

Highlights +100

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

Слева - исходное изображение, а справа - изображение с регулировкой +100 теней (возможный диапазон -100; 100 с 0 по умолчанию).

Shadows + 100

Здесь вы можете видеть, что статуя (более темная часть изображения) имеет большие изменения в яркости, но небо остается почти без изменений.

1 Ответ

1 голос
/ 07 марта 2019

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

Общий подход будет

  • Преобразование данных изображения RGB в цветовое пространство с яркостью в качестве отдельного измерения, например, HSL или CIELAB.
  • Преобразуйте яркость / яркость / яркость по пикселям с помощью одной функции преобразования, которая непрерывна и монотонно увеличивается, но ограничена диапазоном допустимых значений. Это похоже на нелинейное растяжение или сжатие гистограммы яркости.
  • Заменить оригинальную яркость на преобразованную.
  • Преобразование обратно в цветовое пространство RGB.

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

Точная форма трансформации также зависит от вашего вкуса. Я немного поиграл

Подсветка, похожая на вашу подсветку, которую я могу получить (с преобразованием в CIELAB и Ligthness L изменяется от 0 до 100) кусочно-линейной функцией:

a = 1.5
b = 50
L(L>b)=a*L(L>b)-(a-1)*b

enter image description here

Улучшение теней, которое похоже на ваше усиление теней, которое я могу получить с экспоненциально затухающим улучшением.

a = 4;
b = 20;
L = ((a-1)*exp(-L/b)+1) * L;

enter image description here

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

...