Подтвердить что ты не робот

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

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

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

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

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

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

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

EXT_texture_sRGB представляет новый формат текстуры, который используется для линеаризации значений текста в линейном пространстве 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?

   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.
4b9b3361

Ответ 1

К сожалению, 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:

  • Установите линейный цветовой диапазон на вашем устройстве отображения.

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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-битном изображении на канал.

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

Гамма-кривая. Гамма-кривая 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 в зависимости от того, как они настроены. Когда вы настраиваете уровень черного и контраст (уровень белого), вы по сути настраиваете воспринимаемую гамму в соответствии с условиями просмотра (комнатное освещение).

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

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

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

Если вы хотели закодировать изображение с гаммой для дисплея 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.