Цветовые пространства, гамма и улучшение изображения - PullRequest
13 голосов
/ 18 июня 2011

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

Гамма .Насколько я понимаю, гамма - это функция, которая отображает компоненты цвета 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 основано на типичных (нелинейных) характеристиках монитора, ожидаемых в слабо освещенном офисе.Он был стандартизирован Международной электротехнической комиссией (МЭК) как МЭК 61966-2-1.Цветовое пространство sRGB примерно соответствует гамма-коррекции 2.2.


Обеспечивает ли это расширение какие-либо форматы буфера кадров sRGB или гарантирует, что изображения, отображаемые с текстурами 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.

Ответы [ 3 ]

8 голосов
/ 18 июня 2011

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

Гамма обслуживает две цели:

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

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

Преобразование - это просто "линейное значение V в некоторую степень Гаммы", т. Е. Y (v) = v ^ gamma

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

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

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

РЕДАКТИРОВАТЬ из-за комментариев

Просто подведу итог:

  • Используйте кадровый буфер 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)

Если ваша система не поддерживает кадровые буферы sRGB:

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

  • создание (линейных) объектов кадрового буфера для линейного рендеринга в объекте кадрового буфера. Использование FBO для правильного смешивания работает только в линейном цветовом пространстве.

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

6 голосов
/ 18 июня 2011

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

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

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

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

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

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

0 голосов
/ 30 апреля 2019

RGB

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

Нет.Значения RGB являются бессмысленными числами, если не определена их связь с конкретным пространством / кодировкой.Они могут быть линейными, гамма-кодированными или лог-кодированными, или использовать составную кривую передачи, такую ​​как спецификации Rec709 и sRGB.

Кроме того, они относятся к своим основным цветам и белой точке, как определено в цветовом пространстве, например,, # 00FF00 в sRGB - это цвет, отличный от # 00FF00 в DCI-P3.

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

sRGB - это стандартное "стандартное" цветовое пространство RGB для Интернета и вычислений общего назначения.Это относится к Rec709, стандартному цветовому пространству для HDTV.

ГАММА, иначе ПЕРЕДАЧА ПЕРЕДАЧИ

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

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

Перед цифровым гамма также использовалась в системе вещания NTSC, которая подавляла видимоешум в сигнале, аналогично тому, как гамма изображения предотвращает появление «полосатых» артефактов на 8-битном изображении на канал.

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

Гамма CURVE .Гамма-кривая sRGB легко доступна.Вот ссылка Википедии для перехода от sRGB к линейному.Вы также можете использовать «упрощенный» метод, который просто использует кривую степени 2.2:

linearVideo = sRGBvideo^2.2 и упрощенное обратное, чтобы вернуться к sRGB:

sRGBvideo = linearVideo^0.4545

Использование упрощенной версии приведет к появлению незначительных гамма-ошибок. Рекомендуется использовать «правильную» кривую для критических операций или в тех случаях, когда изображение будет многократно повторяться.

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

2,8 ???Что это за монитор?PAL?Это необычно - хотя в спецификации PAL сказано, что 2.8 не «практичен».Мониторы обычно составляют от 2,3 до 2,5 в зависимости от того, как они настроены.Когда вы настраиваете уровень черного и контраст (уровень белого), вы по сути настраиваете воспринимаемую гамму в соответствии с условиями просмотра (комнатное освещение).

Только FYI, в то время как sRGB "сигнал" имеет закодированную гамму 1/2.2, монитор обычно добавляет показатель степени около 1,1

. Для Rec709 кодированный сигнал имеет эффективную гамму около 1 / 1,9 иша, но монитор в эталонной среде просмотра составляет около 2,4

* 1056.* В обоих случаях имеется преднамеренное усиление гаммы системы.

Если вы хотели закодировать изображение с гаммой для дисплея 2,8, и вы не хотели усиления усиления гаммы системы, то показатель степени равен 1 / 2,8

«Самая высокая» гамма в общем использовании для цифрового кино (а также Rec2020), на уровне 2.6. Для тех из вас, кто думает PAL и 2.8, я рекомендую вам прочитать Пойнтон на эту тему:ЧТЕНИЕ

Часто задаваемые вопросы по гамме Чарльза Пойнтона легко читаются и полностью описывают эти проблемы и почему они важны в конвейере изображений. Также прочитайте его FAQ по цвету по той же ссылке.

Несколько слов о линейной и sRGB

Работа с изображениями в линейном рабочем пространстве, как правило, идеальна, поскольку она не только упрощает математику, но и излучает свет в реальном мире. Свет в мире работает линейно (аддитивно). Но если вы работаете в линейном режиме, вам нужна адекватная битовая глубина, а 8 бит недостаточно.

Человеческое восприятие НЕ линейно. Гамма-кодирование изображения использует преимущества нелинейности, чтобы максимально использовать 8-битные контейнеры изображения. Когда вы переводите в линейный режим, вам нужно больше битов. 12 бит на канал считается минимумом, но 16-битное число с плавающей запятой - это минимальный «рекомендуемый метод» для линейных рабочих пространств

Если используются текстуры в среде линейного рендеринга, эти текстуры необходимо преобразовать в линейное пространство (и часто более глубокую битовую глубину). Хотя добавленные биты увеличивают пропускную способность данных, упрощенная математика часто позволяет ускорить вычисления.

sRGB - это пространство DISPLAY REFERRED, оно предназначено для ЦЕЛЕЙ DISPLAY и для хранения изображений в компактном состоянии «готовность к отображению». Черный - это 0, а белый - 255, а кривая передачи близка к 1 / 2.2

.

sRGB основан на Rec709 (HDTV) и использует идентичные основные цвета и точку белого. Но кривая передачи и кодировка данных разные. Rec709 предназначен для отображения на более высоком гамма-мониторе в затемненной гостиной и кодирует черный в 16 и белый в 235.

...