Какая формула для увеличения яркости изображения таким же образом, как это делает компонент L в Photoshop?
Например, у меня есть пиксель с этими значениями:
CGFloat red = 34 // 0 - 255
CGFloat green = 128
CGFloat blue = 190
и я хочу увеличить яркость так, чтобы синий был 255. ПРИМЕЧАНИЕ. Под "Яркостью" я подразумеваю L-компонент Photoshop в цветовом пространстве LAB. Смотрите картинки!
Должна быть специальная формула для вычисления значений RGB для увеличенной яркости, потому что значения RGB изменяются нелинейным образом!
Доказательство: я провел тест в Photoshop и создал этот же цвет, а затем открыл палитру цветов, чтобы проверить ее:
Затем я активировал компонент L цветового пространства LAB, который управляет яркостью (по крайней мере, об этом я говорю - я имею в виду яркость, контролируемую этим компонентом L. Угадайте, что это яркость).
Поэтому, активировав L, я тащил ползунок слева вверх, пока B не достиг 255:
Теперь прочитайте полученные значения RGB:
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 ответ
Итак, вы хотите преобразовать цвет RGB в цветовое пространство Lab? Конечно, это возможно.
Но есть много разных стандартов, на которые все ссылаются с общим названием "Lab". Вам нужно будет выбрать один для использования при написании вашего алгоритма. В частности, Photoshop использует стандарт CIELAB D50, поэтому вы можете использовать его, если вам необходимо точно моделировать его обработку.
Еще одна вещь, которую вы должны иметь в виду, это то, что модель RGB зависит от устройства, а это означает, что для преобразования из RGB в Lab сначала необходимо преобразовать RGB в не зависящее от устройства абсолютное цветовое пространство. Adobe делает это с их форматом "Adobe RGB", но вы можете использовать что-то стандартное, например, sRGB. Процесс настройки учитывает аппаратную зависимость цвета RGB, но преобразует цвет в тот, который не зависит от устройства. Получив это, вы можете сделать последний шаг по преобразованию цвета в цветовое пространство Lab.
Статья Wikipedia предоставляет некоторую справочную информацию и полезные формулы при написании алгоритма преобразования. И вот кто-то, кто уже написал такой алгоритм преобразования. И один для MATLAB вы, вероятно, можете конвертировать.
В зависимости от того, насколько вы серьезны (так, вероятно, нет), вы также можете загрузить исходный код для GIMP и посмотреть, как они реализовали алгоритмы преобразования. Их программное обеспечение претендует на поддержку пространства лаборатории.
Однако будьте осторожны при конвертации обратно в RGB. Цветовое пространство Lab может представлять цвета, которые находятся за пределами диапазона sRGB. Даже в Photoshop большая часть того, что вы видите в режиме Lab, отбрасывается после преобразования изображения обратно в RGB (или CMYK).
Редактировать: Стоит также учитывать, что если ваша единственная цель - осветлить цвет в цветовом пространстве, которое лучше соответствует восприятию человеческого цвета, чем RGB, вам, возможно, вообще не придется суетиться с Lab. Многие приложения делают это путем преобразования в цветовое пространство HSL или HSV. (Фотошоп называет HSV, HSB).
Преимущество состоит в том, что вы можете просто отрегулировать значения "Lightness" или "Value", чтобы изменить интенсивность цвета (так же, как вы бы отрегулировали значение "Luminance" в цветовом пространстве Lab), но алгоритмы преобразования намного проще (и часто встроенные в стандартные библиотеки вашего языка по вашему выбору).
Например, см. Мой ответ на этот вопрос для алгоритма преобразования, написанного на языке.NET.