Разве все цифровые изображения в конечном итоге не являются значениями пикселей в диапазоне от 0 до 255? - Фотопедия
56 голосов
/ 09 мая 2018

У меня есть несколько невероятно простых (глупых?) Вопросов об изображениях; в частности, форматы изображений и значения пикселей.

Простите, я не фотограф. Я просто тот, кто работает с изображениями, а для меня они просто строки и столбцы чисел.

Мои вопросы:

Если в основе фотографии лежат только 3 канала значений пикселей [0, 255] X RBG, то как может быть какая-либо разница между любыми двумя форматами изображений? Я имею в виду, что делает RAW отличным от TIFF - не ограничены ли они значениями от 0 до 255? Число - это число - не должен ли быть возможен только один заданный формат? Или же два файла с одинаковой высотой и шириной не должны иметь одинаковый размер файла?

Кроме того, с цифровой точки зрения, что отличает 16-битные изображения от 32-битных? Опять же, изображение - это просто массив с целочисленными значениями от 0 до 255.

Продолжая с этой точки зрения, что изображение в файловой системе компьютера - это просто 3-канальный массив целых чисел в диапазоне от 0 до 255, какой смысл сжимать изображение в формат с потерями, например, JPG? Скажем, алгоритм сжатия изменяет некоторые значения пикселей с 254 до 255 или как угодно. Так? Как это обеспечивает экономию размера файла или влияет на качество изображения?

Я знаю, что существует много разных способов хранения данных изображений. Но я не спрашиваю ни о чем, кроме основного 3-канального изображения RBC. Все, что я знаю, это то, что, если кто-то вручит мне один из них, у меня теперь есть массив чисел. У меня нет причин знать, почему один массив чисел может отличаться от другого массива чисел от 0 до 255. Надеюсь, это имеет смысл. Этот вопрос не ограничивается форматом RAW! Скорее, речь идет о любом массиве значений пикселей

Ответы [ 15 ]

73 голосов
/ 09 мая 2018

Извините, но ваша основная предпосылка неверна: изображение может быть закодировано как массив пикселей RBG с 8 битами на значение, но есть много других способов:

  • один канал с одним битом / каналом (чистый черный и белый),
  • один канал с x бит / канал (в оттенках серого, x обычно равен 8 или 16, что дает значения 256 или 65536),
  • различные форматы на основе палитры (ср. GIF)
  • полноцветный с (по крайней мере, теоретически) количеством каналов на любой требуемой глубине в битах.

И это для изображения, хранящегося в оперативной памяти компьютера во время редактирования / просмотра. Я игнорирую различные существующие форматы изображений RAW (здесь и далее в этом посте).

Для фотографии наиболее распространенными являются 3 канала с 8, 16 или 32 бит / канал (обычно целочисленные, но по крайней мере некоторые программы работают внутри с 32-битными числами с плавающей запятой). Часто есть 4-й канал (альфа), особенно когда программа позволяет использовать слои. И где-то размеры массива изображения должны быть сохранены.

Существуют различные причины для этих разных форматов. Что касается формата в памяти, то важным фактором были размер данных и скорость (гораздо быстрее манипулировать одним 8-битным каналом, чем 4 32-битными каналами). Это менее важно в наше время, но мы получили полное управление цветом с различными цветовыми пространствами. Некоторым из них (например, prophoto RGB) необходимо по крайней мере 16 бит / канал, чтобы различия между соседними цветами были достаточно малыми, чтобы избежать видимых полос. А поскольку обработка усложняется, есть преимущества использования 32-разрядных чисел с плавающей запятой (где цвета кодируются значениями от 0,0 до 1,0, а обработка допускает промежуточные значения вне этого диапазона).

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

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

Тогда существуют разные способы сжатия данных изображения для хранения файлов. Одним из более простых является RLE (Run Length Encoding), где вы сохраняете счетчик и значение пикселя всякий раз, когда сталкиваетесь с повторяющимся значением пикселя. Другие, такие как jpeg, намного сложнее, но также дают гораздо большее сжатие. Например. jpeg использует косинус-преобразование и отбрасывает (менее видимую) высокочастотную информацию, обеспечивая высокие коэффициенты сжатия за счет потери информации (это еще не все, но это слишком долго).

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

Затем происходит постоянное развитие, например, методы сжатия без потерь, с которыми существующие форматы не всегда могут справиться.

Таким образом, мы получаем различные форматы файлов с различными компромиссами между точностью сохраненной информации, занимаемым дисковым пространством и скоростью чтения, записи и передачи (сравните размер несжатого TIFF и достойного качество jpg).


После просмотра отредактированного вопроса, некоторые дополнительные аспекты:

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

