이미지 처리를 위한 파이썬 라이브러리 PIL 소개
PIL(Python Image Library)은 파이썬에서 이미지를 다루는 대표적인 3차 라이브러리로, 이미지의 열람, 변환, 조작 및 저장 등 다양한 작업을 지원한다. 원래는 파이썬 2용으로 개발되었으나, 현재는 공식적으로 유지보수되지 않으며, 그 대체품인 pillow가 널리 사용된다. 이 라이브러리는 기능 면에서 매우 풍부하며, 대부분의 이미지 처리 요구사항을 충족시킬 수 있다.
주요 기능 요약
- 이미지 압축 및 배치 처리: 일괄적으로 썸네일 생성, 포맷 변환, 출력 작업 가능
- 이미지 시각화: Tkinter, Windows DIB 등의 그래픽 인터페이스와 호환 가능
- 기본 이미지 조작: 회전, 크기 조정, 자르기, 반사, 색상 모드 전환, 필터링 등
- 고급 처리 기능: 색상 채널 분리/합성, 밝기/대비 강조, 프레임 기반 애니메이션 처리 (GIF 포함)
핵심 클래스: Image
Image 클래스는 모든 이미지 작업의 중심이 되며, 파일로부터 로드하거나 직접 생성할 수 있다.
1. 이미지 로드 및 정보 확인
from PIL import Image
# 이미지 파일 열기
img = Image.open("cat.jpg")
# 이미지 속성 출력
print(img.size) # (너비, 높이)
print(img.format) # 포맷 (예: JPEG, PNG)
print(img.mode) # 색상 모드 (예: RGB, L - 흑백)
2. 이미지 저장 및 형식 변환
# PNG 형식으로 저장
img.save("cat.png", "PNG")
3. 썸네일 생성
img.thumbnail((100, 100), resample=Image.BICUBIC)
img.show()
thumbnail()은 원본 이미지를 변경하는 메서드이며, 반환값은 None이다. 두 번째 인자는 리샘플링 방식으로, BICUBIC, LANCZOS, BILINEAR, NEAREST 중 선택 가능.
4. 영역 자르기 (Crop)
box = (50, 50, 200, 200) # (좌상, 우하)
cropped = img.crop(box)
cropped.show()
crop()는 지정된 좌표 범위 내의 부분을 추출하며, 결과는 새로운 Image 객체다.
5. 이미지 회전 및 반사
rotated = img.transpose(Image.ROTATE_90) # 90도 반시계 회전
flipped = img.transpose(Image.FLIP_LEFT_RIGHT) # 좌우 반전
지원되는 변형 방식: ROTATE_90, ROTATE_180, ROTATE_270, FLIP_TOP_BOTTOM, TRANSPOSE, TRANSVERSE.
6. 이미지 복사 및 붙여넣기 (Paste)
source_img = Image.open("logo.png")
img.paste(source_img, (100, 100)) # 좌상단 위치에 삽입
img.show()
두 번째 인자로는 좌표 튜플 또는 사각형 범위가 올 수 있으며, 마스크를 사용하면 특정 조건만 적용 가능.
7. 색상 채널 분리 및 병합
r, g, b = img.split()
merged = Image.merge("RGB", [b, r, g]) # R, G, B 순서 변경
merged.show()
이 방법을 통해 색상 구성 요소를 개별적으로 조작하고 다시 합칠 수 있다.
8. 이미지 크기 조정
resized = img.resize((200, 200), resample=Image.LANCZOS)
resized.show()
크기 조정 시, box 매개변수로 특정 영역만 조정할 수도 있다.
9. 색상 모드 전환
gray_img = img.convert("L") # 흑백 변환
color_img = gray_img.convert("RGB") # 다시 컬러로 복원
모드 전환은 RGB, L, CMYK 간에 가능하지만, 흑백에서 원래 색상을 정확히 복원하는 것은 불가능하다.
10. 필터 적용
from PIL import ImageFilter
blurred = img.filter(ImageFilter.GaussianBlur(radius=2))
edges = img.filter(ImageFilter.FIND_EDGES)
blurred.show()
edges.save("edges_result.jpg")
내장 필터: BLUR, GaussianBlur, FIND_EDGES, MEDIAN 등.
11. 픽셀 단위 연산 (Point)
enhanced = img.point(lambda x: x * 1.3) # 모든 픽셀 밝기 증가
enhanced.show()
함수를 통해 각 픽셀 값을 조작 가능. 주로 밝기 조절, 이진화 등에 사용.
12. 이미지 강화 (Enhancement)
from PIL import ImageEnhance
brightness = ImageEnhance.Brightness(img)
brightened = brightness.enhance(1.5)
contrast = ImageEnhance.Contrast(img)
enhanced_contrast = contrast.enhance(1.8)
밝기, 대비, 색상 강도 등을 제어할 수 있다.
13. GIF 애니메이션 처리
from PIL import ImageSequence
gif = Image.open("animation.gif")
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i+1}.png", "PNG")
또는 seek() 메서드를 사용해 프레임을 하나씩 읽을 수 있다.
index = 0
while True:
try:
gif.seek(index)
gif.save(f"frame_{index}.png")
index += 1
except EOFError:
break
GIF의 마지막 프레임에 도달하면 EOFError 발생 → 예외 처리로 종료 판단.