Майже всі втрати якості зображення відбуваються при першому стисненні зображення у вигляді JPEG. Незалежно від того, скільки разів JPEG повторно стискається з тими ж параметрами , генераційні втрати обмежуються помилкою округлення.
Межі MCU залишаються недоторканими (8x8 блоків).
Підсвідомість хроми вимкнено.
Постійний DQT (однакова настройка якості).
Однак помилки округлення можуть бути великими для кожної ітерації, що вищезазначені критерії не виконані, і доцільно зберігати резервні копії всіх оригінальних файлів.
Перетворити кольоровий простір. При бажанні, декодують інформацію про кольорі (кольоровість підвибірки) (Lossy) . Якщо не зразок зразків, втрата інформації є результатом помилки округлення .
Сегментація. Розділіть кожен канал на 8x8 блоків (MCU = Мінімальна одиниця кодування). (Без втрат)
Примітка: Якщо підсистема кольоровості підключена, MCU можуть бути ефективно 16x8, 8x16 або 16x16, з точки зору вихідного зображення. Однак MCU все ще є всіма блоками 8x8.
Дискретна косинова трансформація (DCT) на кожному MCU. Втрата інформації є результатом помилки округлення .
Квантування. Значення в кожній комірці MCU ділиться на число, вказане в таблиці квантування (DQT). Значення округляються вниз, багато з яких стануть нульовими. Це основна частина алгоритму з втратою.
Зіг-Заг сканування. Впорядкуйте значення в кожному MCU у послідовність чисел за схемою зигзагу. Нулі, що виникли під час квантування, будуть згруповані разом. (Без втрат)
DPCM = диференціальна модуляція імпульсного коду. Перетворіть числові послідовності у форму, яку легше стиснути. (Без втрат)
RLE = Кодування довжини запуску. Послідовні нулі стискаються. (Без втрат)
Ентропія / кодування Хаффмана. (Без втрат)
Повторне стиснення JPEG
Зауважте, що зменшення тиску кольорових каналів та квантування - це лише навмисно втрачені кроки . Якщо поки що відхилити помилку округлення, всі інші кроки без втрат. Після того, як відбувається квантування, обернення та повторення кроку дає однакові результати. Іншими словами, повторна квантування (з тим же DQT) не має збитків .
В принципі, можливо створити алгоритм перекомпонування, який втрачає втрати після першого проходження. Однак із реалізацією в ImageMagick кольори можуть різко змінитись, перш ніж буде досягнуто стійкого стану, як це видно із зображення THS.
Враховуючи оптимальні умови, повторне стиснення 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 за допомогою Imagemagick в Ubuntu 18.04. Оригінал був необробленим перетворенням на TIFF в Rawtherapee, але, здається, він більше не доступний. На його місце я взяв збільшену версію і зменшив її до початкових розмірів (256x256). Потім я кілька разів рекомпресував у 75, поки не отримав конвергенцію. Ось результат (оригінал, 1, n, різниця):
Мої результати різні. Без справжнього оригіналу причину різниці неможливо визначити.
Я повторно стиснув зображення з лівого верхнього кута монтажу до зближення в 90. Це результат (оригінал, 1, n, різниця):
Після ввімкнення підсимування кольоровості кольори змінюються залежно від часу досягнення сталого стану.
Зміна серед невеликої кількості налаштувань
Змінюючи змінну q2
, налаштування якості можна обмежити набором рівномірно розподілених значень.
q2=$(( (RANDOM % 3)*5 + 70 ))
Для невеликої кількості варіантів налаштування може з часом досягти рівноваги , що видно, коли значення md5 починають повторюватися. Здається, що більший набір, тим більше часу займає, і чим гірше стає зображення, перш ніж можна досягти рівноваги.
Те, що, здається, відбувається в рівновазі - це коефіцієнт DCT до квантування, який повинен бути дільним всім (або більшості) квантових значень. Наприклад, якщо перемикатися між двома DQT, де коефіцієнт DCT ділиться по черзі на 3 і 5, досягається рівновага, коли коефіцієнт DCT ділиться на 15. Це пояснює, чому падіння якості значно більше, ніж різниця між початковими налаштуваннями.
Зміна більшої кількості налаштувань
Eeyore не раді, коли так 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 ітерацій майже як дивитися води закип'ятити. Можливо, хочеться подвоїти швидкість відтворення. Ось Eeyore після 11999 ітерацій:
Що робити, якщо змінюються межі MCU?
Якщо зміни відбудуться обмеженою кількістю разів, багаторазове повторне стиснення, ймовірно, досягне стійкого стану. Якщо зміни відбуваються при кожній ітерації, зображення, ймовірно, погіршується таким же чином, як і при зміні DQT.
Що з редагуванням?
Ефект повторного стиснення після редагування залежить від конкретного виконаного редагування. Наприклад, збереження при тій же настройці якості після зменшення артефактів JPEG призведе до повторного введення тих самих артефактів. Однак застосування локалізованих змін, таких як лікувальна кисть, не вплине на ділянки, які не торкалися.
Найбільше падіння якості зображення відбувається під час першого стиснення файлу при заданій настройці якості. Згодом повторне стиснення з тими ж параметрами не повинно вносити змін, більших за помилку округлення. Тож я б очікував, що цикли редагування та відновлення при заданій настройці якості будуть схожі на будь-яке інше зображення, збережене з однаковими настройками якості (доки межі MCU залишаються недоторканими, а підсистема кольоровості відключена ).
Що з тими відео?
Чи можу я переписати свої оригінали за допомогою рекомпресованих JPEG-файлів?
Доцільно зберігати резервні копії всіх оригінальних файлів, але якщо ви випадково їх перезаписали, шкоду, ймовірно, обмежений. Також було б непогано працювати в JPEG з відключеною підсистемою кольоровості.
JPEG не можна використовувати для зображень, що використовують більше 8 біт на колір.