Но вы должны будете знать, есть ли у вас обработанное изображение или необработанное изображение, поскольку между ними есть два важных различия:

  • необработанные изображения обычно имеют 1 цвет на пиксель , а пиксели обычно располагаются в массиве Байера с 2 зелеными, 1 красным и 1 синим пикселем на квадрат из 4 пикселей. Значения пропорциональны интенсивности сцены (за исключением очень низких и очень высоких значений).
  • обработанные изображения могут быть упорядочены в виде двумерного массива записей, содержащего 3 числовых значения, или в виде цветовых плоскостей (3 двумерных массива, по одному для каждого из R, G, B). Кроме того, значения обычно не пропорциональны интенсивности сцены . Хуже того, точное соотношение между значениями пикселей и интенсивностями сцены зависит от обработки изображения. И баланс между цветами был настроен так, чтобы соответствовать реакции человеческого глаза (баланс белого, красный и синий усилены относительно зеленого).

Таким образом, если вы получаете необработанное изображение с 3 значениями цвета на пиксель, то это необработанное изображение уже подверглось некоторой обработке (по крайней мере, либо демозаизация , либо простое объединение 4 необработанных пикселей в 1 пиксель изображения). Приемлемо ли это, будет зависеть от вашей заявки.

49 голосов
/ 09 мая 2018

Если в основе, фотографии - только 3 канала значений пикселей [0, 255] X RBG,

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

тогда как может быть какая-либо разница между любыми двумя форматами изображений? Я имею в виду, что делает RAW отличным от TIFF - не ограничены ли они значениями от 0 до 255?

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

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

TIFF обозначает теговый формат файла изображения , и это очень интересный формат, поскольку он может содержать множество различных представлений изображения. Один файл TIFF может содержать «одно и то же» изображение нескольких размеров, например эскиз, изображение с разрешением экрана и изображение с разрешением печати, а также может иметь цветную и полутоновую версии. Знаете ли вы, что факсимильные аппараты обычно отправляют свои данные в виде файлов TIFF? Чтобы получить пиксели RGB из файла TIFF, вам необходимо понимать не только формат TIFF, но и формат конкретного представления изображения в этом файле.

Число - это число - не должен ли быть возможен только один заданный формат?

Нет. Существует множество различных форматов изображений, поскольку каждый из них обслуживает разные потребности. Сжатие JPEG с потерями отлично подходит для получения очень маленьких файлов изображений, но не подходит для изображений, которые необходимо редактировать. несколько раз. В некоторых форматах используется чередование , что позволяет очень быстро считывать изображение в нескольких различных разрешениях. И так далее ... каждый формат предлагает свое сочетание преимуществ и компромиссов.

Или не должны ли два изображения одинаковой высоты и ширины иметь одинаковый размер файла?

Нет, это было бы ужасно. Если бы размер каждого файла изображения был по существу width * height * 3 (при условии 24-битного цвета), то вы бы потратили лот места для хранения. Большинство фотографий содержат много избыточности, то есть областей, где один и тот же цвет повторяется много раз. Чтобы сэкономить место для хранения, часто имеет смысл устранить эту избыточную информацию. Например, один из способов сделать это - кодировка длины выполнения или RLE. Например, если у вас есть область из 4195 последовательных пикселей, которые все белые, гораздо эффективнее кодировать это как «следующие 4195 пикселей - это все {255, 255, 255}» вместо простого хранения такого количества белых пикселей файл. RLE фактически используется в некоторых форматах изображений, но многие форматы имеют гораздо более сложные схемы, которые экономят намного больше места, и это означает, что вы можете хранить гораздо больше изображений на жестком диске или карте памяти. Это также значительно ускоряет отправку изображения кому-либо еще.

Продолжая с этой точки зрения, что изображение в файловой системе компьютера - это просто 3-канальный массив целых чисел в диапазоне от 0 до 255, в чем смысл сжатия изображения в формат с потерями, например, JPG?

Дело в том, что он делает файл намного меньше. Сжатие JPEG часто уменьшает размер файла в 10 и более раз. Это означает, что вы можете разместить больше изображений на определенном устройстве хранения, вы можете копировать их быстрее, вы можете открывать их быстрее и вы можете загружать и загружать их быстрее. Хранение одного и того же изображения (или почти такого же) в гораздо меньшем пространстве использует ресурсы более эффективно и, следовательно, снижает стоимость. Подумайте об этом в широком масштабе: вполне вероятно, что очень большой процент информации, доступной в Интернете, состоит из изображений и фильмов, и без сжатия нам потребуется больше или больше центров обработки данных и потреблять гораздо больше энергии.

Скажем, алгоритм сжатия изменяет некоторые значения пикселей с 254 на 255 или что-то еще. Так? Как это обеспечивает экономию размера файла или влияет на качество изображения?

