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

цветовое пространство. Ну, все знают о RGB: три значения, нормированные в диапазоне [0.0, 1.0], которые имеют значение интенсивности цветовых компонентов Red Green Blue; эта интенсивность подразумевается как линейная, не так ли?

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

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

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

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

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

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

...

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

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

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

...

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


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

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


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

   RESOLVED:  No.

  Whether the displayed framebuffer is displayed to a monitor that
    faithfully reproduces the sRGB color space is beyond the scope
    of this extension.  This involves the gamma correction and color
    calibration of the physical display device.

    With this extension, artists can author content in an sRGB color
    space and provide that sRGB content for use as texture imagery
    that can be properly converted to linear RGB and filtered as part
    of texturing in a way that preserves the sRGB distribution of
    precision, but that does NOT mean sRGB pixels are output
    to the framebuffer.  Indeed, this extension provides texture
    formats that convert sRGB to linear RGB as part of filtering.

    With programmable shading, an application could perform a
    linear RGB to sRGB conversion just prior to emitting color
    values from the shader.  Even so, OpenGL blending (other than
    simple modulation) will perform linear math operations on values
    stored in a non-linear space which is technically incorrect for
    sRGB-encoded colors.

    One way to think about these sRGB texture formats is that they
    simply provide color components with a distribution of values
    distributed to favor precision towards 0 rather than evenly
    distributing the precision with conventional non-sRGB formats
    such as GL_RGB8.

2 ответов


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

гамма услуги двух целей:

  • сенсорное восприятие нелинейно
  • в старые времена устройства отображения имели нелинейный отклик

гамма коррекция используется для компенсации обоих.

преобразование-это просто "линейное значение V в некоторую гамму мощности", т. е. y(v) = V^gamma

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

в течение длительного времени типичным значением гаммы было 2.2. Однако это вызвало некоторые нежелательные квантование низких значений, поэтому Adobe представила новое цветовое пространство, называемое sRGB, которое имеет линейную часть для низких значений и степенную функцию с экспоненциальной ~2.3 Для более высоких значений. Большинство устройств отображения в эти дни используют sRGB. Также большинство файлов изображений в эти дни находятся в sRGB.

поэтому, если у вас есть изображение sRGB и отображать его как есть на устройстве отображения sRGB с линейной гамма-рампой, настроенной на устройстве (т. е. видео драйвер gamma=1), вы хорошо просто используя текстурирование sRGB и framebuffer и не делает ничего другого.

редактировать из-за комментариев

подведем итоги:

  • используйте фреймбуффер ARB_framebuffer_sRGB, чтобы результаты линейной обработки OpenGL были правильно преобразованы драйверомhttp://www.opengl.org/registry/specs/ARB/framebuffer_sRGB.txt

  • Линеаризировать все цветовые входы в OpenGL

  • текстуры в sRGB цветовое пространство должно быть передано через EXT_texture_sRGB http://www.opengl.org/registry/specs/EXT/texture_sRGB.txt

  • Не гамма корректировать выходные значения (формат sRGB framebuffer позаботится об этом)

Если ваша система не поддерживает sRGB framebuffers:

  • установите линейную цветовую рампу на устройстве отображения.

  • create (linear) framebuffer objects, для линейного рендеринга в объекте framebuffer. Использование FBO заключается в правильном смешивании, которое работает только в линейном цветовом пространстве.

  • нарисуйте конечный результат рендеринга из FBO в окно, используя шейдер фрагментов, применяющий желаемую цветовую (гамма и другие) коррекцию.


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

Как правило, вы этого не делаете. Цель текстурирования sRGB и фреймбуферов такова, что вы не приходится вручную делать гамма-коррекцию. Чтения из sRGB текстуры преобразуются в линейное цветовое пространство, а записи в sRGB framebuffers принимают линейные значения RGB и преобразуют их к значениям sRGB. Это все автоматически, и более тогосвободный производительность-мудрый.

единственный раз, когда вам нужно будет сделать гамма-коррекцию, - это если гамма монитора не соответствует гамма-аппроксимации sRGB 2.2 gamma. Редко это делает монитор.

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

и яркость и контраст: должны ли они применяться до или после гамма-коррекции?

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