Faktor-faktor apa yang menyebabkan atau mencegah “kehilangan generasi” ketika JPEG dikompresi berulang kali?

29

Selama bertahun-tahun, saya percaya bahwa mengkompres ulang file JPEG beberapa kali secara bertahap akan menurunkan kualitasnya sampai menjadi kekacauan yang tidak dapat dikenali, seperti yang dilakukan oleh fotokopi dari fotokopi. Ini secara intuitif masuk akal karena JPEG adalah format lossy. Ada juga Tanya Jawab lain yang mengklaim demikian:

Namun, saya juga membaca bahwa mengkompresi JPEG pada tingkat kualitas yang sama tidak akan menurunkan kualitas gambar. Ini bertentangan dengan degradasi bertahap yang dijelaskan di tempat lain.

Apa yang secara teknis terjadi ketika JPEG dikompresi ulang?  Apa yang hilang dan bagaimana caranya? Akankah gambar benar-benar berubah menjadi kekacauan bersalju yang dulu muncul di televisi? Bagaimana dengan video yang menampilkan gambar yang berantakan setelah dikompres berulang kali?

(Tolong jangan hanya melambaikan tangan dan memohon konsep umum tentang rasa kehilangan.)

(Pertanyaan ini, dan jawaban yang telah menarik sejauh ini, fokus pada faktor teknis (pengaturan khusus dan manipulasi gambar) yang menyebabkan atau mencegah degradasi gambar ketika file JPEG dikompresi berulang kali.)

xiota
sumber
Relevan .
Mehrdad
2
@MonkeyZeus Beberapa (kecil) jumlah data gambar hilang karena kesalahan pembulatan pada kualitas 100. Pengompres ulang pada pengaturan yang sama (seperti 80) tidak mengakibatkan hilangnya data progresif . Itulah "pengetahuan umum" yang ingin dijawab oleh T&J ini.
xiota
1
@MonkeyZeus Nilai-nilai seperti "100" dan "80" (atau "10, 11, 12" di Photoshop) arbitrer - 100% bukan tanpa kerugian.
mattdm

Jawaban:

32

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.


Algoritma kompresi JPEG

  1. Konversi colorspace. Jika diinginkan, kurangi informasi warna (subsampel kroma) (Rugi) . Jika tidak downsampled, kehilangan informasi adalah hasil dari kesalahan pembulatan .

  2. 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.

  3. Discrete Cosine Transform (DCT) pada setiap MCU. Kehilangan informasi adalah hasil dari kesalahan pembulatan .

  4. 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.

  5. 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)

  6. DPCM = Modulasi Kode Pulsa Diferensial. Ubah urutan angka menjadi bentuk yang lebih mudah untuk dikompres. (Rugi)

  7. RLE = Run Encoding Panjang. Nol berturut-turut dikompresi. (Rugi)

  8. 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 bashskrip 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 md5sumpada 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.

Bagaimana dengan hasil @ mattdm ?

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):

mencoba untuk mereplikasi mattdm

Hasil saya berbeda. Tanpa dokumen asli, alasan perbedaannya tidak mungkin ditentukan.

Bagaimana dengan montase @ ths ?

Saya mengkompres ulang gambar dari sudut kiri atas montase hingga konvergensi pada 90. Ini hasilnya (asli, 1, n, perbedaan):

mencoba untuk mereplikasi ths-montage

Setelah mengaktifkan subsampling kroma, warna berubah pada saat kondisi mantap tercapai.

perubahan warna

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 q2diubah 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:

11999 iterasi, DQT acak

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.

  • Inilah yang terjadi dalam video yang merotasi gambar dengan dimensi yang tidak dapat dibagi 8.

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.

