안녕하세요.

이번 글에서는 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

안녕하세요.

이번 글에서는 Pillow라는 파이썬 패키지에 대해서 소개해드리려고 합니다.

 

 

1. Pillow 패키지란?

Pillow 패키지를 설명하기 전에 PIL 패키지에 대해 간단히 설명하겠습니다.

 

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가 있습니다)

 

(↓↓Pillow 공식 사이트↓)

https://pillow.readthedocs.io/en/stable/

 

Pillow

Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors. Pillow for enterprise is available via the Tidelift Subscription...

pillow.readthedocs.io

 

 

2. Pillow 패키지 설치하는 방식은?

Pillow 패키지를 설치하기 전에 알아두어야 할 사항들을 정리해보겠습니다.

 

 

2-1. PIL 설치 여부 확인

Pillow를 설치하는 방법을 알려주는 사이트에 접속하면 아래와 같은 주의사항을 알려줍니다.

 

"Pillow and PIL cannot co-exist in the same environment. Before installing Pillow, please uninstall PIL."

 

즉, Pillow를 설치하기 전에 PIL가 있으면, PIL를 uninstall 해주어야 합니다.

 

(↓↓Pillow 설치 방식↓)

https://pillow.readthedocs.io/en/stable/installation.html#warnings

 

Installation

Warnings: Python Support: Pillow supports these Python versions.,,,,,,,,,,,,, Python, 3.9, 3.8, 3.7, 3.6, 3.5, 3.4, 3.3, 3.2, 2.7, 2.6, 2.5, 2.4,, Pillow >= 8.0, Yes, Yes, Yes, Yes,,,,,,,,,, Pillow...

pillow.readthedocs.io

 

 

 

2-2. Python 버전 확인

지금까지 Pillow 패키지는 여러 업데이트를 통해 다양한 버전이 release 되었습니다. 

Python 패키지도 마찬가지로 다양한 버전이 있죠.

 

그래서, Pillow 패키지를 설치 할 시, 파이썬 버전과 Pillow 패키지 간의 호환성을 고려해야 합니다.

(예를 들어, Pillow 7.0 버전을 만들 때는 python 3.5 버전의 기능 중 python 3.4에서 추가된 기능등을 이용했다고 하면, 당연히 python 3.4 버전에서는 호환이 안되겠죠?)

 

 

 

2-3. OS (Operating System) 확인

사실 패키지를 설치하기 위해서 OS까지 확인하는 경우는 없지만, 만일의 경우에 대비해서 Pillow 개발자들이 테스트한 환경에 맞게 세팅해준다면 더 안전할 수 있겠죠?

 

아래와 같은 표를 보면 OS 마다 Pillow를 어떤 python 버전에서 테스트 했는지 나와있습니다. 

Supporting해주는 python 버전이 있으니, python 버전에 맞는 Pillow 패키지 버전을 설치해주면 되겠죠? 

 

(Tested architecture 부분은 CPU 모델과 관련된 설명인데, 자세한 부분은 아래 글을 참고해주세요)

https://89douner.tistory.com/151

 

2.Core 그리고 CPU,Memory,OS간의 관계 (32bit 64bit; x86, x64)

안녕하세요~ CPU를 보시면 x86, x64 아키텍처라는 걸 본적있으시죠? 폴더갖은 곳에서도 x86, x64 폴더가 따로 존재하는것도 본적있으실거에요! 이번 시간에는 x86, x64가 어떤 개념인지 알아보기 위해 C

89douner.tistory.com

 

 

2-5. Pillow 패키지 설치

 

아래와 같은 명령어를 사용하시면 Pillow 패키지가 설치 됩니다.

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

 

하지만, 아나콘다 가상환경을 이용하시는 분은 Pillow 패키지 설치 시, 아래의 글을 참고해주세요! 

("ctrl+F" 누른 후, "pillow" 검색)

https://89douner.tistory.com/73

 

4. 아나콘다 가상환경 구축하기

안녕하세요~ 제가 이전글에서 했던 질문을 다시 가져와 볼게요. "여러분이 진행하는 프로젝트에서 딥러닝과 관련된 프로그램을 3개(A,B,C) 정도 사용한다고 했을때 여러분의 PC는 하나라고 가정

89douner.tistory.com

 

 

 

 

 

3. Pillow 모듈

Pillow 패키지에는 굉장히 다양힌 모듈들이 있습니다.

어떠한 이미지 관련 기능을 제공해주는지에 따라서 모듈의 종류가 결정됩니다.

 

 

(↓↓Pillow 모듈들 reference↓)

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

 

Reference

Image Module- Examples, Functions, The Image Class, Image Attributes, Classes, Constants., ImageChops(“Channel Operations”) Module- Functions., ImageCms Module- Functions, CmsProfile., ImageColor M...

pillow.readthedocs.io

 

※참고로 파이썬에서 모듈이란 "함수나 변수 또는 클래스를 모아 놓은 파일"을 지칭합니다.

(↓↓모듈에 대한 설명↓)

https://wikidocs.net/29

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

 

그렇다면, Pillow 패키지 중 가장 기본이 되는 Image 모듈에는 어떤 기능이 있을까요?

이러한 모듈을 어떻게 사용할 수 있을까요?

 

다음 글에서 알아보도록 하겠습니다!

 

 

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

2. Image 모듈 (Image.open(), Image.seek())  (2) 2021.08.01

+ Recent posts