반응형


발단은 한 줄의 트윗이었다.

jpeg로 반복 저장을 600회하면 원래 없던 붉은 점이 가득 끼며 화질이 열화되는 것을 넘어 박살이 난다는 얘기다…

이 트윗에 대한 답글로 온갖 이론이 난무하고, 결국 MS의 jpeg 인코더가 범인이라는 아무런 근거 없는 결론(?)[각주:1]이 났다.


근데, 근본적으로 생각해봤다.

jpeg는 이미지를 저장할 때 코사인을 기반으로 하는 DCT 변환을 하고, 고주파 성분을 제거하는 방식으로 손실압축을 한다.

즉, jpeg에서 화질의 열화는 있는 성분이 사라지는 것이지, 없던 게 태어나는 게 아니다.

좀 쉽게 표현하면 날카로움이 사라지고, 흐릿해지며, 두리뭉실해지는 것이다.


반복 저장을 하면 화질이 열화되는 건 당연한데, 결코 저런 방식일 수가 없는 것이다.




이론은 이론일 뿐이고, 과연 얼마나 손상되는지를 눈으로 확인하기 위해 간단하게 하나 만들어봤다.



이 프로그램의 기능은 다음과 같다.


1. 원본 jpeg이미지와 대상 폴더를 지정하면 해당 이미지를 폴더에 계속 읽었다 썼다를 반복


2. mozjpeg로 반복 인코딩을 하며, 최적화 여부를 선택할 수 있음

   즉, 최적화를 선택하면 mozjpeg으로 인코딩을 하고, 그렇지 않으면 libjpeg-turbo로 인코딩을 함[각주:2]


3. 반복 회수를 지정할 수 있으며, 지정된 횟수를 제외하고는 생성된 이미지는 모두 삭제함

   위 캡쳐의 설정은, 총 1000번 반복하며, 이 중 20/40/60/80… 번째 이미지만 남기고 모두 삭제한다는 뜻임


4. 저장 품질은 일정 범위를 지정해서 랜덤하게 적용할 수도 있고, 특정 값을 적용할 수도 있음


5. 남긴 이미지에 대해서는 원본과 비교하여 PSNR를 계산하고 csv 파일로 저장함


작업할 대상 이미지는 따로 구하지 않고, 발단이 되었던 이미지를 잘라내서 사용하기로 했다.


빨간 선도 그대로…


그리고, 이 이미지를 저장 품질을 바꿔가며 500번씩 저장해봤다.


각각 500번씩 반복저장한 결과


상식적이고, 당연한 결과지만 add noise 필터를 잔뜩 먹인 듯한 점들은 결코 나타나지 않는다.

오히려 빨간 선의 색이 보라색으로 변하며 다소 뭉개진 느낌이 든다.

재미있는 건 품질을 더 높게 지정했을 때 빨간 선이 더 많이 망가진다는 점. ㅋ


이 과정에서 PSNR의 변화는 다음과 같다.


012


이 그래프들을 보면 몇 가지 사실을 알 수 있다.


1. 저품질(Q=40)을 지정했을 때는 아예 처음부터 작정이라도 한 듯이 PSNR이 44를 유지함


2. 고품질에서는 PSNR이 떨어지다가 100번 이상 저장하면 일정한 값으로 수렴[각주:3]


3. 앞의 사진에서도 추측할 수 있듯이, Q=100일 때가 Q=90일 때보다 PNSR이 낮음




발단이 됐던 트윗과 그에 대한 멍청한 답글들에 대한 답변 및 시험 결과 요약


1. 600회까지 할 것도 없고, 50회 넘어가면 열화는 일정한 수준으로 수렴


2. 노이즈가 잔뜩 끼는 현상은 결코 벌어지지 않으니 혹세무민하지 마



덧1. 다양한 이미지로 테스트를 했는데, 본 포스트의 내용에서 벗어나는 결과는 없었음


덧2. 이 테스트와 별도로 MS의 jpeg 인코더가 용량 대비 화질이 떨어진다는 글은 종종 볼 수 있는 듯 함 (참조 링크)



  1. 답글 중 어설프게 아는 사람 하나가 엄청나게 아는 체하는 그림이 아주 아스트랄함 [본문으로]
  2. libjpeg-turbo에다 huffman table을 최적화하는 기능을 추가한 게 mozjpeg이라고 생각하면 대략 비슷함 [본문으로]
  3. 파일도 일정 수준에 다다르면 이전에 저장한 내용과 100% 동일해짐 [본문으로]
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band