Гарантируется ли JPG одинаковые пиксели? - Фотопедия
6 голосов
/ 16 октября 2016

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

Насколько я могу судить, способ, которым работает darktable, заключается в создании файла sidecar, содержащего правки, которые необходимо внести в исходный файл JPG, поэтому теоретически правки не являются разрушающими (т. Е. Они не сжимают изображение в JPG каждый раз). время).

Учитывая все это, мне было любопытно - один и тот же файл JPG гарантированно дает одинаковые пиксели при рендеринге каждый раз? Например, скажем, у меня есть файл JPG, который сохранен с качеством 98%. Если я открою это при 100% -ом увеличении, будут ли у него те же пиксели, когда я открываю его в темной таблице, как и при открытии в Google Chrome? Или когда вы открываете его в фотошопе? Как насчет файлов с более высокой степенью сжатия, например 50% качество?

Ответы [ 7 ]

17 голосов
/ 21 октября 2016

Короткий ответ

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

Технические характеристики ISO

Спецификации Международной организации по стандартизации (ISO) для JPEG имеют следующие спецификации для декодеров (выделено мной):

Декодер должен

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

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

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

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

Но с чего бы это было иначе?

В отличие от bmp или png, jpeg хранит не сами пиксели, а описание изображения. Для восстановления отдельных пикселей используется сложный математический алгоритм. После каждого шага алгоритм сохраняет результат в памяти. Здесь все может пойти не так: значение в памяти имеет определенную точность, точность машины . Из-за этого значение должно быть округлено. Хотя спецификации гарантируют, что используется минимальная точность, максимума нет. Таким образом, округление может быть различным для каждой реализации. Это может даже зависеть от используемого оборудования, так как некоторые процессоры используют больше битов точности, чем требуется. Некоторые ранние процессоры Pentium даже делали это неправильно.

Крошечный упрощенный пример: вычисление 5 * 0,12 путем многократного добавления.

Сохраняя промежуточные значения, используя одну цифру точности, компьютер может сделать это: 0,12 + 0,12 = 0,24, сохранить промежуточный результат как 0,2 (округление в меньшую сторону). Затем вычислите 0,2 + 0,12 = 0,32, сохраните как 0,3 (опять же, округлив вниз). Продолжайте эту модель, и результат будет 0,5 вместо ожидаемого результата 0,6. Если бы использовалась более высокая точность (например, две цифры), результат был бы другим.

9 голосов
/ 21 октября 2016

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

В качестве примера я попытался просмотреть изображение вверху этой страницы в двух разных браузерах: Chrome 53.0.2785.143 и Internet Explorer 11.0.9600.18426. Они выглядят идентичными, но я поместил снимки экрана в редактор изображений и увеличил разницу. Вы можете видеть, что они не одинаковы.

Вот оригинальное изображение:

Original image

А вот и улучшенная визуализация двух браузеров:

Enhanced difference

4 голосов
/ 16 октября 2016

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

  • цветовое пространство фотографии соответствует цветовому пространству системы управления цветом
  • Вы просматриваете изображение в масштабе 100%, т.е. выводите пиксель на пиксель на монитор

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

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

Когда изображение масштабируется, разница между алгоритмами изменения размера будет отображаться аналогично.


Это может быть слишком сложно, но, вероятно, вы хотели бы знать.

4 голосов
/ 16 октября 2016

один и тот же файл JPG гарантированно дает одинаковые пиксели при рендеринге каждый раз?

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

Как насчет файлов с более высокой степенью сжатия, например, 50% качество?

Тогда цифры в списке будут другими. (больше нулей) Кроме этого, нет никакой разницы.

2 голосов
/ 17 октября 2016

Большинство схем кодирования JPEG не предназначены для того, чтобы быть точными, они «воспринимаются без потерь». Такой принцип будет применяться в реализациях алгоритмов кодирования и декодирования.

Разумно ожидать, что в декодере будут реализованы некоторые оптимизации, которые благоприятствуют производительности по сравнению с точностью, что управление цветом может вообще не быть реализовано и что преобразование RGB-Y'CrCb не будет одинаковым для декодеров. *

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

1 голос
/ 21 июля 2018

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

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

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

JPEG variations

Декодеры JPEG knusperli и jpeg2png предназначены для уменьшения артефактов JPEG в пределах ограничений, допускаемых алгоритмом JPEG. Они выдают результат, который должен давать те же данные, которые были введены при повторном квантовании с теми же настройками. (Если я правильно понимаю их работу, они игнорируют различия, которые могут быть вызваны ошибками округления.) В результате им требуется больше времени для декодирования, и их вывод отличается (лучше?), Чем у других декодеров.

Вот 100% зерновых культур, показывающих разницу между libjpeg (слева) и jpeg2png (справа):

jpeg2png example

0 голосов
/ 16 октября 2016

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

JPG Quality 50 - это всего лишь 50, просто число, это НЕ 50%.
JPG 100 не 100% ничего. 100 довольно хороший JPG, но все еще JPG.

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

Кодирование (создание) JPG часто отличается в каждой программе. Есть несколько вариантов, по-разному предполагаемых в разных программах. Качество 80 в одной программе вряд ли соответствует качеству 80 в другой программе.

Я предполагаю, что декодирование (показ) JPG является стандартным, показывая, что было закодировано.

JPG сегодня лучше, чем раньше, но все еще есть артефакты JPG.

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

Другим типом артефакта JPG является размытие или эхо острых краев, несколько смещенных относительно исходного края.

См. http://www.scantips.com/basics09b.html для некоторых образцов артефактов JPG.

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

...