Pillow 라이브러리

·2023년 6월 30일
0
post-thumbnail

📌 참고한 강의 링크

🔎 Pillow란?


이미지 처리를 도와주는 python library.

  • Pillow 설치 방법

pip install pillow
  • Pillow import

form PIL import Image, ImageFilter, .. else

🔎 Pillow

📍 이미지 생성, 저장

open

# create new image
image = Image.open('picture.jpg')

지정한 경로에 저장된 이미지를 불러온다.

new

# create a new image from scratch
image_blank = Image.new('RGBA',(820,605))

빈 이미지 생성.

save

# saving the picture
image.save('test_save.jpg')

지정한 경로에 이미지 저장

📍 이미지 정보 속성

# image information
print(image.size)
print(image.filename)

이미지 관련 정보가 저장된 속성을 접근할 수 있다.

filename     : 파일 이름, 또는 경로
format        : 파일 형식. PNG, JPEG 등의 값
mode           : 이미지 모드. 1, L, RGB, CMYK 등의 값
size           : 이미지 크기. (width, height) 형태의 튜플 리턴
weight        : 이미지 가로
height        : 이미지 세로
palette       : 이미지가 사용하는 팔레트
info           : 이미지 관련 데이터가 저장된 Dictionary
is_animated : 이미지가 2개 이상의 프레임으로 이루어져 있다면 True
n_frames     : 이미지의 프레임 수

📍 이미지 회전, 리사이징

crop

# image crop
image_crop = image.crop((0,0,300,600))
image_crop.show()

이미지를 잘라주는 메소드
left, up, right, down 순으로 파라미터를 입력한다.
시작점부터 x, y만큼 자르고 싶다면 (0,0, x, y)를 입력한다.

flip

# image flip
image_flip_horizontal = image.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
image_flip_horizontal.show()

image_flip_vertical = image.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
image_flip_vertical.show()

이미지를 반전시킨다.

FLIP_LEFT_RIGHT : 좌우 반전
FLIP_TOP_BOTTOM : 상하 반전

resize

# image resizing

#Bad Example
image_resize = image.resize((400,300))

# Good Example
scale_factor = 2
new_image_size = ((image.size[0] * scale_factor, image.size[1] * scale_factor))
image_resize_better = image.resize(new_image_size)

image_resize_better.show()

파라미터로 입력된 tuple의 크기만큼 이미지를 리사이징한다.
tuple에 상수를 전달하는 것보다
이미지의 기존 크기 * n
과 같이 전달하는 것이 바람직한 방법이라고 한다.

📍 ImageEnhance

Color

color_enhancer = ImageEnhance.Color(image)
enhanced_image = color_enhancer.enhance(2)
enhanced_image.show()

이미지 채도 설정.
0 : 흑백
1 : 기본값

Contrast

contrast_enhancer = ImageEnhance.Contrast(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()

이미지 대비 설정.
0 : 회색 이미지
1 : 기본값

Brightness

contrast_enhancer = ImageEnhance.Brightness(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()

이미지 밝기 설정.
0 : 검정색 이미지
1 : 기본값

Sharpness

contrast_enhancer = ImageEnhance.Sharpness(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()

이미지 선명도 설정.
0~1 : 블러 처리 된 이미지
1 : 기본값
1~ : 선명해진 이미지

📍 Filter

image_blur = image.filter(ImageFilter.BLUR)

필터는 강도 조절이 불가능하다.

💡 필터 종류

BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE

📍 image 메소드들

convert

# 흑백으로만 이루어진 사진
image_grayscale_1bit = image.convert('1')
# 무채색 사진 (회색 있음)
image_grayscale_8bit = image.convert('L')
# 256개의 색상으로 된 사진
palette = image.convert('P')
# 팔레트 관련 설정 가능
palette_16 = image.convert('P', palette = Image.Palette.ADAPTIVE, colors = 16)

사진의 모드를 변경한다.

# 색상값이 아니라, 가리키고 있는 색상의 팔레트 참조
print(array(palette, dtype=int)) 

# 팔레트의 색상 값.
# RGB 값으로 구성된 256가지 색상이므로 (256, 3)으로 reshape
print(array(palette.getpalette()).reshape(256,3))

palette만을 출력하면 색상값이 아니라, 팔레트 참조값이 나온다.
getpalette 메소드를 사용해야 진짜 색상값을 알 수 있다.

new_palette = [x//2 for x in palette_16.getpalette()]
palette_16.putpalette(new_palette)

팔레트가 가진 색상을 직접 변경할 수도 있다.

putpixel

image.putpixel((100,200),(255,0,0))

(x,y)의 위치에 (R,G,B) 값을 넣는다.

📍 ImageOps

ready-made 이미지 프로세싱 도구
필터랑 기능적으로 다른 부분은 잘 모르겠음...?
[공식문서]

💡 대부분의 모드는 'L', 'RGB' 이미지에서만 동작한다.

color changes

image_contrast = ImageOps.autocontrast(image = image, cutoff = 20)
image_inverted = ImageOps.invert(image)
image_solarize = ImageOps.solarize(image = image, threshold=100)
image_posterize = ImageOps.posterize(image = image, bits = 2)
image_grayscale = ImageOps.grayscale(image = image)
image_equalized = ImageOps.equalize(image = image)
image_colorize = ImageOps.colorize(image = image.convert('L'), black = 'green', white = 'red')

dimension changes

image_mirror = ImageOps.mirror(image)
image_filp = ImageOps.flip(image)
image_scale = ImageOps.scale(image=image, factor=0.4)
image_contain = ImageOps.contain(image=image, size=(500,200))

Adding and Removing

image_border = ImageOps.expand(image = image, border = 100, fill = (255,255,0))
image_padded = ImageOps.pad(image = image, size = (2500,1600))
image_fit = ImageOps.fit(image = image, size = (500,300))
image_crop = ImageOps.crop(image = image, border = 300)

0개의 댓글