Image 모듈 reference site를 들어가 보면 첫 번째로 보이는 함수가 open()입니다.
아래 설명을 통해 보자면 open()이라는 함수는 어떤 이미지 파일을 단지 identification(확인) 하는 역할을 수행합니다.
즉, 이미지 데이터를 읽어드린 것이 아니라 단지 이미지 파일에 대한 몇 가지 (메타)정보를 확인합니다.
예를 들어, 아래와 같이 Image.open() 함수를 통해 리턴 받은 img_input 값들을 살펴보면 Image 모듈의 기본적인 attribute 값들 (=filename, size, width, height, format) 과 그 외에 현재 이미지와 관련한 다양한 정보들을 포함하고 있다는걸 확인할 수 있습니다.
(↓↓↓ Image 모듈의 다양한 attribute들 ↓↓↓)
image 모듈은 굉장히 다양한 image file format을 지원합니다. 아래 링크에 접속하면 지원가능한 format 형식들이 나옵니다.
"The open() function identifies files from their contents. When an image is opened from a file, only that instance of the image is considered to have the format."
즉, 리턴 받은 값에서 다시 Image 모듈의 function, attribute를 사용할 수 있다는 뜻입니다.
예를 들어, 아래 코드와 같이 Image.open()를 통해 Image 객체를 리턴 받은 img_input가 Image 모듈의 함수 중 하나인 seek() 을 이용할 수 있다는걸 확인 할 수 있습니다.
Image.open() 함수의 parameter 부분에 "fp" 설명을 보면 마지막 부분에 "the file object must implement "read()", "seek()", "tell()"같은 함수를 사용해야 실제로 이미지 데이터를 load할 수 있다고 합니다. (이 부분은 뒤에서 "file.seek" 함수 를 설명할 때 더 자세히 하도록 하겠습니다)
2-2. Image.seek()
앞서 실제 이미지 데이터를 load 하는 함수에는 세 가지가 있다고 언급했습니다.
read()
seek()
tell()
보통은 read() 함수를 많이 사용하지만 가끔씩 이미지들이 frame 단위로 묶여있는 경우 seek() 함수를 이용해 이미지를 읽어들입니다.
예를 들어, 아래 train-labels 이미지 정보를 보면 512×512×30 형태로 제공된 것을 볼 수 있습니다.
512×512×30에서 30이 의미하는 바는 특정 이미지 frame을 의미합니다. 예를 들어, (512, 512, 1) 값들은 첫 번째 이미지frame을 뜻하고, (512, 512, 2) 값들은 두 번 째 이미지 frame을 뜻합니다.
그래서 위와 같은 이미지 형태를 읽어들일 때는 frame 단위로 이미지를 읽어야 하는 경우가 있습니다.이러한 경우는 seek 이라는 함수를 이용합니다.
for문과 seek() 함수를 통해 frame 별 이미지들을 하나씩 따로 불러올 수 있습니다.
이렇게 불러온 binary mode 이미지를 0~255 값으로, 즉 사람이 읽을 수 있는 값으로 변형 시키려면 numpy 패키지에서 제공해주는 함수를 이용하면 됩니다. 아래 코드에서는 numpy.asarray() 함수를 이용했네요.
굳이 위와 같이 numpy로 변경 시켜줄 필요 없이, tiff 이미지만 저장시키고 싶은 경우는 아래와 같이 코드를 작성해주면 됩니다.
그럼 아래와 같이 이미지가 frame 별로 따로 'tiff' 형식으로 저장되는걸 확인하실 수 있습니다.
지금까지 Image 모듈에 대한 설명과 기본적인 함수인 Image.open(), Image.seek() 에 대해서 알아보았습니다.
PIL는 Python Imaging Libarary의 약자로, 파이썬으로 이미지를 다룰 때 유용한 기능들을 제공하는 라이브러리 였습니다.
"PIL is the Python Imaging Library by Fredrik Lundh and Contributors."
파이썬에서 setuptools이란 python 라이브러리 를 확장 및 배포하는데 사용되는 extension libarary인데, 이러한 setuptools을 이용하여 프로젝트 빌드, 배포를 쉽게 관리할 수 있게 도와줍니다. 하지만, PIL는 "not setuptools compatible" 하다고 알려져 있었기 때문에 이를 개선하고자 PIL를 fork하여 Pillow라는 프로젝트를 실행하게 됩니다. (파이썬에 이미지를 다루는 또 다른 패키지로는 openCV가 있습니다)