Какова формула для увеличения яркости изображения таким же образом, как это делает компонент L в Photoshop? - PullRequest
4 голосов
/ 25 июня 2011

Например, у меня есть пиксель со следующими значениями:

CGFloat red = 34 // 0 - 255
CGFloat green = 128
CGFloat blue = 190

и я хочу увеличить яркость, чтобы синий был 255. ПРИМЕЧАНИЕ. Под «яркостью» я подразумеваю L-компонент Photoshop в цветовом пространстве LAB. Смотрите фотографии!

Должна быть специальная формула для вычисления значений RGB для увеличенной яркости, поскольку значения R G B изменяются нелинейным образом!

Доказательство: я провел тест в Photoshop и создал этот же цвет, а затем открыл палитру цветов, чтобы проверить его:

Original color

Затем я активировал компонент L цветового пространства LAB, который управляет яркостью (по крайней мере, об этом я говорю - я имею в виду яркость, контролируемую этим компонентом L. Угадайте, что это яркость).

Поэтому, активировав L, я тащил ползунок влево вверх, пока B не достиг 255: Modified color

Теперь прочитайте полученные значения R G B:

CGFloat newRed = 112 // 0 - 255
CGFloat newGreen = 188
CGFloat newBlue = 255

Различия между ними:

newRed - red = +78
newGreen - green = +60
newBlue - blue = +65

Проценты:

red shift: +38.42%
green shift: +29.55%
blue shift: +32.01%

Это не соответствует известной формуле для вычисления яркости из R G B, которая является чем-то близким к luminance = (red * 0.3) + (green * 0.6) + (blue * 0.1).

Очевидно, они были смещены нелинейным образом.

Есть ли известный способ вычисления newRed, newGreen, newBlue из красного, зеленого, синего аналогично тому, как это делает Photoshop?

1 Ответ

4 голосов
/ 25 июня 2011

То есть вы хотите преобразовать цвет RGB в цветовое пространство Lab?Конечно, это возможно.

Но есть много разных стандартов, на которые все ссылаются с общим названием «Lab».Вам нужно будет выбрать один для использования при написании вашего алгоритма.В частности, Photoshop использует стандарт CIELAB D50, поэтому вы можете использовать его, если вам необходимо точно имитировать его обработку.

Еще одна вещь, которую вы должны иметь в виду, это то, что RGBмодель зависит от устройства , что означает, что для преобразования из RGB в Lab сначала необходимо преобразовать RGB в не зависящее от устройства абсолютное цветовое пространство.Adobe делает это в формате «Adobe RGB», но вы можете использовать что-то стандартное, например, sRGB.Процесс настройки учитывает аппаратную зависимость цвета RGB, но преобразует цвет в тот, который не зависит от устройства.Получив это, вы можете сделать последний шаг преобразования цвета в цветовое пространство Lab.

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

В зависимости от того, насколько вы серьезны (так, вероятно, нет), вы также можете скачать исходный код для GIMP и посмотреть, какони реализовали алгоритмы преобразования.Их программное обеспечение утверждает, что поддерживает пространство Lab.

Будьте осторожны, когда конвертируете обратно в RGB.Цветовое пространство Lab может представлять цвета, которые находятся за пределами диапазона sRGB.Даже в Photoshop большая часть того, что вы видите в режиме Lab, отбрасывается после преобразования изображения обратно в RGB (или CMYK).


Edit: Также стоит учитывать, что еслиВаша единственная цель - осветлить цвет в цветовом пространстве, которое лучше соответствует восприятию человеческих цветов, чем RGB. Вам, возможно, вообще не придется суетиться с Lab.Многие приложения делают это путем преобразования в HSL или HSV цветовое пространство .(Photoshop вызывает HSV, HSB).

Преимущество состоит в том, что вы можете просто отрегулировать значения "Lightness" или "Value", чтобы изменить интенсивность цвета (так же, как вы настраивали бы значение "Luminance" вцветовое пространство Lab), но алгоритмы преобразования намного проще (и часто встроены в стандартные библиотеки по вашему выбору).

Например, см. мой ответ на этот вопрос для алгоритма преобразования, написанного на языке .NET.

...