Hampir semua kehilangan kualitas gambar terjadi pertama kali gambar dikompresi sebagai JPEG. Terlepas dari berapa kali JPEG dikompres ulang dengan pengaturan yang sama , kerugian generasi terbatas pada kesalahan pembulatan.
Batas MCU tetap utuh (8x8 blok).
Subsampel Chroma dinonaktifkan.
DQT Konstan (pengaturan kualitas yang sama).
Namun, kesalahan pembulatan mungkin besar untuk setiap iterasi bahwa kriteria di atas tidak terpenuhi, dan bijaksana untuk menyimpan cadangan semua file asli.
Konversi colorspace. Jika diinginkan, kurangi informasi warna (subsampel kroma) (Rugi) . Jika tidak downsampled, kehilangan informasi adalah hasil dari kesalahan pembulatan .
Segmentasi. Bagilah setiap saluran menjadi 8x8 blok (MCU = Minimal Coding Unit). (Rugi)
Catatan: Jika chroma subsampling diaktifkan, MCU mungkin secara efektif 16x8, 8x16, atau 16x16, dalam hal gambar asli. Namun, MCU masih 8x8 blok.
Discrete Cosine Transform (DCT) pada setiap MCU. Kehilangan informasi adalah hasil dari kesalahan pembulatan .
Kuantisasi. Nilai dalam setiap sel MCU dibagi dengan angka yang ditentukan dalam tabel kuantisasi (DQT). Nilai dibulatkan ke bawah, banyak yang akan menjadi nol. Ini adalah bagian lossy utama dari algoritma.
Pemindaian Zig-Zag. Atur ulang nilai di setiap MCU menjadi urutan angka mengikuti pola zig-zag. Nol yang terjadi selama kuantisasi akan dikelompokkan bersama. (Rugi)
DPCM = Modulasi Kode Pulsa Diferensial. Ubah urutan angka menjadi bentuk yang lebih mudah untuk dikompres. (Rugi)
RLE = Run Encoding Panjang. Nol berturut-turut dikompresi. (Rugi)
Pengodean Entropi / Huffman. (Rugi)
Mengkompresi JPEG
Perhatikan bahwa downsampling saluran warna dan kuantisasi adalah satu-satunya langkah yang sengaja hilang . Mengesampingkan kesalahan pembulatan untuk saat ini, semua langkah lainnya adalah lossless. Setelah kuantisasi terjadi, membalikkan dan mengulangi langkah memberikan hasil yang identik. Dengan kata lain, re-kuantisasi (dengan DQT yang sama) adalah lossless .
Pada prinsipnya, dimungkinkan untuk membuat algoritma resampling yang lossless setelah lulus pertama. Namun, dengan implementasi di ImageMagick, warna dapat berubah secara drastis sebelum kondisi stabil tercapai, seperti yang terlihat pada gambar ths.
Dengan kondisi yang optimal, mengkompres ulang JPEG dengan pengaturan kualitas yang sama akan menghasilkan JPEG yang sama persis. Dengan kata lain, mengkompresi JPEG berpotensi kehilangan . Dalam praktiknya, mengkompresi ulang JPEG bukanlah kerugian, tetapi tunduk pada, dan dibatasi oleh, kesalahan pembulatan. Meskipun kesalahan pembulatan seringkali akhirnya menyatu menjadi nol , sehingga gambar yang sama persis dibuat kembali, subsampel kroma dapat mengakibatkan perubahan warna yang signifikan.
Demonstrasi (pengaturan kualitas yang sama)
Saya menulis bash
skrip berikut , yang menggunakan ImageMagick untuk berulang kali mengkompres ulang file JPEG pada pengaturan kualitas yang diberikan:
#!/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
Setelah membiarkannya berjalan selama beberapa ratus iterasi, saya berlari md5sum
pada hasilnya:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Kita dapat melihat bahwa, memang, kesalahan pembulatan telah menyatu ke nol, dan gambar yang persis sama sedang direproduksi, berulang kali .
Saya telah mengulangi ini berkali-kali dengan gambar yang berbeda dan pengaturan kualitas. Biasanya, kondisi mantap tercapai, dan gambar yang sama persis direproduksi berulang-ulang.
Saya telah mencoba mereplikasi hasil mattdm menggunakan Imagemagick di Ubuntu 18.04. Dokumen asli adalah konversi mentah ke TIFF di Rawtherapee, tetapi tampaknya tidak tersedia lagi. Sebagai gantinya, saya mengambil versi yang diperbesar dan menguranginya ke ukuran aslinya (256x256). Kemudian saya berulang kali mengkompres ulang pada usia 75 hingga saya mendapatkan konvergensi. Inilah hasilnya (asli, 1, n, perbedaan):
Hasil saya berbeda. Tanpa dokumen asli, alasan perbedaannya tidak mungkin ditentukan.
Saya mengkompres ulang gambar dari sudut kiri atas montase hingga konvergensi pada 90. Ini hasilnya (asli, 1, n, perbedaan):
Setelah mengaktifkan subsampling kroma, warna berubah pada saat kondisi mantap tercapai.
Mengubah di antara sejumlah kecil pengaturan
Dengan memodifikasi variabel q2
, pengaturan kualitas dapat dibatasi pada satu set nilai yang terdistribusi secara merata.
q2=$(( (RANDOM % 3)*5 + 70 ))
Untuk sejumlah kecil pilihan pengaturan, keseimbangan mungkin akhirnya tercapai , yang terlihat ketika nilai md5 mulai berulang. Tampaknya semakin besar himpunan, semakin lama waktu yang dibutuhkan, dan semakin buruk gambarnya, sebelum keseimbangan tercapai.
Apa yang tampaknya terjadi pada kesetimbangan adalah koefisien DCT sebelum kuantisasi harus dapat membagi semua (atau sebagian besar) nilai-nilai kuantum. Misalnya, jika beralih di antara dua DQT di mana koefisien DCT dibagi secara bergantian dengan 3 dan 5, keseimbangan akan tercapai ketika koefisien DCT dibagi dengan 15. Ini menjelaskan mengapa penurunan kualitas jauh lebih besar daripada perbedaan antara pengaturan awal.
Mengubah di antara sejumlah besar pengaturan
Eeyore tidak senang ketika q2
diubah seperti ini:
q2=$(( (RANDOM % 9) + 90 ))
Untuk membuat video, gunakan 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
Menonton iterasi 9999 pertama hampir seperti menonton air mendidih. Mungkin ingin menggandakan kecepatan pemutaran. Inilah Eeyore setelah 11999 iterasi:
Bagaimana jika batas MCU berubah?
Jika perubahan terjadi beberapa kali, berulang kali kompresi ulang kemungkinan akan mencapai kondisi stabil. Jika perubahan terjadi pada setiap iterasi, gambar mungkin akan menurun dengan cara yang mirip dengan ketika DQT berubah.
Bagaimana dengan pengeditan?
Efek dari kompresi ulang setelah pengeditan tergantung pada pengeditan tertentu yang dilakukan. Misalnya, menyimpan pada pengaturan kualitas yang sama setelah mengurangi artefak JPEG akan memperkenalkan kembali artefak yang sama. Namun, menerapkan perubahan yang dilokalisasi, seperti sikat penyembuhan, tidak akan memengaruhi area yang tidak disentuh.
Penurunan kualitas gambar terbesar terjadi saat file pertama kali dikompres pada pengaturan kualitas yang diberikan. Selanjutnya, kompres ulang dengan pengaturan yang sama tidak boleh menyebabkan perubahan lebih besar dari kesalahan pembulatan. Jadi saya berharap siklus edit-resave pada pengaturan kualitas yang diberikan terlihat seperti gambar lain yang disimpan dengan pengaturan kualitas yang sama (selama batas MCU tetap utuh dan subsampel kroma dinonaktifkan ).
Bagaimana dengan video-video itu?
Bisakah saya menulis ulang dokumen asli saya dengan JPEG yang dikompresi ulang?
Adalah bijaksana untuk menyimpan cadangan semua file asli, tetapi jika Anda secara tidak sengaja menimpa satu, kerusakan kemungkinan terbatas. Ini juga baik untuk bekerja dalam format JPEG dengan subsampling chrom dinonaktifkan.
JPEG tidak dapat digunakan untuk gambar yang menggunakan lebih dari 8 bit per warna.