xiota
sumber
5
gambarnya sangat berbeda dengan load- edit -save loop. dalam hal ini, kuantisasi berulang akan menyebabkan degradasi.
ths
2
Saya baru saja membuat tes dengan skrip yang sama seperti pada jawabannya. di sini adalah montase dari setiap gambar ke-20 hingga tp 100: i.stack.imgur.com/xtob6.jpg itu penting.
ths
2
ah. menemukan masalah dengan gambar saya. jika Anda mengaktifkan subsampling kroma, yang mengarah ke degradasi progresif.
ths
2
Menemukan itu juga. Jadi mengaktifkan chroma subsampling secara signifikan mengubah warna pada gambar sebelum kondisi mantap tercapai.
xiota
2
Muatan berulang dan penghematan menggunakan parameter yang sama persis kemungkinan tidak akan menyebabkan kehilangan kualitas tanpa batas, karena sebagian besar file input dapat dimuat dan disimpan kembali tanpa memperkenalkan kesalahan pembulatan tambahan, dan file yang akan dipengaruhi oleh kesalahan pembulatan akan terjadi kemungkinan akan diubah menjadi file yang tidak mau. Di sisi lain, siklus pemuatan / penyimpanan berulang yang bergantian antara parameter kompresi yang serupa tetapi tidak identik dapat menghasilkan kesalahan pembulatan pada setiap siklus.
supercat
20

Kehilangan kompresi adalah nyata, terutama ketika bekerja dengan tingkat kompresi JPEG yang lebih tinggi.

Secara teori, jika Anda menyimpan kembali file JPEG dengan parameter yang sama persis dan telah menyelaraskan crop Anda menjadi 8 × 8 blok, degradasi harus minimal. Namun, jika Anda menggunakan kompresi tingkat tinggi, Anda akan melihat kerugian lebih lanjut, karena artefak yang diperkenalkan oleh kompresi awal adalah perubahan permanen pada gambar dan akan dikompresi ulang juga, menyebabkan lebih banyak artefak.

Jika Anda menyimpan ulang dengan tingkat kompresi rendah (kualitas tinggi, seperti "100" di Gimp atau 11 atau 12 di Photoshop), artefak yang baru ditambahkan akan sulit untuk diperhatikan. Itu tidak akan membuat gambar lebih baik , tetapi tidak jauh lebih buruk. Namun, itu akan memperkenalkan perubahan di seluruh gambar.

Sebagai tes cepat, saya menggunakan ImageMagick untuk mengkompres ulang gambar JPEG berulang pada 75%. Sampel di bawah ini diunggah sebagai file PNG untuk menghindari kompresi lebih lanjut, dan ukurannya berlipat ganda ketika saya dikonversi ke PNG untuk membuat efeknya lebih jelas. (Dokumen asli yang digunakan dalam pengujian tidak digandakan.) Ternyata setelah delapan kali resampling, efeknya menyatu pada hasil yang sangat stabil, di mana pengompresan kembali menghasilkan file identik bit-for-bit yang identik.

Ini asli yang tidak dikompresi:

asli, tidak ada kompresi jpeg

Inilah hasil mencapai 75% JPEG:

jpeg pertama

Dan inilah yang disimpan kembali:

pass kedua

Penghematan satu detik itu menyebabkan sejumlah besar degradasi tambahan!

Dan inilah gambar konvergen terakhir (pass ke-8):

jpeg terkonvergensi

Sekali lagi, warna pasti jauh lebih aneh, termasuk beberapa pola warna palsu, dan artefak gumpal melompat lebih banyak. Algoritma menyatu, tetapi ke versi yang terdegradasi secara signifikan. Jadi, jangan lakukan itu.

Tapi ini hal yang sama dengan tingkat kualitas 99%, setelah 9 operan (titik di mana konvergen melewati lebih lanjut identik):

99% 9 kali

Di sini, perbedaannya hampir tidak terdaftar. (Maksud saya secara harfiah; bandingkan mereka piksel demi piksel dengan versi yang tidak dikompresi dan penyimpangannya hanya sedikit noise acak.) Jadi, bagaimana jika saya kembali ke gambar 75% pertama dan kemudian resave pada 99%? Nah, ini, (setelah sekali saja):

75% sekali dan kemudian 99% sekali

Menyimpan dengan kualitas tinggi jelas terlihat lebih baik daripada menyimpan ulang dengan parameter yang sama, agak mengejutkan saya. Tapi, ada degradasi baru yang jelas di sekitar pemangkasan pink dan mata. Dengan versi daur ulang dari pengaturan yang sama, artefak JPEG dibesar-besarkan dengan masing-masing kompresi ulang. Dengan resolusi rendah dan kualitas rendah yang saya pilih, yang ternyata lebih buruk daripada mengkompres ulang semuanya secara berbeda.

