이미지 처리를 도와주는 python library.
pip install pillow
form PIL import Image, ImageFilter, .. else
# create new image
image = Image.open('picture.jpg')
지정한 경로에 저장된 이미지를 불러온다.
# create a new image from scratch
image_blank = Image.new('RGBA',(820,605))
빈 이미지 생성.
# 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
: 이미지의 프레임 수
# image crop
image_crop = image.crop((0,0,300,600))
image_crop.show()
이미지를 잘라주는 메소드
left
, up
, right
, down
순으로 파라미터를 입력한다.
시작점부터 x, y만큼 자르고 싶다면 (0,0, x, y)를 입력한다.
# 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
: 상하 반전
# 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
과 같이 전달하는 것이 바람직한 방법이라고 한다.
color_enhancer = ImageEnhance.Color(image)
enhanced_image = color_enhancer.enhance(2)
enhanced_image.show()
이미지 채도 설정.
0
: 흑백
1
: 기본값
contrast_enhancer = ImageEnhance.Contrast(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()
이미지 대비 설정.
0
: 회색 이미지
1
: 기본값
contrast_enhancer = ImageEnhance.Brightness(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()
이미지 밝기 설정.
0
: 검정색 이미지
1
: 기본값
contrast_enhancer = ImageEnhance.Sharpness(image)
enhanced_image = contrast_enhancer.enhance(2)
enhanced_image.show()
이미지 선명도 설정.
0
~1
: 블러 처리 된 이미지
1
: 기본값
1
~ : 선명해진 이미지
image_blur = image.filter(ImageFilter.BLUR)
필터는 강도 조절이 불가능하다.
💡 필터 종류
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE
# 흑백으로만 이루어진 사진
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)
팔레트가 가진 색상을 직접 변경할 수도 있다.
image.putpixel((100,200),(255,0,0))
(x,y)의 위치에 (R,G,B) 값을 넣는다.
ready-made 이미지 프로세싱 도구
필터랑 기능적으로 다른 부분은 잘 모르겠음...?
[공식문서]
💡 대부분의 모드는 'L', 'RGB' 이미지에서만 동작한다.
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')
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))
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)