본문 바로가기
인터페이스 개발/Python

Python - Pillow 이미지 처리[PIP] - PIP, 이미지 읽기/저장/화면 출력, 색상 변경, 썸네일 만들기, 이미지 부분 잘라내기, center_crop, 이미지 회전 및 Resize, 이미지 필터링, 이미지 ↔ numpy 배열

by cooluk 2020. 7. 28.

Chap.16-1 Pillow 이미지 처리[PIP] -  PIP, 이미지 읽기/저장/화면 출력, 색상 변경, 썸네일 만들기, 이미지 부분 잘라내기, center_crop, 이미지 회전 및 Resize, 이미지 필터링, 이미지 ↔ numpy 배열

 

PIP

PIP, 이미지 읽기/저장/화면 출력, 색상 변경, 썸네일 만들기, 이미지 부분 잘라내기, center_crop, 이미지 회전 및 Resize, 이미지 필터링, 이미지 ↔ numpy 배열

 

PIP

  • 파이썬 이미지 처리 라이브러리

  • pip install pillow
    - 아나콘다에 기본 탑재되어 있음

  • 기본 사용방법

>> pip install pillow  # 터미널
프로젝트 폴더에 이미지파일 python.png 다운로드한 상태

python.png

 

이미지 읽기/저장/화면 출력

  • .open, .size, .save, .show

from PIL import Image  # Image는 대문자로 시작하니 Class

# 이미지 열기
im = Image.open('python.png')  # 스태틱 메서드 (팩토리 함수)

# 이미지 크기 출력(튜플)
print(im.size)

# 이미지 JPG로 저장
im.save('python.jpg')

# 이미지 화면 출력
im.show()

결과

(500, 333)

python.jpg

 

색상 변경

  • .convert

from PIL import Image

# convert : "L" (gray), "RGB", "RGBA", "CMYK"
im = Image.open('python.png').convert("L")  # 메서드 체이닝

im.save('python-gray.jpg')
im.show()

결과

python-gray.jpg

 

썸네일 만들기

  • .thumbnail

from PIL import Image

im = Image.open('python.png')

# Thumbnail 이미지 생성
size = (64, 64)
im.thumbnail(size)  # 변수 im의 원본을 변경시킴
                    # 가로 세로 비율을 유지하면서 줄여줌(긴쪽에 맞춘다)

im.save('python-thumb.jpg')
im.show()

print(im.size)

결과

python-thumb.jpg

 

이미지 부분 잘라내기

  • .crop

from PIL import Image

im = Image.open('python.png')
cropImage = im.crop((100, 100, 150, 150)) # (좌, 상, 우, 하)
# 사진의 최 좌측상단이 원점이다.
# (x1, y1, x2, y2) -> 좌상단(x1, y1) 우하단(x2,y2)
cropImage.save('python-crop.jpg')
cropImage.show()

결과

python-crop.jpg

 

center_crop

이미지 왜곡 없이 정사각형을 만드려면 잘라야한다.
가로 세로 중 짧은 쪽을 기준으로 가운데를 자른다.

함수로 만든다.

from PIL import Image

def center_crop(im):
    crop_size = min(im.size)

    left = (im.size[0] - crop_size)//2  # 몫을 구한다.
    top = (im.size[1] - crop_size)//2
    right = (im.size[0] + crop_size) // 2
    bottom = (im.size[1] + crop_size) // 2

    return im.crop((left, top, right, bottom))  # 튜플을 매개변수로

im = Image.open('python.png')
cropImage = center_crop(im)
cropImage.save('python-crop.jpg')
cropImage.show()

결과

python-crop(2).jpg

정보 손실이 발생할 수 있다.
가로 세로 중 긴쪽을 기준으로 정사각형을 만들면 정보 손실이 없다. (채우는 부분은 디폴트 값)
How -> 정사각형을 만들고 가운데에 이미지를 덮어써준다.

 

이미지 회전 및 Resize

  • .resize, .rotate

from PIL import Image
im = Image.open('python.png')

# 크기를 600x600 으로
img2 = im.resize((600, 600))
img2.save('python-600.jpg')
img2.show()

# 90도 회전 (기존 사이즈에서 이미지만 반시계 방향으로 90도 회전)
img3 = im.rotate(90)
img3.save('python-rotate.jpg')
img3.show()

결과

python-600.jpg
python-rotate.jpg

 

이미지 필터링

  • .filter

from PIL import Image, ImageFilter

im = Image.open('python.png')
blurImage = im.filter(ImageFilter.BLUR)  # 다른 필터는 검색해보자.

blurImage.save('python-blur.png')

결과

python-blur.png

import ImageFilter
선명한 이미지는 컴퓨터가 처리하기에 안좋다
. -> .filter(ImageFilter.BLUR)

 

 

이미지 ↔ numpy 배열

  • .array, .fromarray

numpy도 외부 라이브러리이다.

from PIL import Image
import numpy as np

im = Image.open('python.png')

# Image --> numpy array (3차원 데이터)
im2arr = np.array(im)  # im2arr.shape: height x width x channel
print(im2arr.shape)

# numpy array --> Image
arr2im = Image.fromarray(im2arr)

결과

(333, 500, 3)

그냥 실행하면 ModuleNotFoundError: No module named 'numpy' 가 나온다.
>> pip install numpy
픽셀 단위의 작업을 할 때 사용

댓글