이미지가 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, 차이).
![mattdm 복제 시도](https://i.imgur.com/WcP0qjx.jpg)
결과가 다릅니다. 진정한 원본이 없으면 차이의 이유를 판단 할 수 없습니다.
몽타주 왼쪽 상단에서 90으로 수렴 할 때까지 이미지를 다시 압축했습니다. 결과는 다음과 같습니다 (원본, 1, n, 차이).
![몽타주 복제 시도](https://i.imgur.com/Idv4eUz.jpg)
크로마 서브 샘플링을 활성화 한 후에는 색상 정상 상태에 도달 하면 색상이 변경 됩니다.
![색 변경](https://i.imgur.com/a3cqPfJ.jpg)
적은 수의 설정 중에서 변경
변수를 수정하면 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는 다음과 같습니다.
![11999 반복, 임의의 DQT](https://i.imgur.com/k6HLSY2.jpg)
MCU 경계가 변경되면 어떻게됩니까?
변경 횟수가 제한된 경우 반복해서 다시 압축하면 정상 상태에 도달 할 수 있습니다. 반복 할 때마다 변경이 발생하면 DQT가 변경 될 때와 비슷한 방식으로 이미지가 저하 될 수 있습니다.
편집은 어떻습니까?
편집 후 재 압축의 효과는 수행 된 특정 편집에 따라 다릅니다. 예를 들어 JPEG 아티팩트를 줄인 후 동일한 품질 설정으로 저장하면 동일한 아티팩트가 다시 도입됩니다. 그러나 치유 브러시와 같은 현지화 된 변경을 적용해도 손대지 않은 영역에는 영향을 미치지 않습니다.
지정된 품질 설정에서 파일을 처음 압축하면 이미지 품질이 가장 떨어집니다. 동일한 설정으로 다시 압축하면 반올림 오류보다 큰 변화가 발생하지 않아야합니다. 따라서 MCU 경계가 그대로 유지되고 채도 서브 샘플링이 비활성화되어 있으면 동일한 품질 설정으로 저장된 다른 이미지와 같이 주어진 품질 설정에서 편집 복원주기가 예상됩니다 .
그 비디오는 어때?
재 압축 JPEG로 원본을 덮어 쓸 수 있습니까?
모든 원본 파일의 백업을 유지하는 것이 신중 하지만 실수로 파일을 덮어 쓰면 손상이 제한 될 수 있습니다. 크로마 서브 샘플링이 비활성화 된 JPEG에서 작동하는 것도 좋습니다.
색상 당 8 비트를 초과하는 이미지에는 JPEG를 사용할 수 없습니다.