안녕하세요.

이번 글에서는 Pillow 패키지의 가장 기본이 되는 모듈인 Image 모듈에 대해서 설명하려고 합니다.

 

 

 

1. Image 모듈이란?

Image 모듈은 기본적으로 이미지 파일을 로드하거나 새로운 이미지를 생성하는 기능들을 제공해줍니다.

 

"The module also provides many factory functions, including loading images from files and creating new images."

 

 

모듈이라는 것은 크게 두 가지 요소로 구성되어 있다고 볼 수 있습니다.

  1. attribute = 속성
  2. function = 함수

 

 

먼저 Image 모듈 reference 사이트에 접속해서 어떤 attribute이 있는지 살펴보겠습니다.

 

(↓↓↓Image Module reference site↓↓↓)

https://pillow.readthedocs.io/en/stable/reference/Image.html

 

Image Module

The Image module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including functions to load images from files, a...

pillow.readthedocs.io

 

 

 

2. Image 모듈 함수(=function) (Feat. attribute)

2-1. Image.open()

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."

 

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#tiff

 

Image file formats

The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write support is less extensive, but most common...

pillow.readthedocs.io

 

위에서 사용한 이미지 파일의 format은 tiff인데, 위 링크에 들어가면 아래 화면 처럼 TIFF 파일 형식을 찾아볼 수 있습니다.

 

 

만약 TIFF 파일을 image.open()으로 읽어들이면 tiff 이미지와 관련된 다양한 값들을 리턴받을 수 있는데, 이러한 값들에 대한 설명이 아래와 같이 나옵니다.

 

 

 

(↓↓↓ TIFF file format (Feat. open()) ↓↓↓)

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#tiff

 

Image file formats

The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write support is less extensive, but most common...

pillow.readthedocs.io

 

 

 

image.open() 함수의 설명 중에는 또 이러한 아래와 같은 표현이 있습니다.

 

"The file object must be opened in binary mode." 

 

여기서 말하는 binary model란 "binary representation of the pixels"라고 보시면 됩니다.

 

이진 파일이란 컴퓨터는 읽을 수 있으나 사람을 읽지 못하는 파일입니다. 

보통 binary mode로 읽으면 byte 단위로 읽게되는 데, 아래 "data" 값을 보면 확인 할 수 있습니다. 

 

 

 

위와 같은 binary 관련 내용은 아래를 참고해주세요!

https://ballentain.tistory.com/50

 

이미지 읽는 방법 / cv.imdecode( ), io.BytesIO( )

이미지를 읽는 방법에는 여러가지가 있다. openCV를 사용해서 읽는 방법도 있고, PIL를 이용해서 읽는 방법도 있다. 최근에는 이미지 파일을 binary 형태로 읽은 다음( = byte 단위로 읽음 ) jpeg로 decodin

ballentain.tistory.com

 

https://stackoverflow.com/questions/48367128/string-to-bytes-python-without-change-in-encoding

 

String to Bytes Python without change in encoding

I have this issue and I can't figure out how to solve it. I have this string: data = '\xc4\xb7\x86\x17\xcd' When I tried to encode it: data.encode() I get this result: b'\xc3\x84\xc2\xb7\xc2\x...

stackoverflow.com

 

 

https://stackovergo.com/ko/q/980400/convert-binary-files-into-ascii-in-python

 

바이너리 파일을 Python에서 ascii로 변환 – 3 개의 답변

다음 형식의 데이터를 포함하는 바이너리 파일이 많이 있습니다. ... 질문 : python, binary, ascii, decoding.

stackovergo.com

 

 

 

 

Image.open() 함수의 리턴 값은 Image 객체입니다.

즉, 리턴 받은 값에서 다시 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 하는 함수에는 세 가지가 있다고 언급했습니다.

  1. read()
  2. seek()
  3. 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() 에 대해서 알아보았습니다.

감사합니다.

 

'파이썬 패키지 소개 > Pillow' 카테고리의 다른 글

1.Pillow 패키지란 무엇인가요?  (0) 2021.08.01

+ Recent posts