Рассмотрим мой пример RLE выше. Допустим, у вас есть фотография с большой глухой стеной, поэтому большие области фотографии имеют один и тот же цвет, за исключением того, что на снимках немного более темные пиксели, едва заметные на изображении. Эти пиксели снижают эффективность сжатия. Вместо того, чтобы просто сказать: «все следующие 500 000 пикселей - это все {243, 251, 227}», вы должны запустить кодирование длины намного большего количества меньших фрагментов, потому что время от времени вы сталкиваетесь с одним из этих немного разных пикселей. Если вы позволите алгоритму сжатия вносить небольшие изменения, возможно, изменяя только один пиксель не более чем на 1% или 2%, то вы можете получить гораздо более высокий коэффициент сжатия без заметного изменения изображения. Это компромисс: вы отказываетесь от небольшого количества информации в исходном изображении в обмен на значительное уменьшение размера файла. Место, где вы хотите нарисовать эту линию, может измениться, поэтому форматы с потерями, такие как JPEG, позволяют пользователю выбирать, какой уровень сжатия он / она хочет.

18 голосов
/ 09 мая 2018

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

Кодеки предназначены для:

  • Будьте без потерь против с потерями
  • Быстрое кодирование против уменьшение размера файла
  • Асимметричный против Симметричный en- / decoding
  • Быть совместимым с программным обеспечением
  • Быть воспринимаемым почти без потерь в различных уровнях сжатия / ситуациях
  • Имеют функции, которые не предлагают другие кодеки, в том числе:
    • без роялти
    • поддержка слоев
    • поддержка альфа-канала (например, RGBA) / прозрачность
    • предлагают быстрый просмотр в Интернете
    • поддержка высокой (er) битовой глубины
    • поддержка нескольких цветовых пространств (RGB / CMYK)
    • поддержка метаданных / управления версиями / ...

Некоторые из этих вещей взаимоисключающие. И из-за этого у нас осталось множество кодеков.


Несколько примеров

Примечание: Ни полный список кодеков, ни все их функции (или их отсутствие) не упомянуты. Если этот ответ окажется кому-то полезным, я мог бы добавить больше информации (и быть немного более точным).

Возможно, наиболее известный формат - JPEG . Это очень широко поддерживаемый, но старый формат. Он использует DCT (дискретное косинусное преобразование), поэтому, несмотря на то, что он предлагает довольно хорошее качество при самых высоких настройках качества, блокировка будет отображаться при более низких настройках.

Затем JPEG 2000 пришли на смену JPEG: он основан на вейвлет-преобразовании, поэтому, хотя он предлагает примерно то же качество, что и JPEG, в настройках более высокого качества, он предлагает намного лучшее качество при более низких настройках качества (блоки немного размыты). Кроме того, JPEG 2000 предлагает интересующие области (высокое качество в одной области изображения, более низкое качество в другом месте) и поддержку 16 бит. (Кроме того, некоторые другие вещи.) К сожалению (?), Потому что это дороже вычислений, чем JPEG и из-за некоторых проблем с лицензированием, JPEG 2000 не так широко поддерживается, как JPEG.

PNG - это еще один широко известный формат - он без потерь и поддерживает альфа-каналы, но не предлагает поддержку цветовых пространств не-RGB (например, CMYK). Таким образом, это формат «только онлайн».

Затем существуют форматы VFX, такие как OpenEXR . Все они вращаются вокруг качества и скорости: OpenEXR без потерь, поддерживает до 64 бит и быстро кодирует / декодирует. Он в основном используется в индустрии VFX в качестве промежуточного формата.

TIFF - еще один формат без потерь, который очень популярен среди фотографов. Для сжатия он не предлагает / ZIP / RLE / LZW / JPEG. Поддерживает до 32 бит. С возможностью выбора сжатия он достаточно адаптивный, но из-за своей потери он больше в автономном формате.

HEIF - один из последних кодеков изображений. Он использует то же сжатие, что и HEVC / h.265, и поэтому, как ожидается, даст лучший коэффициент сжатия, чем JPEG. Тем не менее, поскольку он является довольно новым и потому что на него распространяются патенты, он не так широко поддерживается, как любой из вышеперечисленного.

RAW-изображения См. Также на самом деле не являются реальными изображениями: они являются скорее контейнером для сырья (отсюда и имя) данные считывания датчика. Только с программным обеспечением, которое знает, как интерпретировать данные, возможно получить изображение. Вот почему конвертеры RAW, такие как Lightroom / Capture One / DarkTable / ..., нуждаются в обновлениях для поддержки новых камер, которые используют уже указанные контейнеры, такие как * .CR2 для Canon. Это также причина, почему 14-битный RAW предлагает больше опций редактирования, чем 32-битный TIFF, который вы экспортировали из того же RAW.


Intermisision: Lossless против lossy

Я до сих пор не уверен, что вы на самом деле спрашиваете, поэтому я подумал, что не мешало бы добавить небольшое объяснение о потерях против потерь.

Сжатие без потерь работает путем выполнения кодирования по длине прогона (RLE) / Кодирование Хаффмана / ... для сжатия данных , Сами данные не изменяются, но сохраняются в меньшем пакете. Например, возьмем RLE: скажем, у нас есть битовый поток R-канала (от пикселя 0,0 до пикселя 0,11) 255,255,255,255,255,215,215,235,100,000,000,000 - RLE закодирует это как 52552215123511003000 - это намного меньше, и так как мы знаем что он сохранен в группах из 4 цифр и что первая цифра является счетчиком, а последние три цифры являются значением, тогда мы можем восстановить полное значение 255,255,255,255,255,215,215,235,100,000,000,000.

