У меня есть несколько изображений .jpg, которые ТОЧНО (точек на дюйм, размер кадра, изображение) одинаковы, за исключением того, что размер одного файла более чем в два раза превышает размер другого (в байтах). Как это может быть? Когда я увеличиваю масштаб, скажем, на 700% в одном и том же месте на каждом изображении, я вижу примерно одинаковое количество пикселей, что указывает на то, что сжатие одинаково.
Алгоритм сжатия JPEG работает следующим образом:
Итак, если вы начинаете с изображения с N пикселями, у вас изначально есть:
N + N + N = 3×N
пикселей для сохранения. Но с уменьшенной вдвое цветностью у вас есть:
N + ½N + ½N = 2×N
пикселей, а с четвёртой цветностью:
1 + ¼N + ¼N = 1.5×N
Итак, когда цветность разделена на четыре части, вы уменьшили размер данных до половины, даже не применяя сжатие. Это напрямую приводит к гораздо меньшему размеру файла.
Некоторые приложения имеют независимые настройки качества и цветности, в то время как другие используют заданную субдискретизацию в зависимости от настройки качества.
* Это работает, потому что наши глаза гораздо более чувствительны к яркости, чем к цвету. Попробуйте это (в Photoshop или Gimp):
Вы не увидите большой разницы с исходным изображением.
Если файлы имеют разный размер, единственный способ, которым данные изображения могут быть идентичными, — это если данные Exif различны (начнем с различия встроенных эскизов).
Предположим, что есть два файла, кодирующих одни и те же данные изображения. У одного нет прикрепленных данных EXIF. Другой имеет полноразмерную копию данных изображения в виде встроенной миниатюры. Разница в размере файла может быть примерно 2:1.
Но видимо изображения разные (наиболее вероятная причина).
Разница между пикселями может быть выполнена с помощью команды ImageMagick compare
, как описано в этом ответе StackOverflow .
Он уловит даже незначительные различия.
jpegtran
команды -optimize
) были бы невозможны.gzip -1
создает файлы большего размера с теми же данными, что и gzip -9
, окончательный проход сжатия без потерь в JPEG (после решений о квантовании с потерями) может компенсировать время кодирования процессора по сравнению с размером. Это не может правдоподобно объяснить разницу в размере 2: 1; обычно несколько процентов.jpegtran -optimize
.Это два разных изображения, не одной и той же сцены?
Для одного и того же качества восприятия одни изображения сжимаются лучше, чем другие .
У одного есть много гладких или размытых областей (например, небо без большого количества облаков или только объект в фокусе), а у другого много мелких деталей, особенно с острыми краями, такими как трава и кусты, где края каждой травинки и листик видны, или ситцевая ткань?
Крайние значения — равномерный белый или черный (очень маленький) и случайный шум (большой файл).
Ключевым строительным блоком для JPEG является 2D DCT (дискретное косинусное преобразование) (в каждом блоке 8x8 отдельно ), которое преобразует информацию о пространственных пикселях в частотную область . Плавный градиент имеет только низкие частоты, в то время как острые края, такие как текст, травинки и/или листья кустарника, имеют много высокочастотных компонентов. (Версия 1D пытается представить прямоугольную волну как сумму косинусов — на этом сайте есть наглядная демонстрация )
Само это преобразование не вызывает особых потерь. Но он имеет тенденцию давать множество коэффициентов, близких к нулю, и может быть округлен до нуля без большой потери визуального качества. А ненулевые коэффициенты можно округлить ( квантовать ) до менее 8 бит каждый, в зависимости от уровня сжатия. (Насколько сильно вы квантуете и насколько агрессивно вы отбрасываете почти нулевые высокочастотные компоненты, в основном это то, что делает настройка качества сжатия.)
Если бы вы выполнили аналогичное округление для необработанных данных пикселей RGB или YUV, вы бы как бы постеризовали/мультяшно изобразили изображение, сделав области похожего цвета одного цвета. Но если сделать это с частотными коэффициентами DCT, можно отбросить намного больше битов лишь с незначительным визуальным ухудшением. например, звон вокруг острых краев и другие обычные артефакты JPEG.
(Выбор того, как округлять коэффициенты, также является искусством, с некоторым учетом человеческой зрительной системы и того, что мы замечаем/не замечаем.)
После квантования остальная часть JPEG является IIRC без потерь, просто превращая этот разреженный набор ненулевых коэффициентов в битовый поток и выполняя для него сжатие без потерь (аналогично zip).
Забавный факт: это точно такая же математика, на которой основаны MP3/AAC: преобразовать в частотные коэффициенты и округлить их (и полностью отбросить незначащие). Звуковые артефакты MP3 не случайно включают «звон», как и внешний вид JPEG.
Обратите внимание, что пикселизация не является артефактом JPEG . Он имеет тенденцию сглаживать детали, предпочтительно отбрасывая высокочастотные коэффициенты (мелкие детали, включая шум датчика), а не низкочастотные (общие формы в блоке 8x8).
Вы, вероятно, знакомы с тем, как выглядит текст в формате JPEG, когда вы увеличиваете сжатие (отбрасываете/округляете больше информации, чтобы уменьшить размер файла). Сохранение достаточного количества битов, чтобы этого не произошло, — вот почему для высококачественных изображений с большим количеством деталей требуется больше битов, чем для более плавных изображений.
Текст имеет много острых краев и, следовательно, много «энергии» в высокочастотных компонентах DCT. Точное представление требует их сохранения.
То же самое для изображения с шумом, например, из-за зернистости пленки или слабого освещения/высокого значения ISO на цифровой камере. Для JPEG этот шум является сигнальной информацией, которую необходимо попытаться воспроизвести. Это может стоить много бит.
Полу-связанный: почему предустановка «очень быстро» в FFmpeg создает наиболее сжатый файл по сравнению со всеми другими предустановками? - мой ответ касается сжатия видео h.264, но тот же компромисс между качеством и битрейтом применим к неподвижным изображениям. С меньшим значением, придаваемым скорости кодирования/декодирования, потому что это только одно изображение, и поскольку JPEG не имеет возможности сказать «этот блок выглядит как пиксели здесь», поэтому пространство поиска для кодировщика намного меньше.
Более продвинутые форматы неподвижных изображений используют внутреннее предсказание вместо отдельных DCT для каждого блока. например , HEIF представляет собой кадр h.265 I и, как утверждается, требует примерно вдвое меньше места для хранения, чем JPEG с эквивалентным визуальным качеством в среднем. (И может быть даже лучше для изображения с повторяющимся шаблоном, так что многие блоки могут быть закодированы как «скопируйте пиксели оттуда, затем примените это различие», вместо того, чтобы начинать с нуля с шаблоном шахматной доски, который имеет много высокочастотной энергии.)
Проблема в том, что мы забываем, что все наши цифровые файлы состоят из двоичных файлов, но наши компьютеры скрывают эти детали. Мы просто видим в нашем проводнике, что какой-то файл what.jpg последний раз обновлялся 1 января 2021 года и имеет размер 14,2 МБ. Затем, если мы откроем файл, мы увидим изображение в нашей программе просмотра изображений после того, как компьютер прочитает инструкции о том, как должен отображаться файл.
Вы можете использовать программное обеспечение, такое как BeyondCompare, для анализа различий между файлами. Ниже приведен скриншот двух изображений, анализируемых с помощью BeyondCompare. Размер изображения слева составляет ~2,1 Мб, а изображения справа — ~1 Мб. Оба они представляют собой файлы в формате .jpg, но тот, что справа, является копией изображения слева, за исключением того, что он был сохранен с более высоким сжатием. Визуально они похожи.
Но мы даже не смотрели на то, что видит наш компьютер , чтобы создать образ для нас. Ниже приведен скриншот тех же файлов изображений с использованием шестнадцатеричного сравнения. Шестнадцатеричные значения — это, по сути, «инструкции», которые компьютер читает, чтобы сгенерировать для вас представление изображения.
Когда я увеличиваю масштаб, скажем, на 700% в одном и том же месте на каждом изображении, я вижу примерно одинаковое количество пикселей, что указывает на то, что сжатие одинаково.
Откройте файл JPEG в графическом редакторе, сохраните изображение с качеством 85. Закройте и снова откройте изображение (1) , снова сохраните его с качеством 100. Теперь сравните 2 выходных изображения. Второе изображение будет иметь больший размер файла, даже если два изображения будут выглядеть почти одинаково.
Таким образом, разные уровни сжатия могут давать (почти) одинаковые изображения.
(1) : чтобы редактор не использовал изображение в памяти.
Возможно, было бы полезно, если бы вместо того, чтобы думать о файле изображения как о том, что он «является» изображением или «содержит» изображение, вы думали бы о нем как об инструкциях , которые сообщают вашему компьютеру, как воссоздать изображение.
Предположим, у вас есть картинка, и вы хотите рассказать кому-то еще по телефону, как ее воссоздать. Вы можете разделить свое изображение на «пиксели», а затем сказать другому человеку, сколько пикселей в высоту и сколько пикселей в ширину, и каким именно цветом закрасить каждый пиксель в его копии. Если бы вы это сделали, вы бы отправили им «несжатые» данные изображения.
Однако, в зависимости от изображения, вы можете сэкономить время, если остановитесь, чтобы подумать об этом. Возможно, изображение содержит много белых пикселей. Вы можете начать с того, что скажете: «Покрасьте каждый пиксель в белый цвет», а затем просто сообщите им цвета небелых пикселей. Это было бы формой «сжатия». Возможно, изображение содержит много разных сплошных цветов. Вы можете дать им неполный список пикселей, а затем сказать, что для всех тех, которые я не говорил вам раскрашивать, просто сделайте их такими же, как цвет слева.
Количество различных способов описания изображения практически бесконечно. И найти самые компактные из них - Трудная Проблема . Форматы файлов изображений, такие как .jpg или .png, накладывают некоторые узкие ограничения на количество различных способов описания изображения, но они дают создателю файла некоторую свободу действий в выборе того, сколько времени его компьютер потратит на поиск хорошего изображения. один. Часто есть настройка с таким названием, как «уровень сжатия», «коэффициент качества» и т. д.
В двух словах, когда вы создаете «сжатое» изображение, если вы позволяете своему компьютеру больше работать с ним (например, выбираете более высокий «уровень сжатия»), вы получите файл меньшего размера.
Простой способ сравнить два изображения, которые кажутся идентичными, — это использовать режим наложения слоя «Извлечение зерна» в Gimp.
Если изображения идентичны, у вас будет чисто серое изображение. Если есть различия в яркости или цвете, эти различия будут видны. Вы можете использовать кривые, чтобы усилить различия.
Твальберг
qrk
Джоп ван Стин
TaW
суперкот
Питер Кордес
Гринонлайн
ОбезьянаЗевс
Эндрю Мортон
Лейн Бернардо
Мистер Уайт
Торбьерн Равн Андерсен
Накопление
Мистер Уайт