Di video-video itu: Saya menemukan ini sebagai hit Google teratas. Perhatikan bahwa ia mengatakan dalam deskripsi:

Inilah yang terjadi jika Anda menyandikan ulang gambar JPEG berkali-kali, pada pengaturan kualitas tinggi acak (85 atau lebih tinggi).

Penekanan ditambahkan - ini menjelaskan mengapa tidak ada konvergensi, karena alih-alih menyimpan dengan pengaturan yang sama, atau menyimpan dengan kualitas super tinggi, pengaturan acak digunakan setiap kali .

The video kedua saya menemukan kata:

Gambar JPEG disalin dan memutar revolusi penuh untuk setiap gambar. [...] (596 "putar searah jarum jam")

Jadi, sekali lagi, sesuatu dilakukan untuk menjaga akumulasi kesalahan.

Dalam kasus apa pun, untuk penyuntingan foto praktis , perlu disebutkan bahwa menghemat 75% satu kali jauh lebih buruk daripada menyimpan 99% sejuta kali . Dalam contoh kasus saya, artefak di 75% sangat jelas bahwa degradasi lebih lanjut seperti membuang air di lautan. Jika Anda menyimpan pada tingkat yang cukup tinggi sehingga artefak ini tidak benar-benar terlihat, menyimpannya kembali dengan pengaturan asli adalah strategi yang baik. Tentu saja, jika Anda bisa tetap bekerja dari aslinya yang tidak dikompresi, Anda lebih baik.

Jika karena alasan tertentu Anda harus (atau sangat suka) hanya bekerja dengan JPEG, atur kamera Anda untuk menyimpan dalam kualitas setinggi mungkin , bahkan jika Anda tidak melihat perbedaan dalam file awal. Lihat Apakah layak menggunakan pengaturan kualitas Premium JPEG Pentax? untuk lebih lanjut tentang itu - belum tentu benar-benar Pentax spesifik.

mattdm
sumber
(1) Anda menghemat 75%. Pada pengaturan itu, kehilangan kualitas gambar diharapkan. (2) Gambar itu dipilih dan diubah untuk membesar-besarkan artefak kompresi JPEG. (3) Gambar menyatu setelah 8 putaran rekompresi, setelah itu tidak akan ada lagi penurunan kualitas gambar. (4) Sebuah video gambar yang menunjukkan "kehilangan generasi" tidak akan terjadi apa-apa setelah 1/4 detik pertama.
xiota
5
(1) Ya. (2) "Dipilih" sebagai foto khas di mana orang mungkin peduli tentang hal semacam ini. "Diubah" hanya untuk memperbesar. Perhatikan bahwa ini hanya untuk tampilan di sini - saya tidak menggandakan ukuran gambar yang saya kerjakan. (3) Ya, tetapi dalam praktik untuk mengedit, ini beberapa putaran pertama yang mungkin Anda pedulikan. (4) Itu benar, tetapi itu tidak menyiratkan bahwa konvergensi ke kasus terburuk dan tinggal di sana berguna dengan cara apa pun.
mattdm
Untuk mereplikasi, ambil gambar pertama dan ubah ukuran ke 256 × 256 tanpa resampling atau interpolasi.
mattdm
Saya tidak bisa melihat banyak perbedaan antara gambar yang Anda tampilkan. Tetapi jika saya mengambil perbedaan dari gambar tunggal-recompressed dan mutliply-recompressed dan memperkuatnya untuk membuatnya terlihat, saya mendapatkan hasil ini (jauh lebih meyakinkan): i.stack.imgur.com/57uaY.png (lihat yang saya hapus jawaban atas apa yang dilakukan persis) Ini lebih meyakinkan karena orang tidak harus terus menatap gambar untuk mendeteksi perbedaan kecil.
Szabolcs
Perbedaannya sangat kecil. Jika Anda memiliki layar LCD besar, "gamma" berbeda yang dihasilkan dari sudut pandang yang sedikit berbeda dapat membuat artefak tampak lebih menonjol.
xiota
5

Rekompresi memang memiliki efek yang terukur pada kualitas gambar dan efek itu jauh lebih nyata ketika mengubah tingkat kompresi.