Сжатие с потерями , с другой стороны, пытается сжать даже дальше, чем без потерь. Чтобы сделать это, кодеки с потерями обычно пытаются удалить вещи, которые наше восприятие не получает. Возьмем, к примеру, модель JPEG YUV (YCbCr, действительно) (и почти каждый видеокодек): Y = Luminance, Cb = Chrominance Blue, Cr = Chrominance Red. Человек не может различить разницу между 4:2:0 (каждый пиксель имеет значение яркости, но цвета сохраняются в блоках 2x2 поочередно) и 4:4:4 (каждый пиксель имеет яркость и оба цветовых канала) закодированную картинку. Это связано с физиологией нашего глаза : мы не можем видеть различия в цвете, а также видим различия в яркости.

В большинстве случаев это работает хорошо, но сравните его с файлом MP3: почти никто не может различить разницу между 192 кбит / с и 320 кбит / с, но скорость ниже 64 кбит / с, и все становится ужасно быстро. Кроме того, перекодирование будет дополнительно снижать качество, так как могут появиться нежелательные артефакты (например, в JPEG небольшие блоки из кодировок высокого качества будут рассматриваться как детали изображения в последующих кодировках).


Итог

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

Если, однако, вам нужна какая-то конкретная функция, возможно, (и почти наверняка) будет кодек, который ее охватил.

10 голосов
/ 09 мая 2018

Если в основе, фотографии - только 3 канала значений пикселей [0, 255] X RBG

Это серьезно нарушенное предположение, и остальная часть вашего вопроса просто не отвечает, не отрываясь от него.

Я имею в виду, что отличает RAW от TIFF - не ограничены ли они значениями от 0 до 255?

Термин «необработанный» может относиться к двум различным вещам: к «необработанному изображению» или к файлу, который содержит необработанные данные изображения без заголовков.

Изображение «Camera Raw» сохраняет необработанные данные по мере их выхода из датчика. Большинство современных датчиков камер имеют АЦП с более чем 8 битами, но они также собирают данные об интенсивности только для одного цветового компонента в каждом месте. Объектив может искажать геометрию, значения интенсивности от АЦП могут не очень хорошо отражать восприятие интенсивности людьми, цветовые компоненты могут не соответствовать точно тем, которые используются вашим монитором и т. Д.

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

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

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

Файлы, содержащие необработанные данные изображений без заголовков, используются редко, потому что вам необходимо знать их формат и размеры, прежде чем вы сможете их прочитать. Некоторые инструменты обработки изображений поддерживают их.

Кроме того, с цифровой точки зрения, что отличает 16-битные изображения от 32-битных?

К сожалению, "n бит" может означать две разные вещи. Это может означать, что все компоненты цвета сведены в битовое число (например, 5 бит для красного, 5 бит для синего и 6 бит для зеленого для 16 бит или 8 бит красного, 8 бит зеленого, 8 бит синего и 8 бит альфа для 32 бит) или at может означать, что у каждого компонента цвета есть n битов информации в каждом местоположении пикселя.

Продолжая с этой точки зрения, изображение в файловой системе компьютера представляет собой просто 3-канальный массив целых чисел в диапазоне от 0 до 255

.

Опять же, эта точка зрения просто неверна.

Файл представляет собой последовательность байтов, но эти байты почти никогда не "просто 3-канальный массив целых чисел в диапазоне от 0 до 255"

Вы можете сохранить изображение таким образом. Некоторые инструменты даже поддерживают чтение и запись таких файлов, но проблема в том, что вам нужно знать о файле, прежде чем вы сможете его прочитать. Предположим, у вас был такой файл размером 3000 байт, у вас есть 1000 24-битных пикселей RGB? 3000 8 битных оттенков серого? 3000 8 битных пикселей с поддона? В каком порядке находятся цветовые компоненты? какая форма изображения? цветовые компоненты в порядке RGB или BGR? Если вы не знаете ответы на эти вопросы, вы не сможете осмысленно прочитать такой файл.

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

Какой смысл сжимать изображение в формат с потерями, например, JPG? Скажем, алгоритм сжатия изменяет некоторые значения пикселей с 254 до 255 или как угодно. Так? Как это обеспечивает экономию размера файла или влияет на качество изображения?

Алгоритмы сжатия не просто «меняют значения», они кодируют информацию совершенно по-другому, например, JPEG можно грубо описать как

  • Преобразование данных из RGB в YUV
  • (опционально) уменьшает разрешение каналов цветности в 2 раза в одном или обоих измерениях
  • Разделить данные для каждого канала на блоки 8x8.
  • Преобразование блоков в частотную область с использованием дискретного косинусного преобразования
  • Количественное определение результатов, сохранение низкочастотной информации и снижение точности высокочастотной информации.
  • Кодировать результирующие числа в виде последовательности байтов, используя схему кодирования переменной длины (кодирование Хаффмана или арифметическое кодирование)
  • Сохраните эти байты в файле вместе с соответствующими заголовками.

