이미지가 JPEG로 처음 압축 될 때 거의 모든 이미지 품질 손실이 발생합니다. 에 관계없이 JPEG가 재 압축 횟수의 동일한 설정으로 , 세대 손실은 오류를 반올림으로 제한됩니다.
그러나 위의 기준에 맞지 않는 반복마다 반올림 오류가 커질 수 있으며 모든 원본 파일의 백업을 유지하는 것이 좋습니다.
색 공간을 변환합니다. 원하는 경우 색상 정보를 다운 샘플링 (크로마 서브 샘플링) (손실) 합니다. 다운 샘플링되지 않은 경우 정보 손실은 반올림 오류 의 결과입니다 .
분할. 각 채널을 8x8 블록으로 나누십시오 (MCU = 최소 코딩 단위). (무손실)
참고 : 크로마 서브 샘플링이 활성화 된 경우 원래 이미지와 관련하여 MCU가 실제로 16x8, 8x16 또는 16x16 일 수 있습니다. 그러나 MCU는 여전히 8x8 블록입니다.
각 MCU의 이산 코사인 변환 (DCT). 정보 손실은 반올림 오류 의 결과입니다 .
정량화. MCU의 각 셀의 값은 양자화 테이블 (DQT)에 지정된 숫자로 나뉩니다. 값은 반올림되며, 대부분 0이됩니다. 이것은 알고리즘의 주요 손실 부분입니다.
지그재그 스캔. 각 MCU의 값을 지그재그 패턴에 따라 일련의 숫자로 재 배열합니다. 양자화 중에 발생한 0은 함께 그룹화됩니다. (무손실)
DPCM = 차동 펄스 코드 변조. 숫자 시퀀스를 압축하기 쉬운 형식으로 변환하십시오. (무손실)
RLE = 실행 길이 인코딩. 연속적인 0이 압축됩니다. (무손실)
엔트로피 / 허프만 코딩. (무손실)
JPEG 재 압축
참고 색상 채널을 다운 샘플링 및 양자화하는 유일한 의도적으로 손실 단계는 . 현재 반올림 오류를 설정하면 다른 모든 단계는 손실이 없습니다. 양자화가 발생하면 단계를 반전하고 반복하면 동일한 결과가 나타납니다. 다시 말해, (동일한 DQT를 갖는) 재-양자화는 무손실 이다.
원칙적으로, 첫 번째 통과 후에 손실이없는 리샘플링 알고리즘을 생성 할 수 있습니다. 그러나 ImageMagick에서 구현하면 이미지에서 볼 수 있듯이 정상 상태에 도달하기 전에 색상이 크게 변할 수 있습니다.
최적의 조건이 주어지면 동일한 품질 설정으로 JPEG를 다시 압축하면 정확히 동일한 JPEG가됩니다. 다시 말해 JPEG 재 압축은 잠재적으로 무손실 입니다. 실제로 JPEG 재 압축은 손실이 없지만 반올림 오류의 영향을받으며 제한됩니다. 반올림 오류가 종종 0으로 수렴되기 때문에 동일한 이미지가 다시 만들어 지 더라도 채도 서브 샘플링으로 인해 색상이 크게 변경 될 수 있습니다.
데모 (동일한 품질 설정)
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
실제로 반올림 오류가 0으로 수렴되었으며 동일한 이미지가 반복해서 재생되고 있음을 알 수 있습니다.
다른 이미지와 품질 설정으로 여러 번 반복했습니다. 일반적으로 정상 상태에 도달하고, 정확히 같은 이미지를 통해 재생 이상입니다.
Ubuntu 18.04에서 Imagemagick을 사용하여 mattdm의 결과를 복제하려고 시도했습니다. 원본은 Rawtherapee에서 TIFF로 변환되지 않았지만 더 이상 사용할 수없는 것 같습니다. 대신, 확대 버전을 가져 와서 원래 크기 (256x256)로 줄였습니다. 그런 다음 수렴을 얻을 때까지 75에서 반복해서 다시 압축했습니다. 결과는 다음과 같습니다 (원본, 1, n, 차이).
결과가 다릅니다. 진정한 원본이 없으면 차이의 이유를 판단 할 수 없습니다.
몽타주 왼쪽 상단에서 90으로 수렴 할 때까지 이미지를 다시 압축했습니다. 결과는 다음과 같습니다 (원본, 1, n, 차이).
크로마 서브 샘플링을 활성화 한 후에는 색상 정상 상태에 도달 하면 색상이 변경 됩니다.
적은 수의 설정 중에서 변경
변수를 수정하면 q2
품질 설정을 균일하게 분포 된 값 세트로 제한 할 수 있습니다.
q2=$(( (RANDOM % 3)*5 + 70 ))
A에 대한 설정 선택의 소수 평형 결국 도달 할 수 있는 md5 값이 반복 시작할 때 볼 수있는. 평형에 도달하기 전에 세트가 클수록 더 오래 걸리고 이미지가 더 나빠집니다.
평형에서 일어나는 것처럼 보이는 것은 양자화 전의 DCT 계수는 양자 값의 전부 (또는 대부분)로 나눌 수 있어야한다는 것입니다. 예를 들어 DCT 계수를 3과 5로 교대로 나누는 두 DQT 간을 전환하면 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 반복하는 것은 거의 물 종기를 보는 것과 같다. 재생 속도를 두 배로 늘리고 싶을 수도 있습니다. 11999 년 반복 후 Eeyore는 다음과 같습니다.
MCU 경계가 변경되면 어떻게됩니까?
변경 횟수가 제한된 경우 반복해서 다시 압축하면 정상 상태에 도달 할 수 있습니다. 반복 할 때마다 변경이 발생하면 DQT가 변경 될 때와 비슷한 방식으로 이미지가 저하 될 수 있습니다.
편집은 어떻습니까?
편집 후 재 압축의 효과는 수행 된 특정 편집에 따라 다릅니다. 예를 들어 JPEG 아티팩트를 줄인 후 동일한 품질 설정으로 저장하면 동일한 아티팩트가 다시 도입됩니다. 그러나 치유 브러시와 같은 현지화 된 변경을 적용해도 손대지 않은 영역에는 영향을 미치지 않습니다.
지정된 품질 설정에서 파일을 처음 압축하면 이미지 품질이 가장 떨어집니다. 동일한 설정으로 다시 압축하면 반올림 오류보다 큰 변화가 발생하지 않아야합니다. 따라서 MCU 경계가 그대로 유지되고 채도 서브 샘플링이 비활성화되어 있으면 동일한 품질 설정으로 저장된 다른 이미지와 같이 주어진 품질 설정에서 편집 복원주기가 예상됩니다 .
그 비디오는 어때?
재 압축 JPEG로 원본을 덮어 쓸 수 있습니까?
모든 원본 파일의 백업을 유지하는 것이 신중 하지만 실수로 파일을 덮어 쓰면 손상이 제한 될 수 있습니다. 크로마 서브 샘플링이 비활성화 된 JPEG에서 작동하는 것도 좋습니다.
색상 당 8 비트를 초과하는 이미지에는 JPEG를 사용할 수 없습니다.