Sebagai pemeriksaan cepat di sini karena beberapa nilai SSIM untuk operasi dilakukan pada gambar uji yang berisi kombinasi fitur garis dan fitur berkelanjutan. Saya memilih JPG95 karena itulah yang saya diajarkan untuk digunakan di sekolah Ad-photo dan JPG83 karena itu umum di antara penyedia konten digital.

  • Simpan gambar Tiff sebagai JPG95 - .9989
  • Simpan gambar Tiff sebagai JPG83 - .9929
  • Resave gambar JPG95 sebagai JPG95 10 kali - .9998
  • Resave gambar JPG83 sebagai JPG83 10 kali - .9993
  • Resave JPG95 sebagai JPG83 kemudian resave sebagai JPG95 - .9929
  • Resave JPG95 sebagai JPG83 lalu JP83 ke JP92 lalu JPG92 ke JPG86 - .9914

Jadi jumlah kemiripan struktural yang hilang karena resaving pada kompresi yang sama 10 kali adalah 1/10 dari yang hilang karena menyelamatkannya pada kualitas dari tiff. Namun, kehilangan kualitas dari mengubah kompresi JPG bahkan sekali sama dengan kualitas yang hilang untuk menyimpan gambar itu dari Tiff ke JPG.

Saya akan menjalankan tes ini beberapa cara lagi dan memperbarui.

Metodologi : Dalam ImageJ:

  1. Konversi Tiff RGB ke skala abu-abu 8-bit
  2. Simpan JPG95 dan JPG83 dari Tiff Original
  3. Lakukan operasi resave lebih lanjut seperti yang ditentukan
  4. Muat gambar perbandingan dan gunakan Plugin Indeks SSIM

CATATAN: banyak orang yang melihat nilai SSIM untuk pertama kali membacanya sebagai persentase dan menganggap perbedaannya kecil. Ini belum tentu benar. Nilai SSIM harus dibandingkan relatif satu sama lain daripada dianggap sebagai varian dari 1.

PhotoScientist
sumber
@xiota, saya menggunakan plugin SSIM untuk ImageJ. Ini adalah salah satu dari beberapa implementasi SSIM yang memungkinkan penyesuaian parameter (saya menetapkan lebar filter menjadi 8 sehingga akan lebih mungkin untuk mendeteksi perubahan dalam blok JPEG 16px.) Saya lebih suka SSIM karena lebih sensitif terhadap perbedaan energi redistribusi. Gambar perbedaan dapat menyesatkan jika perbedaan dibatalkan atau perbedaan terkonsentrasi di area kecil.
PhotoScientist
Dan untuk pertanyaan kedua Anda, itu mengatakan bahwa perbedaan dari JPG95 ke JPG83 ke JPG95 sama dengan pergi dari Tiff ke JPG83. Jika Anda ingin Tiff-JPG95-JPG83-JPG95, yaitu .9923
PhotoScientist
Menambahkan percobaan dengan empat kompresi berbeda. Kehilangannya masih lebih besar tetapi jelas bahwa "konvergensi" yang terlihat selama beberapa generasi kompresi yang sama juga hadir ketika mencoba beberapa kompresi berbeda. Masih ingin mencoba ini dalam alur kerja App-centric tapi itu membutuhkan kerja keras sedikit lebih.
PhotoScientist
Masalah lain adalah bahwa tidak ada pemetaan standar pengaturan "kualitas" untuk ambang SSIM, juga tidak ada cara untuk menentukan pengaturan kualitas apa yang diperlukan untuk menghindari hilangnya informasi yang signifikan. Jika seseorang memuat JPEG dan menyimpannya pada pengaturan yang cukup tinggi, kehilangan kualitas tambahan dapat dihindari tetapi file tersebut kemungkinan akan semakin besar. Jika seseorang tidak tahu pengaturan apa yang digunakan saat file diproduksi, mungkin sulit untuk menentukan pengaturan apa yang digunakan ketika menyimpannya kembali.
supercat
4

