[Utilities] libpng warning: iCCP: known incorrect sRGB profile
Introduction
학습에 이미지 데이터를 사용하다 보면 libpng warning: iCCP: known incorrect sRGB profile 라는 메시지가 콘솔 창에 출력될 때가 있다.
Error가 아닌 warning이기도 하고, 뭔가 에러가 레이즈 되어 프로세스가 멈추는 것도 아니지만 데이터를 훑을 때마다 반복적으로 메시지가 출력되니 콘솔 창이 난잡해진다.
특히 tqdm으로 프로세스 진행 상황을 트래킹하고 있다면 더더욱 문제를 뜯어고치고 싶을 것이다.
그래서 이번엔 이 메시지가 무슨 의미를 가지며, 어떻게 해결할 수 있는지 알아보려고 한다.
위 메시지는 libpng 라이브러리에서 발생시키는 메시지로,이미지 내에 유효하지 않은 iCCP (iCC Profile) chunk가 존재할 때 발생한다. 여기서 iCCP는 대체 뭘까?
iCC Profile (iCCP)
iCC Profile은 국제 컬러 협회 (International Color Consortium, ICC) 에서 정의한 표준으로, 모니터와 같은 색 출력 장치나 카메라와 같은 색 입력 장치가 처리할 수 있는 색상의 범위를 나타낸다.
일반적으로 색상 관련 장치들은 알려진 모든 색상 스펙트럼을 커버할 수 없기 때문에 제한된 범위의 표현력밖에 가지지 못 한다. 이러한 표현 범위는 개별 장치마다 다를 수 있는데, 이렇게 장치가 표현할 수 있는 색상 범위를 수치화 시켜 놓으면 장치 별로 색상이 어떻게 다르게 표현될 지 파악할 수 있으며 여러 장치 사이에서의 색상 표현에 대한 일관성을 유지하는 데 이용할 수도 있다.
흔히 사용되는 컬러 프로파일의 종류로는 sRGB, DCI-P3, Adobe RGB 등이 있다.
iCCP in PNG
근데 이런 color space 정보와 이미지 데이터는 서로 무슨 상관이 있는걸까? PNG나 JPEG와 같은 이미지 파일 포맷에는 이미지를 출력할 때 참고하기 위한 color space 정보가 함께 저장될 수 있다.
일반적인 경우에는 sRGB라는 컬러 프로파일을 사용해 이미지를 저장하고, 이미지를 읽거나 출력할 때에도 아무 정보가 없다면 기본적으로 sRGB 프로파일을 가진다 가정하게 된다. 실제로 대다수의 모니터도 sRGB 프로파일에 맞추어 표현 범위가 조정되어 있다고 한다.
현재 발생하는 메시지는, PNG나 JPEG 파일에 sRGB 컬러 프로파일이 같이 저장되어 있는데 이 데이터가 모종의 이유로 invalid 한 상태일 때 출력된다고 볼 수 있다.
So... what is the solution?
윗윗문단에서 언급했듯이 사실 sRGB 컬러 프로파일 정보가 굳이 이미지에 저장되어 있지 않아도 기본적으로 다들 sRGB를 가정하고 있기 때문에, 문제가 되는 이미지 데이터들에서 sRGB 컬러 프로파일 정보를 지워내기만 해도 해결된다.
이 작업을 수행하는 데는 포토샵 혹은 아무 이미지 처리 툴을 사용해 끄적끄적 클릭해 가면서 해결할 수도 있지만, 아무래도 터미널에서 명령어 기반 툴로 간편하게 처리하는 방향이 편할 것이다.
ImageMagick 패키지의 mogrify 명령어를 사용하면 invalid 한 컬러 프로파일 정보를 찾고 지워내는 게 가능하다.
Installation
$ sudo apt-get update
$ sudo apt-get install imagemagick
먼저 설치를 해 주자. 사실 본인은 이거 깐 적이 없는데 그냥 바로 명령어를 쳐 보니 잘 돌아갔다. 파이토치나 필로우 같은 라이브러리에 기본적으로 딸려 오고 있을 가능성이 있다.
Image backup (중요)
$ cp -R <source_folder> <destination_folder>
수정할 이미지가 있는 폴더를 따로 백업해 놓자. 이게 정말 중요한 부분이다!!! mogrify 명령어는 이미지를 in-place로 수정하는 명령어이기 때문에 잘못 실행했다간 돌이킬 방법이 없다.
Mogrify is dangerous, as it can easily destroy the original image!
Think and check before you Mogrify
mogrify
$ mogrify *
수정할 이미지가 있는 폴더에 가서 위 명령어를 실행시켜 주자. 알아서 모든 파일에 대해 이미지 load와 save를 진행하며, 중요한 데이터 자체는 그대로 놔둔 채로 corruption error가 발생하는 추가 information만을 제거해 준다.
따라서 위 에러 뿐만 아니라 아래와 같은 다른 에러 메시지도 같이 나오고 있었다면 함께 해결될 가능성이 크다.
Corrupt JPEG data: premature end of data segment
Corrupt JPEG data: bad Huffman code
Corrupt JPEG data: 22 extraneous bytes before marker 0xd9
...
본인도 세번째 라인에 해당하는 메시지가 같이 출력되는 상황이었는데 어느새 같이 해결되었었다.
사실 이 명령어는 (in-place option으로) 이미지 형 변환을 하거나 이미지에 transform을 가하는 기능을 하는데, 따로 옵션을 주지 않고 실행시키면 이렇게도 사용할 수 있는 듯 하다.
필요에 따라 특정 확장자만 처리한다던지 특정 패턴의 파일명만 처리한다던지 응용할 수도 있다.
아래는 참고할 만한 사이트들이다.
References
mogrify - mogrify an image
http://www.mit.edu/afs.new/athena/contrib/graphics/share/ImageMagick/www/mogrify.html
ImageMagick v6 Examples -- Basic Usage
https://legacy.imagemagick.org/Usage/basics/
libpng warning: iCCP: known incorrect sRGB profile
https://stackoverflow.com/questions/22745076/libpng-warning-iccp-known-incorrect-srgb-profile
What is a Color Profile?
https://www.howtogeek.com/343900/what-is-a-color-profile/
PNG (Portable Network Graphics) Specification, Version 1.2
http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html#C.iCCP
Can I save rendered images as PNG with a sRGB color profile?