파이썬에서 이미지 처리하기: PIL 라이브러리 활용법

이미지 처리를 위한 파이썬 라이브러리 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 발생 → 예외 처리로 종료 판단.

태그: PIL pillow Image Processing python image manipulation

6월 6일 22:09에 게시됨