Tidak seperti eksperimen. Skrip bash berikut (ditulis di Linux, dapat berfungsi di OSX jika Anda memiliki ImageMagick ):

  • dimulai dengan gambar pertama (bernama step000.jpg)
  • mengambil file JPEG, menambahkan titik putih (untuk membuktikan ini adalah gambar baru) dan menyimpannya sebagai (PNG lossless)
  • mengambil PNG, dan mengompres ulang sebagai JPEG (jadi kami tidak pernah mengompresi JPEG-ke-JPEG, dan tidak dapat berhipotesis bahwa perangkat lunak hanya menyalin blok yang disandikan)
  • membuat gambar yang menunjukkan piksel berbeda antara dua JPEG
  • bilas dan ulangi, menggunakan JPG keluaran dari langkah sebelumnya

Hasilnya adalah:

  1. tidak ada banyak kerugian pada kualitas JPG tinggi
  2. kesalahan pembulatan akhirnya diselesaikan, setelah beberapa generasi, hal-hal tidak menurun lagi.

Tentu saja semua ini mengasumsikan bahwa JPEG disimpan oleh perangkat lunak yang sama dengan parameter yang sama setiap kali.

#! /bin/bash
# Runs successive JPEG saves on an image to evaluate JPEG losses

# convert & compare command from imagemagick
# if you use a recent version of IM, set these variables to:
# compare="magick compare"
# convert="magick convert"
convert=convert
compare=compare

dotradius=2
defaultsteps=10
defaultquality=90 # default quality for "convert"

function usage {
        echo "Usage: $0 [quality [steps]]"
        echo ""
        echo "Where:"
        echo "       - 'quality' is the quality factor of the JPEG compression "
        echo "          (1-100, 100 is best, default is $defaultquality)"
        echo "       - 'steps' is the number of successive steps to perform"
        echo "         (default is $defaultsteps)"
        echo ""
        echo "Produces:"
        echo "   - successive saves of a JPEG image to test JPEG-induced losses."
        echo "   - compare images with the original file and the 1st JPEG save."
        echo ""
        echo "Starts from a 'step000.jpg' file in the current directory."
        exit 1
}

[[ -n "$3" ]] && { usage ; exit 1 ; }
steps=${1:-$defaultsteps}
quality=${2:-$defaultquality}    
dotcolor="white" # change this if the top of the image is too clear

echo "Running with $steps steps with quality $quality"

for step in $(seq $steps)
do 
    echo "Step $step of $steps"
    src=$(printf step%03d $(( $step - 1 )) ) 
    dst=$(printf step%03d $(( $step )) )
    dif=$(printf diff%03d $(( $step )) )
    # dot coordinates
    let cxc="2 * $dotradius * $step"
    let cxr="$cxc + $dotradius"
    let cyc="$dotradius * 2"
    let cyr="$dotsradius * 2"

    $convert $src.jpg -fill white -draw "circle $cxc,$cyc,$cxr,$cyr" $dst.png
    $convert $dst.png -quality $quality $dst.jpg
    rm $dst.png
    $compare $src.jpg $dst.jpg $dif.jpg
done

Untuk saat ini saya tidak akan menampilkan hasilnya, saya lebih suka membiarkan Anda bereksperimen dengan gambar Anda sendiri. Dengan komentar yang cukup, saya akan menambahkan sampel.

xenoid
sumber
1
Saya ingin tahu tentang hal perangkat lunak yang berbeda. Saya mencoba menyimpan 7x dari 7 perangkat lunak yang berbeda. Perbedaannya cukup besar sehingga saya memecahnya untuk melihat apakah setiap aplikasi memiliki kerugian yang sama. 1 aplikasi bertanggung jawab atas semua variasi. Setelah saya menghapus herring merah, 6x penyelamatan dari program 6x sama dengan 6x penyelamatan dari ImageJ
PhotoScientist
Kemungkinan ada beberapa perangkat lunak dengan kode buruk. Mungkin juga bahwa pencampuran algoritma dari berbagai aplikasi akan mencegah penyelesaian kesalahan juga.
xenoid
@xiota, itu adalah program kecil aneh yang disebut FLEMinimizer. Aku bahkan tidak ingat mengapa aku memilikinya. Yang lainnya adalah ImageJ, Matlab, Photoshop, FastStone Image Viewer, Ifranview, dan CameraRaw. Hampir tidak ada variasi pada langkah apa pun di antara keenam itu.
PhotoScientist