Quase todas as perdas na qualidade da imagem ocorrem na primeira vez que uma imagem é compactada como JPEG. Independentemente de quantas vezes um JPEG é recomprimido com as mesmas configurações , as perdas geracionais são limitadas ao erro de arredondamento.
Os limites do MCU permanecem intactos (8x8 blocos).
A subamostragem de croma está desativada.
DQT constante (mesma configuração de qualidade).
No entanto, os erros de arredondamento podem ser grandes para cada iteração em que os critérios acima não são atendidos e é prudente manter backups de todos os arquivos originais.
Converter espaço de cores. Se desejar, reduza a informação da cor (subamostra de croma) (Perda) . Se não for reduzida, a perda de informações é o resultado de um erro de arredondamento .
Segmentação. Divida cada canal em blocos 8x8 (MCU = Unidade de codificação mínima). (Sem perdas)
Nota: Se a subamostragem de croma estiver ativada, as MCUs poderão ser efetivamente 16x8, 8x16 ou 16x16, em termos da imagem original. No entanto, os MCUs ainda são todos os blocos 8x8.
Transformação discreta de cosseno (DCT) em cada MCU. A perda de informações é o resultado de um erro de arredondamento .
Quantização. O valor em cada célula do MCU é dividido por um número especificado em uma tabela de quantização (DQT). Os valores são arredondados para baixo, muitos dos quais se tornarão zero. Essa é a parte com perdas primária do algoritmo.
Digitalização em zigue-zague. Reorganize os valores em cada MCU em uma sequência de números seguindo um padrão em zigue-zague. Os zeros que ocorreram durante a quantização serão agrupados. (Sem perdas)
DPCM = Modulação por código de pulso diferencial. Converta as seqüências numéricas em um formato mais fácil de compactar. (Sem perdas)
RLE = Execução de codificação de comprimento. Zeros consecutivos são compactados. (Sem perdas)
Codificação de Entropia / Huffman. (Sem perdas)
Recomprimindo JPEGs
Observe que a redução da amostragem dos canais de cores e a quantização são as únicas etapas intencionalmente com perdas . Deixando de lado o erro de arredondamento por enquanto, todas as outras etapas são sem perdas. Depois que a quantização ocorre, a reversão e a repetição da etapa fornecem resultados idênticos. Em outras palavras, a re-quantização (com o mesmo DQT) é sem perdas .
Em princípio, é possível criar um algoritmo de reamostragem sem perdas após a primeira passagem. No entanto, com a implementação no ImageMagick, as cores podem mudar drasticamente antes que o estado estacionário seja atingido, como visto na imagem desta.
Dadas as condições ideais, recomprimir um JPEG com as mesmas configurações de qualidade resultaria exatamente no mesmo JPEG. Em outras palavras, recomprimir JPEGs é potencialmente sem perdas . Na prática, recomprimir JPEGs não é sem perdas, mas está sujeito a, e limitado por, erro de arredondamento. Embora os erros de arredondamento geralmente acabem convergindo para zero , para que a mesma imagem seja recriada, a subamostragem de croma pode resultar em alterações significativas de cor.
Demonstração (mesma configuração de qualidade)
Eu escrevi o seguinte bash
script, que usa o ImageMagick para recomprimir repetidamente um arquivo JPEG em uma determinada configuração de qualidade:
#!/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
Depois de deixá-lo rodar por algumas centenas de iterações, executei md5sum
os resultados:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
Podemos ver que, de fato, o erro de arredondamento convergiu para zero e a mesma imagem exata está sendo reproduzida repetidamente .
Repeti isso várias vezes com diferentes imagens e configurações de qualidade. Normalmente, o estado estacionário é atingido, ea exata mesma imagem é reproduzida repetidamente.
Eu tentei replicar os resultados do mattdm usando o Imagemagick no Ubuntu 18.04. O original foi uma conversão bruta para TIFF em Rawtherapee, mas parece não estar mais disponível. Em seu lugar, peguei a versão ampliada e a reduzi ao tamanho original (256x256). Então recompactei repetidamente aos 75 anos até obter convergência. Aqui está o resultado (original, 1, n, diferença):
Meus resultados são diferentes. Sem o original verdadeiro, a razão da diferença é impossível de determinar.
Recompactei a imagem do canto superior esquerdo da montagem até a convergência em 90. Este é o resultado (original, 1, n, diferença):
Depois de ativar a subamostragem de croma, as cores mudam quando o estado estacionário é atingido.
Alterando entre um pequeno número de configurações
Modificando a variável q2
, a configuração de qualidade pode ser limitada a um conjunto de valores distribuídos uniformemente.
q2=$(( (RANDOM % 3)*5 + 70 ))
Para um pequeno número de opções de configuração, o equilíbrio pode eventualmente ser alcançado , o que é visto quando os valores de md5 começam a se repetir. Parece que quanto maior o conjunto, mais tempo demora e pior a imagem se torna, antes que o equilíbrio possa ser alcançado.
O que parece acontecer em equilíbrio é que o coeficiente de DCT antes da quantização deve ser divisível para todos (ou a maioria) dos valores quânticos. Por exemplo, se alternar entre dois DQTs em que o coeficiente DCT é dividido alternadamente por 3 e 5, o equilíbrio será alcançado quando o coeficiente DCT for divisível por 15. Isso explica por que a queda na qualidade é muito maior que a diferença entre as configurações originais.
Alterando entre um número maior de configurações
O Bisonho não fica feliz quando q2
muda assim:
q2=$(( (RANDOM % 9) + 90 ))
Para fazer um vídeo, use 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
Observar as primeiras 9999 iterações é quase como assistir a água ferver. Pode querer dobrar a velocidade de reprodução. Aqui está o Eeyore após 11999 iterações:
E se os limites do MCU mudarem?
Se as alterações ocorrerem um número limitado de vezes, é provável que a recompressão repetida atinja o estado estacionário. Se ocorrerem alterações a cada iteração, a imagem provavelmente será degradada de maneira semelhante a quando o DQT for alterado.
E a edição?
O efeito de recomprimir após a edição depende da edição específica realizada. Por exemplo, salvar na mesma configuração de qualidade após reduzir os artefatos JPEG reintroduziria os mesmos artefatos. No entanto, a aplicação de uma alteração localizada, como um pincel de recuperação, não afetaria áreas que não foram tocadas.
A maior queda na qualidade da imagem ocorre na primeira vez que o arquivo é compactado em uma determinada configuração de qualidade. A recompressão subsequente com a mesma configuração não deve introduzir nenhuma alteração maior que o erro de arredondamento. Portanto, eu esperaria que os ciclos de edição e salvamento em uma determinada configuração de qualidade parecessem com qualquer outra imagem salva com a mesma configuração de qualidade (desde que os limites do MCU permaneçam intactos e a subamostragem de croma esteja desativada ).
E esses vídeos?
Posso sobrescrever meus originais com JPEGs recomprimidos?
É prudente manter backups de todos os arquivos originais, mas se você substituir acidentalmente um, o dano provavelmente será limitado. Também seria bom trabalhar em JPEG com a subamostragem de croma desativada.
O JPEG não pode ser usado para imagens que usam mais de 8 bits por cor.