С другой стороны, сжатые без потерь форматы часто основаны на алгоритмах сжатия данных общего назначения, но иногда дополняют их предварительной обработкой изображений, например, PNG.

  • Преобразовать данные в один из поддерживаемых форматов (например, биты для красного, зеленого и синего в этом порядке)
  • Для каждой строки изображения, выполняющей процессы «фильтрации», есть несколько вариантов фильтрации (включая фильтрацию вообще), но общая цель состоит в том, чтобы взять информацию, относящуюся к изображению, с которой пиксель может быть похож соседей и закодируйте его так, чтобы «deflate» мог с этим справиться.
  • Сжатие отфильтрованных данных с использованием универсального алгоритма сжатия "deflate".
  • Сохраните эти байты в файле вместе с соответствующими заголовками.
9 голосов
/ 09 мая 2018

Есть несколько причин, по которым это предположение неверно, и все они сводятся к одному:

Какой масштаб вы на самом деле используете?

И это можно разбить немного дальше:

Что такое 255?

«Цвет» не является свойством физической вселенной. Это ощущение, которое возникает в уме. И включает такие вещи, как "синий", "зеленый" и "красный". Шкала от 0, означающая «вообще нет синего» до 255, означающая «все синее!» на самом деле не может быть 255, представляющих платоновский идеал синего , потому что ... в реальном мире нет такой совершенной вещи. Итак, значит ли это:

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

Звук придуман? Нету! На самом деле это реальных примеров. Проверьте эти представления каждого выбора. Изогнутая область представляет собой 2D-срез цветового пространства человеческого зрения, и треугольник показывает область, которая может быть представлена ​​с определенным выбором красного, зеленого или синего.

Во-первых, вот профиль для экрана моего ноутбука, который довольно типичен для современных устройств среднего уровня:

ThinkPad X260

Теперь вот пространство Adobe RGB. Обратите внимание, насколько это больше, чем то, что может показать мой экран!

AdobeRGB

Итак, вот sRGB - стандарт defacto и пространство по умолчанию, обычно предполагаемое, когда ничего не указано. В большинстве ситуаций он достаточно хорош.

sRGB

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

ProPhoto RGB

Теперь добавьте цвет самого света и хроматическую адаптацию - способность системы человеческого зрения приспособить восприятие к окружающей среде. На самом деле, не просто способность: вещь, которая происходит, хотите вы этого или нет . Означает ли «чистый синий» , что эта штука выглядит такой же голубой, какой она может быть при свете ламп накаливания? Какой должна быть ценность, если мы вместо этого фотографируем на солнце?

Так что "255" может означать много разных вещей.

Что такое 0?

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

Какая у тебя кривая?

Итак, когда у вас есть конечные точки, как вы переходите от одного к другому? Человеческое восприятие яркости является решительно нелинейным . В вашей шкале 0-255, должно ли 100 быть в два раза ярче, чем 50, или это должен быть какой-то больший фактор? Должна ли разница в восприятии, скажем, между 3 и 4 быть такой же, как между 203 и 204?

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

Существует множество возможностей для самых разных нужд.

На сжатие

Вы спрашиваете.

Скажем, алгоритм сжатия изменяет некоторые значения пикселей с 254 до 255 или как угодно. Так? Как это обеспечивает экономию размера файла или влияет на качество изображения?

МоАлгоритмы сжатия Dern более сложны, чем это, но это хороший пример. Я собираюсь использовать шестнадцатеричное FF для представления 255 и FE для представления 254, и представьте, что мы используем кодирование длины серии в качестве формы сжатия. А для простоты, давайте предположим, что черно-белое вместо цвета. При этом, если у нас есть ряд данных, который выглядит следующим образом:

FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 

мы можем сжать это до очень простого

16×FF 

... это довольно очевидная экономия. В основном мы можем хранить 16 байтов в двух (один для подсчета, два для данных). Но скажем, у нас есть:

FF FF FE FF FE FF FF FF FF FF FE FE FE FF FE FE

Теперь, кодирование длин серий дает нам:

2×FF 1×FE 1×FF 1×FE 5×FF 3×FE 1×FF 2×FE

... что вовсе не экономия, и на самом деле может увеличить размер файла. Но если мы округлим все значения FE до FF, мы вернемся к первому случаю со значительным уменьшением размера, с небольшим, но, вероятно, трудно заметным влиянием на качество файла.

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

На глубине в битах

Кроме того, с цифровой точки зрения, что отличает 16-битные изображения от 32-битных? Опять же, изображение - это просто массив с целочисленными значениями от 0 до 255.

