Почти все потери качества изображения происходят при первом сжатии изображения в формате JPEG. Независимо от того, сколько раз JPEG сжимается с одинаковыми настройками , потери при генерации ограничиваются ошибкой округления.
Границы MCU остаются нетронутыми (8x8 блоков).
Подвыборка цветности отключена.
Постоянный DQT (одинаковая настройка качества).
Однако ошибки округления могут быть большими для каждой итерации, если вышеуказанные критерии не выполняются, и целесообразно сохранять резервные копии всех исходных файлов.
Конвертировать цветовое пространство. При желании уменьшите информацию о цвете (подвыбор цветности) (с потерями) . Если данные не понижены, потеря информации является результатом ошибки округления .
Сегментация. Разделите каждый канал на блоки 8x8 (MCU = минимальная единица кодирования). (Lossless)
Примечание. Если включена субдискретизация по цветности, MCU может эффективно составлять 16x8, 8x16 или 16x16 с точки зрения исходного изображения. Тем не менее, MCU все еще являются блоками 8x8.
Дискретное косинусное преобразование (DCT) на каждом MCU. Потеря информации является результатом ошибки округления .
Квантование. Значение в каждой ячейке блока MCU делится на число, указанное в таблице квантования (DQT). Значения округлены в меньшую сторону, многие из которых станут нулевыми. Это основная часть алгоритма с потерями.
Зигзагообразный скан. Переставьте значения в каждом MCU в последовательность чисел, следуя зигзагообразному шаблону. Нули, которые произошли во время квантования, будут сгруппированы вместе. (Lossless)
DPCM = дифференциальная импульсная кодовая модуляция. Преобразуйте числовые последовательности в форму, которую легче сжать. (Lossless)
RLE = Длина кодирования. Последовательные нули сжимаются. (Lossless)
Энтропия / кодирование Хаффмана. (Lossless)
Повторное сжатие JPEG
Обратите внимание, что уменьшение частоты цветовых каналов и квантование являются единственными преднамеренными потерями . Оставив в стороне ошибку округления, все остальные шаги без потерь. После того как квантование произошло, изменение и повторение шага дает идентичные результаты. Другими словами, повторное квантование (с тем же DQT) без потерь .
В принципе, можно создать алгоритм повторной выборки, который будет без потерь после первого прохода. Однако, с реализацией в ImageMagick, цвета могут резко измениться, прежде чем будет достигнуто устойчивое состояние, как видно на этом изображении.
При оптимальных условиях повторное сжатие JPEG с теми же настройками качества приведет к точно такому же JPEG. Другими словами, повторное сжатие JPEG потенциально без потерь . На практике повторное сжатие JPEG не является без потерь, но подвержено и ограничено ошибкой округления. Хотя ошибки округления часто в конечном итоге сходятся к нулю , поэтому воссоздается точно такое же изображение, дополнительная выборка цветности может привести к значительным изменениям цвета.
Демонстрация (установка того же качества)
Я написал следующий bash
скрипт, который использует ImageMagick для многократного повторного сжатия файла JPEG с заданной настройкой качества:
#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg
while true ; do
q2=${q1} # for variants, such as adding randomness
convert ${n}.jpg -quality ${q2} $((n+1)).jpg
#\rm $((n-5)).jpg # uncomment to avoid running out of space
n=$((n+1))
echo -n "$q2 "
md5sum ${n}.jpg
done
После нескольких сотен итераций я запустил md5sum
результаты:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Мы видим, что действительно ошибка округления сведена к нулю, и одно и то же изображение воспроизводится снова и снова .
Я повторил это несколько раз с различными изображениями и настройками качества. Обычно, устойчивое состояние достигается, а точное же изображение воспроизводится снова и снова.
А как насчет результатов @ mattdm ?
Я попытался воспроизвести результаты mattdm, используя Imagemagick в Ubuntu 18.04. Первоначально это был необработанный перевод в TIFF в Rawtherapee, но, похоже, он больше не доступен. Вместо него я взял увеличенную версию и уменьшил ее до исходного размера (256х256). Затем я неоднократно сжимался до 75, пока не получил схождение. Вот результат (оригинал, 1, n, разница):
Мои результаты разные. Без подлинного оригинала причину разницы определить невозможно.
Я повторно сжал изображение от верхнего левого угла монтажа до схождения в 90. Это результат (оригинал, 1, n, разница):
После включения подвыборки цветности цвета меняются к моменту достижения устойчивого состояния.
Изменение среди небольшого количества настроек
Изменяя переменную q2
, настройка качества может быть ограничена набором равномерно распределенных значений.
q2=$(( (RANDOM % 3)*5 + 70 ))
Для небольшого числа настроек можно в конечном итоге достичь равновесия , что видно, когда значения md5 начинают повторяться. Кажется, чем больше набор, тем больше времени требуется, и тем хуже становится изображение, прежде чем может быть достигнуто равновесие.
Кажется, что в равновесии происходит то, что коэффициент DCT перед квантованием должен делиться на все (или большинство) квантовых значений. Например, если переключаться между двумя DQT, где коэффициент DCT делится попеременно на 3 и 5, равновесие будет достигаться, когда коэффициент DCT делится на 15. Это объясняет, почему падение качества намного больше, чем разница между исходными настройками.
Изменение среди большего количества настроек
ИА недоволен, когда q2
меняется так:
q2=$(( (RANDOM % 9) + 90 ))
Чтобы сделать видео, используйте ffmpeg
:
rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4
Наблюдение за первыми 9999 итерациями почти похоже на наблюдение за водой. Может хотеть удвоить скорость воспроизведения. Вот ИА после 11999 итераций:
Что если границы MCU изменятся?
Если изменения происходят ограниченное количество раз, повторное сжатие может достичь устойчивого состояния. Если изменения происходят на каждой итерации, изображение, вероятно, будет ухудшаться таким же образом, как при изменении DQT.
Как насчет редактирования?
Эффект повторного сжатия после редактирования зависит от конкретного выполненного редактирования. Например, сохранение с той же настройкой качества после уменьшения артефактов JPEG приведет к повторному появлению тех же артефактов. Однако применение локализованного изменения, такого как целительная кисть, не затронет области, которые не были затронуты.
Наибольшее падение качества изображения происходит при первом сжатии файла с заданной настройкой качества. Впоследствии повторное сжатие с той же настройкой не должно приводить к каким-либо изменениям, превышающим ошибку округления. Таким образом, я ожидаю, что циклы редактирования-сохранения при заданном параметре качества будут выглядеть как любое другое изображение, сохраненное с тем же параметром качества (пока границы MCU остаются нетронутыми и субсэмплирование цветности отключено ).
А как насчет этих видео?
Могу ли я перезаписать свои оригиналы повторно сжатыми JPEG-файлами?
Целесообразно хранить резервные копии всех исходных файлов, но если вы случайно перезаписаете один из них, ущерб, скорее всего, будет ограниченным. Также было бы хорошо работать в JPEG с отключенной подвыборкой цветности.
JPEG нельзя использовать для изображений, которые используют более 8 бит на цвет.