Цветовые пространства, гамма и улучшение изображения

Цветовое пространство . Что ж, про RGB знают все: три значения, нормированные в диапазоне [0.0,1.0], которые имеют значение интенсивности цветовых компонентов Красный Зеленый Синий; эта интенсивность считается линейной, не так ли?

Гамма . Насколько я понимаю, гамма - это функция, которая сопоставляет компоненты цвета RGB с другим значением. Погуглив по этому поводу, я видел линейные функции и нелинейные функции ... Кажется, что линейные функции масштабируют компоненты RGB, поэтому кажется, что они настраивают яркость изображения; нелинейные функции, кажется, «распаковывают» более темные / более светлые компоненты.

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

OpenGL работает с использованием линейного цветового пространства RGB и компонентов с плавающей запятой. В самом деле, я мог вычислить значения с гамма-коррекцией, начиная с этих значений (со специальной точностью с плавающей запятой), чтобы они отображались после фиксации значения с гамма-коррекцией.

Сначала я определю гамма-кривую. Как я мог это определить? (аналитически или с использованием таблиц поиска)

Затем я подошел к исследованию расширения OpenGL EXT_framebuffer_sRGB, которое, кажется, очень связано с расширением EXT_texture_sRGB .

EXT_texture_sRGB представляет новый формат текстуры, который используется для линеаризации значений textel в линейное пространство RGB. (сноска 1) Таким образом, я знаю цветовое пространство sRGB и использую его как линейное цветовое пространство RGB.

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

...

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

Может, я все же смогу скорректировать гамму, даже в буфере sRGB? Или мне лучше нет? И яркость и контраст: применять до или после гамма-коррекции?

Это много информации, сейчас я запутался. Надеюсь, что кто-нибудь из вас сможет подробнее объяснить мне все эти концепции! Спасибо.

...

Есть еще вопрос. В случае, если гамма устройства отличается от "стандартной" 2.2, как мне "накапливать" разные гамма-коррекции? Я не знаю, ясно ли: в случае, если значения RGB изображения уже скорректированы для монитора со значением гаммы 2,2, но монитор имеет значение гаммы 2,8, как мне исправить гамму?


(1 ) Вот отрывок, чтобы подчеркнуть, что я имею в виду:

Цветовое пространство sRGB основано на типичном (нелинейном) мониторе. характеристики ожидаются в тускло освещенном офисе. Это было стандартизировано Международной электротехнической комиссией (МЭК) как IEC 61966-2-1. Цветовое пространство sRGB примерно соответствует 2,2 гамма-коррекция.


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

  РЕШЕНИЕ: Нет.

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

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

  С помощью программируемого затенения приложение может выполнять
  преобразование линейного RGB в sRGB непосредственно перед излучением цвета
  значения из шейдера.  Даже в этом случае смешивание OpenGL (кроме
  простая модуляция) будет выполнять линейные математические операции со значениями
  хранится в нелинейном пространстве, что технически некорректно для
  Цвета в кодировке sRGB.

  Один из способов подумать об этих форматах текстур sRGB состоит в том, что они
  просто предоставить цветовым компонентам распределение значений
  распределены в пользу точности до 0, а не равномерно
  распределение точности с обычными форматами без sRGB
  например GL_RGB8.
 

13
задан Luca 18 June 2011 в 17:58
поделиться