Pillow로 이미지 다루기

CROSSORBIT·2022년 6월 30일
0

Image-Processing

목록 보기
1/7
post-thumbnail

개요

  • Python Imaging Library(PIL)은 파이썬 인터프리터에 다양한 이미지 파일 형식을 지원하고 강력한 이미지 처리와 그래픽 기능을 제공하는 오픈 소스 라이브러리
  • 2011년 PIL 저장소에 대한 마지막 커밋으로 중단된 것으로 보이며 Pillow라는 후속 프로젝트가 PIL 저장소에서 갈려져 나와 Python 3.x 지원을 추가

주요 기능

  • 픽셀 단위의 조작
  • 마스킹 및 투명도 제어
  • 흐림, 윤곽 보정 다듬어 윤곽 검출 등의 이미지 필터
  • 선명하게, 밝기 보정, 명암 보정, 색 보정 등의 화상 조정
  • 이미지에 텍스트 추가 등

1. 설치하기

pip install Pillow

2. 이미지 열기(open)

image = Image.open('/Users/crossorbit/Desktop/book.png')

image.show()

3. 이미지 속성

print(f'이미지 파일명 : {format(image.filename)}')
print(f'이미지 파일형식 : {format(image.format)}')
print(f'이미지 사이즈 : {format(image.size)}')
print(f'이미지 색상모드 : {format(image.mode)}')
print(f'이미지 Width : {format(image.width)}')
print(f'이미지 Height : {format(image.height)}')

[출력]

이미지 파일명 : /Users/crossorbit/Desktop/book.png
이미지 파일형식 : PNG
이미지 사이즈 : (360, 438)
이미지 색상모드 : RGBA
이미지 Width : 360
이미지 Height : 438

4. 이미지 크기 변경(resize)

resize 함수는 크기 변경할 사이즈를 (width, height) 튜플 형식으로 설정할 수 있습니다.

# 크기 지정
resize_image = image.resize((150, 200))

# 비율로 조정하기
resize_image2 = image.resize((int(image.size[0]/5), int(image.size[1]/5)))

resize_image2

5. 이미지 자르기(crop)

crop 함수는 (x1, y1, x2, y2) 튜플 형식으로 인자를 받아 이미지를 잘라 냅니다.

# 인자값은 x1, y1, x2, y2
crop_image = image.crop((150, 140, 230, 180))

crop_image

[출력]

6. 이미지 회전(rotate)

crop 함수는 회전할 각도를 인자로 받아 이미지를 회전합니다. 90도, 180도, 270도 의 경우 아래 transpose 함수를 활용하는 방법도 있습니다.

rotate_image = image.rotate(180)

rotate_image

7. 이미지 대칭(transpose)

transpose 함수는 상하, 좌우 대칭시킬 때 활용할 수 있습니다.

  • PIL.Image.FLIP_LEFT_RIGHT : 좌우
  • PIL.Image.FLIP_TOP_BOTTOM : 상하
  • PIL.Image.ROTATE_90 : 90도
  • PIL.Image.ROTATE_180 : 180도
  • PIL.Image.ROTATE_270 :270도
flip_image = image.transpose(Image.FLIP_LEFT_RIGHT)

flip_image

8. 이미지 필터(filter)

filter 함수를 사용하려면 ImageFilter를 임포트 해야 합니다.

  • BLUR : BLUR, BoxBlur( ), GaussianBlur( )
  • MedianFilter( ), MinFilter( ), MaxFilter( )
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE, EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SHARPEN
  • SMOOTH, SMOOTH_MORE
from PIL import ImageFilter

filter_image = image.filter(ImageFilter.GaussianBlur(10))
filter_image = image.filter(ImageFilter.MedianFilter)
filter_image = image.filter(ImageFilter.SHARPEN)
filter_image = image.filter(ImageFilter.CONTOUR)


filter_image

9. 이미지 합치기(paste)

new 함수를 이용하며 새 이미지를 만든 후 paste 함수 활용하여 이미지를 합칠 수 있습니다.
new 의 인자는

  • 첫번째 인자 : mode
  • 두번째 인자 : size
  • 세번째 인자 : background color
new_image = Image.new("RGB", (750, 460), '#808080')
new_image.paste(image, (10, 10))
new_image.paste(filter_image, (image.width+20, 10))

new_image   

[출력]

10. 박스 그리기 & 텍스트 넣기

ImageDraw.Draw.rectangle 이용하여 원하는 좌표의 박스를 그리고, text 함수 이용하여 텍스트를 적용할 수 있습니다.

from PIL import ImageDraw, ImageFont

draw_image = ImageDraw.Draw(image)
draw_image.rectangle([150, 140, 230, 175], outline = 'green')

# 텍스트 설정
text = "도서명"

# 텍스트 폰트 설정
font = ImageFont.truetype('/Users/a06790/Downloads/costaurant/fonts/BMJUA_ttf.ttf', 10)

# 텍스트 크기(width, height) 설정
width_txt, height_txt = draw_image.textsize(text, font)

# 텍스트 위치 설정
width = 185
height = 150
margin = 10
x = width - width_txt - margin
y = height - height_txt - margin

# 텍스트 적용
draw_image.text((x, y), text, fill='green', font=font)

image

[출력]

11. 이미지 저장(save)

image.save('./images/draw_text.png', format='PNG')

12. 이미지 썸네일 만들기

image2 = Image.open('./images/draw_text.png')

thumbnail_size = (50, 50)
image2.thumbnail(thumbnail_size)
image2
profile
기억과 기록 그 사이 어딘가에서

0개의 댓글