Итак ..... массив целочисленных значений в диапазоне 0-255 является восьмибитным массивом. (2⁸ = 256.) С тремя каналами это 24-битное изображение; некоторые форматы также имеют канал прозрачности («альфа») для 32 бит. Можно также использовать более высокое значение на канал, что обычно имеет в виду, когда мы говорим «16-битная глубина». Это означает, что массив идет от 0-65535 (2¹⁶ = 65536), а не 0-255. Обычно в такой схеме это в основном просто множитель, где самое высокое значение представляет одну и ту же вещь в каждой шкале, но более высокая битовая глубина дает больше возможных нюансов. (Подробнее см. этот ответ .) Существуют также некоторые специализированные форматы файлов, которые используют 64-разрядные числа с плавающей запятой (!) Вместо целых чисел или другие типы данных в зависимости от варианта использования, но основная концепция та же самая.

8 голосов
/ 09 мая 2018

Нет, изображение - это не просто значения RGB в диапазоне 0-255. Даже если вы игнорируете форматы хранения, есть много способов описать цвет. Вот несколько примеров:

  • Красные, зеленые и синие компоненты (RGB)
  • Голубой, пурпурный, желтый и черный компоненты (CMYK)
  • Оттенок, насыщенность и яркость / значение (HSL / HSV)
  • Количество света, попадающего на группу датчиков в камере
  • Количество света и его направление при попадании на датчики (в камере со световым полем )

Первые два наиболее часто используются для отображения на мониторах и для печати соответственно.

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

5 голосов
/ 09 мая 2018

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

Однако форматы файлов отличаются. По сути, существует несколько различных способов представления одного и того же изображения, как упоминалось выше: bmp, png, jpg и т. Д. Конечно, после их декодирования две кодированные версии без потерь одного и того же изображения приведут к одним и тем же матрицам. * Думайте об этом как о файле .txt, который вы сжали с помощью zip С добавлением странности, что кодирование без потерь вернуло бы текст, который не совпадает с оригиналом, но действительно близок, почти как тупая версия текста.

Придерживаясь аналогии с текстом, допустим, у вас один и тот же текст, сохраненный как .txt, .docx, .pdf и т. Д. Почему не все файлы одинаковы, если содержимое одинаковое? (Хорошо, txt не имеет форматирования, но другие имеют).

Кстати, посмотрите, чем кодировка Netpbm действительно отличается от JPEG .

3 голосов
/ 11 мая 2018

Допустим, это правда, что каждый пиксель состоял из трех чисел (красного, зеленого и синего), каждое в диапазоне 0-255. Другие ответчики начали (правильно), оспаривая это предположение, но для простоты давайте просто скажем, что это правда.

Я помню (но, к сожалению, не могу найти в Интернете) карикатуру из учебника по лингвистике: два древнеегипетских резчика по камню сидят измученными у основания массивной стены, на которой высечено очень большое количество марширующих фигур. Один говорит другому: «Разумеется, должен быть более простой способ написать:« У фараона было 100 000 солдат? ». Запомните эту идею.

Теперь предположим, что первая строка вашего изображения содержит 1800 черных пикселей. Как это будет представлено?

0 0 0    0 0 0     0 0 0   ....

Так сколько места для хранения потребуется? Каждое значение является байтом. Три байта на пиксель, 1800 пикселей на строку, так что уже 5400 байтов на строку. Таким образом, изображение размером 1800 x 1200 должно занимать в 1200 раз больше, что превышает 6 мегабайт. Итак, теперь давайте поищем в Google изображения и загрузим пару изображений размером 1800x1200 - скажем, одно .png изображение и одно .jpg изображение. Посмотрите на размер файла: это 6 МБ? Нет, обычно намного меньше, чем это. И это желательно, конечно, все это экономит место и сокращает время загрузки ...

Так что происходит? Суть в том, что, даже если у вас есть столько чисел для хранения, существуют различные способы представления этих чисел в файле. Вот пример более эффективного представления прямо здесь, в моем ответе, два параграфа назад. Я написал слова «1800 черных пикселей». Это 17 символов, поэтому не нужно занимать больше 17 байт, но в то же время он точно описывает ту же информацию, для которой мы думали, что нам нужно 5400 байт. И вы, безусловно, могли бы сделать лучше, чем 17 байт (и также сэкономить много усилий в реализации кодирования / декодирования), если бы вы не использовали английский язык для кодирования этой информации, а скорее более специализированный язык. Итак, теперь мы уже представили более одного формата сжатия изображений: тот, который использует английские слова, и тот, который более эффективен, чем этот. Видите, куда это идет?

