Python Image 라이브러리, Pillow

2019. 3. 7. 01:40Python/modules

(사진 부터 편안하다.)



Python Image 라이브러리, Pillow


이미지 처리에는 PIL, OpenCV, Pillow 등의 라이브러리가 사용 되는데, 그중 Plliow는 PIL(Python Image Library)를 Fork 하여 만들어진 라이브러리이다. 여러분이 Image를 리사이징 한다던지, Image의 Quality를 조절하여 이미지의 용량을 조절 한다던지 할 때 사용한다. 이 라이브러리는 대부분 백 앤드에서 Thumbnail을 만들 때 사용 하는 경우가 많다. 이미지를 원본 그대로 전송 할 경우 속도, 연산 양도 문제가 되지만, 요즘 같은 4G, 5G 모바일 환경에서 사용자가 서비스를 오래 사용하게 유도하기 위해서는 이미지 리사이징은 필수다.



Pillow 설치법


Pillow를 설치하는 방법은 pip을 이용하면 된다. virtualenv위에 설치 해도 무방하다.


1
$ pip install Pillow
cs



Pillow Tutorial


일단 사용법은 간단하다. Pillow를 설치 한 후 PIL 라이브러리에 있는 Image 클래스를 import, 파일의 상대 경로를 쓰면, 짜잔! 끝이다. Image 객체를 만들었다.

 

1
2
3
4
from PIL import Image
im = Image.open('kendrick.jpg')
 
print(im.format, im.size, im.mode)
cs


(출력 결과, 이미지 포맷, 사이즈, 색상 mode를 나타낸다.)


일단 간단하게 오늘 해볼 것은 다음과 같다.

  • 파일 포맷 변경
  • 썸네일 이미지 생성
  • 이미지의 일부 부분 추출
  • 이미지 회전
  • 이미지 리사이징
  • 이미지 필터링


파일 포맷 변경


jpg를 png로 바꾸는 방법은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
from PIL import Image
im = Image.open('kendrick.jpg')
 
output = 'kendrick.png'
 
try:
    im.save(output)
    temp = Image.open('kendrick.png')
    print(temp.format)
except:
    print('Something Wrong')
cs


(png 포맷으로 변환이 성공적으로 된 것을 확인 할 수 있다.)



썸네일 이미지 생성


Image.thumbnail(tuple) 메서드를 사용 하면 된다. 단, 사이즈 비율이 일치하지 않으면 그 사이즈에 맞게 짤리게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
from PIL import Image
im = Image.open('kendrick.jpg')
 
output = 'kendrick-thumbnail.jpg'
size = (64, 64)
 
try:
    im.thumbnail(size)
    im.save(output)
    temp = Image.open(output)
    print(temp.format, temp.size, temp.mode)
except:
    print('Something Wrong')
cs



(비율이 안맞는 관계로 size 튜플을 최대 사이즈로 상정하고, 이미지를 resize한 모습이다)



(실제 작동모습)


이미지의 일부 부분 추출


이번에는 좌, 상, 우, 하 정보가 들어간 튜플이 필요하다. Image.crop(tuple)을 이용하면 되나, 이는 새로운 Image 객체를 반환하므로, 변수로 값을 저장해야 한다.


1
2
3
4
5
6
7
8
9
10
11
from PIL import Image
im = Image.open('kendrick.jpg')
 
crop = (500015001000)  # 좌, 상, 우, 하
 
try:
    temp = im.crop(crop)
    print(temp.size, temp.mode)
    temp.save('kendrick-crop.jpg')
except:
    print('Something Wrong')
cs



(format은 출력 하는 시점이 파일 저장 전이기 때문에 None을 반환)

(이쁘게 짤렸다)



이미지 회전, 리사이징


이미지 회전은 Image.rotate(degree)를 사용하고, 리사이징은 Image.resize(tuple)을 사용 하면 된다. degree는 회전시킬 각도, tuple은 리사이징 할 사이즈를 넣으면 된다. 예시 코드는 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
from PIL import Image
im = Image.open('kendrick.jpg')
 
try:
    img1 = im.resize((500500))
    img1.save('kendrick-500.jpg')
    print(img1.size, img1.mode)
 
    img2 = im.rotate(180)
    img2.save('kendrick-180.jpg')
    print(img2.size, img2.mode)
except:
    print('Something Wrong')
cs



(출력 결과)



(첫 번째는 리사이징 한 결과 이다. 비율이 맞지 않아 사진이 눌린 모습이다. 두 번째는 180도 회전 한 모습이다. 둘 다 상태는 좋아 보이지 않는다.)



이미지 필터링


이미지 필터링은 ImageFilterimport 하고, Image.filter(filter) 메서드의 파라미터로 필터링 속성을 넣으면 된다. 이를 통해 블러 효과, 윤곽선 효과 등등을 얻을 수 있다. 필터링이 가능한 속성은 다음과 같다.


  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SHARPEN
  • SMOOTH
  • SMOOTH_MORE


많은데 일단 다 써보자 ㅎㅎ


1
2
3
4
5
6
7
8
9
10
from PIL import Image, ImageFilter
im = Image.open('kendrick.jpg')
 
list_var = [ImageFilter.BLUR, ImageFilter.CONTOUR, ImageFilter.DETAIL, 
ImageFilter.EDGE_ENHANCE, ImageFilter.EDGE_ENHANCE_MORE, ImageFilter.EMBOSS, ImageFilter.FIND_EDGES, 
ImageFilter.SHARPEN, ImageFilter.SMOOTH, ImageFilter.SMOOTH_MORE]
 
for i in range(len(list_var)):
    temp = im.filter(list_var[i])
    temp.save('kendrick-{}.jpg'.format(i))
cs


결과는 다음과 같다.


더 많은 정보는 아래의 공식 도큐 먼트에서 확인하자!


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



여러분들이 백앤드 프로그래밍을 하면서 이미지 파일을 다루는 일은 비일 비재 할 것이다. 혹여나 모른다. 딥러닝이랑 이 모듈을 연계해서 좀 쩌는 걸 만들수도..? 하여간, 오늘 포스팅은 여기까지 하도록 하겠다!



# 추가, File Object를 이용해서 Image 객체 생성법


1
2
= open('test.jpg''rb')
im3 = Image.open(f)
cs



'Python > modules' 카테고리의 다른 글

GET, POST 요청을 해보자! Requests  (0) 2019.03.09