Quasi tutte le perdite di qualità dell'immagine si verificano la prima volta che un'immagine viene compressa come JPEG. Indipendentemente da quante volte un JPEG viene ricompresso con le stesse impostazioni , le perdite generazionali sono limitate all'errore di arrotondamento.
I confini dell'MCU rimangono intatti (blocchi 8x8).
Il sottocampionamento Chroma è disabilitato.
DQT costante (stessa impostazione di qualità).
Tuttavia, gli errori di arrotondamento possono essere elevati per ogni iterazione in cui i criteri sopra indicati non sono soddisfatti ed è prudente conservare i backup di tutti i file originali.
Converti spazio colore. Se lo si desidera, sottocampionare le informazioni sul colore (campionamento cromatico) (Perdita) . Se non ricampionato, la perdita di informazioni è il risultato di un errore di arrotondamento .
Segmentazione. Dividi ogni canale in blocchi 8x8 (MCU = Unità di codifica minima). (Senza perdita di dati)
Nota: se il sottocampionamento chroma è abilitato, le MCU possono effettivamente essere 16x8, 8x16 o 16x16, in termini di immagine originale. Tuttavia, le MCU sono ancora tutti blocchi 8x8.
Trasformazione di coseno discreta (DCT) su ogni MCU. La perdita di informazioni è il risultato di un errore di arrotondamento .
Quantizzazione. Il valore in ciascuna cella dell'MCU è diviso per un numero specificato in una tabella di quantizzazione (DQT). I valori sono arrotondati per difetto, molti dei quali diventano zero. Questa è la parte con perdita principale dell'algoritmo.
Scansione a zig-zag. Riorganizzare i valori in ciascuna MCU in una sequenza di numeri seguendo uno schema a zig-zag. Gli zeri che si sono verificati durante la quantizzazione verranno raggruppati insieme. (Senza perdita di dati)
DPCM = Modulazione del codice dell'impulso differenziale. Converti le sequenze numeriche in un modulo più facile da comprimere. (Senza perdita di dati)
RLE = Esegui codifica lunghezza. Gli zeri consecutivi sono compressi. (Senza perdita di dati)
Entropia / Huffman Coding. (Senza perdita di dati)
Ricompressione di JPEG
Si noti che il downsampling dei canali di colore e la quantizzazione sono gli unici passaggi intenzionalmente con perdita di dati . Mettendo da parte l'errore di arrotondamento per ora, tutti gli altri passaggi sono senza perdita. Una volta avvenuta la quantizzazione, l'inversione e la ripetizione del passaggio danno risultati identici. In altre parole, la riquantizzazione (con lo stesso DQT) è senza perdita .
In linea di principio, è possibile creare un algoritmo di ricampionamento privo di perdite dopo il primo passaggio. Tuttavia, con l'implementazione in ImageMagick, i colori possono cambiare drasticamente prima che venga raggiunto lo stato stazionario, come si vede nell'immagine.
Date le condizioni ottimali, ricomprimere un JPEG con le stesse impostazioni di qualità comporterebbe esattamente lo stesso JPEG. In altre parole, ricomprimere JPEG è potenzialmente senza perdita di dati . In pratica, la ricompressione dei file JPEG non è senza perdita, ma soggetta e limitata da un errore di arrotondamento. Sebbene gli errori di arrotondamento spesso alla fine convergano a zero , in modo da ricreare la stessa identica immagine, il sottocampionamento di Chroma può comportare cambiamenti di colore significativi.
Dimostrazione (stessa impostazione di qualità)
Ho scritto il seguente bash
script, che utilizza ImageMagick per ricomprimere ripetutamente un file JPEG con una determinata impostazione di qualità:
#!/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
Dopo averlo lasciato funzionare per alcune centinaia di iterazioni, ho eseguito md5sum
i risultati:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Possiamo vedere che, in effetti, l'errore di arrotondamento è converto a zero e la stessa immagine viene riprodotta, ancora e ancora .
L'ho ripetuto più volte con immagini e impostazioni di qualità diverse. Di solito, viene raggiunto lo stato stazionario e la stessa immagine esatta viene riprodotta ripetutamente.
Ho provato a replicare i risultati di mattdm usando Imagemagick su Ubuntu 18.04. L'originale era una conversione grezza in TIFF in Rawtherapee, ma sembra non essere più disponibile. Al suo posto, ho preso la versione ingrandita e l'ho ridotta alla sua dimensione originale (256x256). Poi ho ripetutamente ricompresso a 75 finché non ho ottenuto la convergenza. Ecco il risultato (originale, 1, n, differenza):
I miei risultati sono diversi. Senza il vero originale, la ragione della differenza è impossibile da determinare.
Ho ricompresso l'immagine dall'angolo in alto a sinistra del montaggio fino alla convergenza a 90. Questo è il risultato (originale, 1, n, differenza):
Dopo aver abilitato il sottocampionamento cromatico, i colori cambiano quando viene raggiunto lo stato stabile.
Modifica tra un numero limitato di impostazioni
Modificando la variabile q2
, l'impostazione della qualità può essere limitata a un insieme di valori distribuiti uniformemente.
q2=$(( (RANDOM % 3)*5 + 70 ))
Per un numero limitato di opzioni di impostazione, alla fine può essere raggiunto l'equilibrio , che si vede quando i valori md5 iniziano a ricorrere. Sembra che più grande è l'insieme, più tempo impiega e peggiore diventa l'immagine, prima di raggiungere l'equilibrio.
Ciò che sembra accadere all'equilibrio è che il coefficiente DCT prima della quantizzazione deve essere divisibile per tutti (o la maggior parte) dei valori quantistici. Ad esempio, se si passa tra due DQT in cui il coefficiente DCT è diviso alternativamente per 3 e 5, l'equilibrio sarà raggiunto quando il coefficiente DCT è divisibile per 15. Questo spiega perché il calo di qualità è molto maggiore della differenza tra le impostazioni originali.
Modifica tra un numero maggiore di impostazioni
Eeyore non è felice quando q2
viene cambiato in questo modo:
q2=$(( (RANDOM % 9) + 90 ))
Per creare un video, utilizzare 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
Guardare le prime 9999 iterazioni è quasi come guardare bollire l'acqua. Potrebbe voler raddoppiare la velocità di riproduzione. Ecco Eeyore dopo 11999 iterazioni:
Cosa succede se i limiti dell'MCU cambiano?
Se i cambiamenti si verificano un numero limitato di volte, è probabile che la ricompressione ripetuta raggiunga uno stato stabile. Se si verificano cambiamenti ad ogni iterazione, l'immagine probabilmente si degraderà in modo simile a quando cambia DQT.
- Questo è ciò che accade nei video che ruotano un'immagine con dimensioni non divisibili per 8.
Che mi dici della modifica?
L'effetto della ricompressione dopo la modifica dipende dalla particolare modifica eseguita. Ad esempio, il salvataggio con la stessa impostazione di qualità dopo aver ridotto gli artefatti JPEG reintrodurrà gli stessi artefatti. Tuttavia, l'applicazione di una modifica localizzata, come un pennello correttivo, non influirebbe sulle aree che non sono state toccate.
Il calo maggiore della qualità dell'immagine si verifica la prima volta che il file viene compresso con una determinata impostazione di qualità. Successivamente la ricompressione con la stessa impostazione non dovrebbe introdurre alcun cambiamento maggiore dell'errore di arrotondamento. Quindi mi aspetterei che i cicli di modifica-salvataggio di una determinata impostazione di qualità assomiglino a qualsiasi altra immagine salvata con la stessa impostazione di qualità (fintanto che i confini dell'MCU rimangono intatti e il sottocampionamento cromatico è disabilitato ).
E quei video?
Implementazione JPEG difettosa? ( Salvataggio di 500 volte con Photoshop al 10/12. )
Modifica delle impostazioni di qualità. (La maggior parte dei video.)
Distruggere i confini della MCU. (Ritaglio o rotazione )
Altre manovre che riducono la qualità dell'immagine o interferiscono con l'algoritmo JPEG?
Posso sovrascrivere i miei originali con JPEG ricompressi?
È prudente conservare i backup di tutti i file originali, ma se si sovrascrive accidentalmente uno, il danno è probabilmente limitato. Andrebbe anche bene lavorare in JPEG con il sottocampionamento chroma disabilitato.
JPEG non può essere utilizzato per immagini che utilizzano più di 8 bit per colore.