Хорошо, вы говорите, это работает, если целая группа смежных пикселей имеет один и тот же цвет. Но что если они этого не сделают? Конечно, это зависит от содержимого конкретного изображения: чем больше избыточности , тем проще сжать информации. Избыточность означает, что части изображения могут быть предсказаны довольно хорошо, если вы уже знаете другие части. Сжатие означает только запись минимума, необходимого для восстановления информации. Не каждое возможное изображение имеет избыточность, но любое реальное изображение, которое имеет значение для человеческого глаза и мозга, несмотря на то, что оно является более сложным, чем мой чисто черный пример, все же будет иметь тенденцию иметь довольно много избыточности. И есть много разных способов сжатия. Некоторые методы сжатия: без потерь , что означает, что информация может быть реконструирована так, чтобы она была математически идентична оригиналу, как в моем примере с черным рядом пикселей. Большинство .png файлов используют метод сжатия без потерь. Некоторые методы с потерями : реконструкция не идеальна, но ошибки скрыты таким образом, что человеческий глаз и мозг их едва замечают. Большинство .jpg файлов с потерями.

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

Несколько комментаторов выше сделали разумные предположения относительно того, где могло возникнуть ваше заблуждение. В вашем вопросе вы, кажется, думаете, что сжатие просто немного меняет значения пикселей (и, конечно, методы сжатия с потерями делают это местами, но только как нежелательный побочный эффект) без изменения макета информации. Когда вы открываете файл и просматриваете содержимое изображения (например, как массив чисел в Matlab или как изображение на экране в Photoshop), вы смотрите не на содержимое сжатого файла, а на реконструкцию , который имеет ту же компоновку, что и оригинал (это не будет большой реконструкцией, если он не воссоздает макет правильно). Процедура открытия файла распаковала информацию из файла в полное несжатое представление в памяти. Если вы сравните две несжатые реконструкции, то в действительности нет ничего, что могло бы отличить два разных формата изображения, из которых они были получены (за исключением ошибок восстановления, если они есть).

3 голосов
/ 09 мая 2018

Bitmaps

Растровое изображение (BMP) - это, по сути, то, что вы описываете, массив чисел, представляющих цвета пикселей. Например. что-то вроде

1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1

сжатие без потерь

Теперь давайте определим схему сжатия. В нашей схеме сжатия у нас будет массив пар чисел. Например.

3, 1, 1, 0, 7, 1

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

Очевидно, что это несколько упрощенный вид изображения (например, это всего лишь одна строка) и схема сжатия. Но, надеюсь, это позволит вам увидеть, как схема сжатия меняет формат изображения. Вот как GIF относится к BMP. GIF использует схему сжатия под названием Lempel-Ziv-Welch вместо этой упрощенной.

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

1, 0, 1, 0, 1

Кодировка

1, 1, 1, 0, 1, 1, 1, 0, 1, 1

Ну, это было бесполезно. Мы сделали вклад в два раза дольше.

Еще одно сжатие без потерь

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

Нашим первым растровым изображением станет

5, 5, 1, 3, 0, 0

Это та же длина, что и у нашего первого метода сжатия.

И наш второй может быть либо

2, 2, 1, 2, 1, 0, 2, 0, 1

Это три круга с центром в среднем элементе (который в подсчете компьютеров - номер 2, поскольку компьютеры начинают отсчитывать от 0). Один круг имеет радиус 2 и цвет 1. Затем мы добавляем круг цвета 0 и радиуса 1. Наконец, у нас есть круг цвета 1 и радиуса 0. На этапах это будет

1, 1, 1, 1, 1
1, 0, 0, 0, 1
1, 0, 1, 0, 1

или

2, 2, 1, 1, 0, 0, 3, 0, 0

Это тот же начальный круг, но покрытый двумя точечными кругами. По шагам это будет

1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1

Они оба на одну короче первой закодированной версии, но все же длиннее оригинальной.

Вы можете удивиться, почему я говорю о кругах, а не диапазонах. Основная причина в том, что круги ближе к тому, что используют реальные двухмерные изображения.

сжатие с потерями

У нас также есть концепция схем сжатия с потерями. Эти схемы сжатия без потерь могут быть возвращены в исходный массив растровых изображений. Схемы сжатия с потерями могут быть необратимыми.

Давайте рассмотрим версию метода с кругами с потерями. В этом мы будем использовать простое правило. Мы не будем хранить круги с радиусом меньше 1. Таким образом, в наших последних двух кодировках вместо этого будет

2, 2, 1, 2, 1, 0

и

2, 2, 1

, которые снова преобразованы в пиксели:

1, 0, 0, 0, 1

и

1, 1, 1, 1, 1

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

Мы описываем изображения с более строгими правилами как более низкого качества.

Это представление изображений в виде наложенных друг на друга наборов круглых форм аналогично тому, как работает формат Joint Photographic Experts Group или JPEG . Его формы - это эллипсы, а не круги, но идея похожа. Вместо нашего упрощенного метода он использует дискретное косинусное преобразование для кодирования изображений.

