Почти все потери качества изображения происходят при первом сжатии изображения в формате 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, разница):
![attempt to replicate mattdm](https://i.imgur.com/WcP0qjx.jpg)
Мои результаты разные. Без подлинного оригинала невозможно определить причину различий.
Я сжимал изображение из верхнего левого угла монтажа до схождения в 90. Это результат (оригинал, 1, n, разница):
![attempt to replicate ths-montage](https://i.imgur.com/Idv4eUz.jpg)
После включения подвыборки цветности цвета меняются к тому времени, когда достигается устойчивое состояние.
![ths-color-shift](https://i.imgur.com/a3cqPfJ.jpg)
Изменение небольшого количества настроек
Путем изменения переменной 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 итераций:
![11999 iterations, random DQT](https://i.imgur.com/k6HLSY2.jpg)
Что если границы MCU изменятся?
Если изменения происходят ограниченное количество раз, повторное сжатие может достичь устойчивого состояния. Если изменения происходят на каждой итерации, изображение, вероятно, будет ухудшаться, как при изменении DQT.
А как насчет редактирования?
Эффект повторного сжатия после редактирования зависит от конкретного выполненного редактирования. Например, сохранение с той же настройкой качества после уменьшения артефактов JPEG приведет к повторному появлению тех же артефактов. Однако применение локализованного изменения, такого как целительная кисть, не затронет области, которые не были затронуты.
Наибольшее падение качества изображения происходит при первом сжатии файла с заданной настройкой качества. Впоследствии повторное сжатие с той же настройкой не должно приводить к каким-либо изменениям, превышающим ошибку округления. Таким образом, я ожидаю, что циклы редактирования-сохранения при заданном параметре качества будут выглядеть как любое другое изображение, сохраненное с таким же параметром качества (пока границы MCU остаются нетронутыми и подвыбор цветности отключен ).
А как насчет этих видео?
Могу ли я перезаписать свои оригиналы повторно сжатыми JPEG-файлами?
Целесообразно сохранять резервные копии всех исходных файлов, , но если вы случайно перезаписаете один из них, ущерб, скорее всего, будет ограниченным. Также было бы хорошо работать в JPEG с отключенной подвыборкой цветности.
JPEG нельзя использовать для изображений, которые используют более 8 бит на цвет.