В отличие от GIF, JPEG на самом деле представляет собой другой способ представления изображения. GIF все еще пикселей. Они просто хранятся по-другому. JPEG это формы. Чтобы просмотреть JPEG, мы затем конвертируем фигуры в пиксели, потому что так работают экраны. Теоретически мы могли бы разработать экран, который бы не работал таким образом. Вместо пикселей он может создавать фигуры, чтобы лучше соответствовать формату JPEG. Конечно, этот экран не сможет отображать растровые изображения. Чтобы отобразить BMP или GIF, нам нужно конвертировать в JPEG.

Если вы конвертируете стандартный GIF, скажем, 300x300 пикселей, конвертируете его в JPEG и проверяете качество вниз, базовые формы, которые он использует, должны быть видны. Многие JPEG избегают этих артефактов, начиная с изображения с гораздо более высоким разрешением.

JPEG хорошо масштабируются, потому что они являются формами, а не пикселями. Поэтому, если вы начнете с изображения 8000x8000, преобразуете его в JPEG и отобразите его как изображение 300x300, большая часть потерянных деталей все равно была бы потеряна. Если сначала преобразовать растровое изображение 8000x8000 в растровое изображение 300x300, а затем в JPEG, результаты часто будут иметь более низкое качество.

MPEG

Мы говорили о неподвижных изображениях. Формат Moving Picture Experts Group или MPEG использует тот же тип сжатия, что и JPEG, но он также делает что-то еще. В то время как простой способ сделать видео состоит в том, чтобы отправить последовательность неподвижных изображений, MPEG фактически отправляет кадр, за которым следует некоторое количество кадров, перечисляющих изменения и заканчивающихся конечным кадром. Поскольку большинство кадров аналогичны предыдущему, список изменений часто меньше, чем второе изображение.

Последовательность обычно не такая длинная, скажем, пять кадров. Но это помогает сделать поток меньше, чем он был бы.

упрощений

Я много игнорировал. Мои изображения имеют только два цвета (1 бит), а не 256 8-битного изображения и, конечно, не 4 294 967 296 32-битного изображения. Обратите внимание, что даже для 8-битных изображений вы часто можете выбирать разные палитры для изображения. Таким образом, два 8-битных растровых изображения с одинаковыми последовательностями могут представлять изображения, которые выглядят по-разному (одинаковой формы, но разных цветов).

Мои изображения одиночные, а не двухмерные. Большинство изображений будут иметь определенный размер строки, делая массивы двумерными.

Я вообще не пытался представлять фактические кодировки. Они намного сложнее, чем те, которые я использовал. Я сделал это, потому что хотел описать кодировки в этом посте. Я не уверен, что мог бы объяснить Лемпеля-Зива гораздо меньше, чем более сложное уточнение Лемпеля-Зива-Уэлча в одном ответе И я не понимаю преобразований Фурье достаточно хорошо, чтобы объяснить их подробно.

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

3 голосов
/ 09 мая 2018

Для форматов RAW и TIFF, насколько я могу судить, ответ (как уже говорили другие) состоит в том, что они на самом деле не всегда используют одни и те же цветовые пространства (например, файлы RAW могут использовать больше битов на пиксель, поэтому могут хранить лучше информация о цвете).

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

Хорошим примером причины этого являются различия в сжатии между файлом PNG и файлом TIFF.

Файлы PNG используют один конкретный алгоритм сжатия. Это означает, что изображение не будет просто сохранено как большой список чисел для каждого пикселя. Упрощенный пример: он может хранить что-то вроде «в этом блоке пикселей 10x10 все пиксели имеют цвет XYZ». Затем вместо того, чтобы хранить эту информацию 100 раз, она сохраняет ее один раз, плюс немного информации о регионе, к которому относится эта информация.

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

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

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

Так что файлы TIFF более гибкие - вы можете хранить тот же массив чисел, используя меньше байтов. Но программное обеспечение, необходимое для декодирования изображения, будет более сложным и может не работать согласованно с каждым файлом TIFF, который вы к нему добавляете, например, Вы можете сохранить файл TIFF в одном программном обеспечении и не сможете открыть его с помощью другого программного обеспечения, хотя он по-прежнему работает в оригинале.

Итак, вы спрашиваете

Но я не спрашиваю ни о чем, кроме основного 3-канального РБК образ. Все, что я знаю, это то, что если кто-то вручит мне один из них, у меня теперь есть массив чисел. У меня нет причин знать, почему один массив чисел может отличаться от некоторого другого массива чисел из От 0 до 255.

Чтобы передать его вам, кто-то должен был знать, как хранится изображение и как его преобразовать в массив чисел. (Или, возможно, какое-то программное обеспечение выполняет этот перевод для вас без вашего ведома).

Вы можете попробовать сохранить изображение в формате PNG, а затем снова в формате TIFF или GIF и посмотреть его в шестнадцатеричном средстве просмотра , чтобы увидеть, как каждый из них представляет один и тот же массив чисел по-разному. Или прочитайте подробности , как PNG-файлы и TIFF-файлов внутренне представлены, чтобы дать вам представление о том, что необходимо встроить в программное обеспечение для различного считывания идентичных массивов чисел.

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...