Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬(Python)에서 이미지 처리하기 – Pillow 라이브러리 완벽 가이드

파이썬에서 이미지 처리 작업을 할 때 가장 널리 사용되는 사실상의 표준 라이브러리는 Pillow입니다. Pillow는 기존의 PIL(Python Image Library)의 개선된 버전으로, 간단한 작업부터 고급 이미지 조작까지 다양한 기능을 지원합니다. 또한 SciPy나 Matplotlib 같은 다른 파이썬 라이브러리에서도 간단한 이미지 지원의 기반이 되고 있습니다.

Pillow 설치하기

시작하기 전에 파이썬과 Pillow가 필요합니다. 리눅스 환경이라면 Pillow가 이미 설치되어 있을 가능성이 높습니다. Fedora, Debian/Ubuntu, ArchLinux 등 주요 리눅스 배포판은 기존에 PIL이 포함되어 있던 패키지에 Pillow를 포함하고 있기 때문입니다.

가장 간단한 설치 방법은 pip를 사용하는 것입니다.

pip install pillow

이미지 불러오기 및 화면에 표시하기

먼저 Pillow 라이브러리의 주요 기능을 시연할 수 있는 테스트용 이미지가 필요합니다.

여기서는 statue_of_unity 사진을 샘플 이미지로 사용하겠습니다. 이미지를 다운로드한 후 현재 작업 디렉터리에 저장하세요.

#Load and show an image with Pillow
from PIL import Image

#Load the image
img = Image.open('statue_of_unity.jpg')

#Get basic details about the image
print(img.format)
print(img.mode)
print(img.size)

#show the image
img.show()

실행 결과

JPEG
RGB
(400, 260)

위 코드에서는 Image 클래스의 open() 함수를 사용해 이미지를 직접 불러왔습니다. 이 함수는 이미지의 픽셀 데이터와 함께 이미지 관련 정보를 담고 있는 이미지 객체를 반환합니다.

  • format: 이미지 파일 형식(예: png, jpeg)을 나타냅니다.
  • mode: 픽셀 채널 형식(예: CMYK 또는 RGB)을 나타냅니다.
  • size: 이미지의 크기를 픽셀 단위(예: 400×260)로 나타냅니다.

show() 함수를 호출하면 운영체제의 기본 이미지 뷰어 애플리케이션을 통해 이미지가 표시됩니다.

이미지를 그레이스케일(흑백)로 변환하기

이미지를 그레이스케일로 변환한 후 화면에 표시하고 저장하는 것은 매우 간단합니다. 다음 코드만 실행하면 됩니다.

#Import required library
from PIL import Image
#Read an image & convert it to gray-scale
image = Image.open('statue_of_unity.jpg').convert('L')
#Display image
image.show()
#Save image
image.save('statue_of_unity_gs.jpg')

실행 결과

위 프로그램을 실행하면 현재 작업 디렉터리에 "statue_of_unity_gs.jpg"라는 흑백 이미지 파일이 생성됩니다.

다른 이미지 형식으로 변환하기

한 형식(jpeg)의 이미지를 다른 형식(예: png)으로 변환하는 것 역시 매우 쉽습니다.

from PIL import Image

image = Image.open('statue_of_unity.jpg')
image.save('statue_of_unity.png')

새로운 이미지 파일이 생성되어 기본 디렉터리에 저장됩니다. save() 함수는 저장 시 지정한 파일 확장자에 따라 자동으로 해당 형식으로 변환해 줍니다.

이미지 크기 조절하기

현재 이미지 파일의 크기는 400×260px입니다. 이를 440×600px로 변경하고 싶다면 resize() 메서드를 사용하면 됩니다.

from PIL import Image

image = Image.open('statue_of_unity.jpg')
newImage = image.resize((440, 600))
newImage.save('statue_of_unity_440x600.jpg')

위 코드를 실행하면 440×600px 크기의 새 파일 'statue_of_unity_440x600.jpg'가 생성되어 현재 작업 디렉터리에 저장됩니다.

결과를 보면 알 수 있듯이, resize()는 원본 이미지를 잘라내는(crop) 것이 아니라 원하는 크기로 확대·축소합니다. 따라서 비율이 달라질 경우 이미지가 늘어나거나 찌그러질 수 있습니다.

만약 이미지를 확대하지 않고 특정 영역만 잘라내고 싶다면 crop() 메서드를 사용하세요.

image.crop(box=None)

box 인자에는 (왼쪽, 위쪽, 오른쪽, 아래쪽) 좌표를 튜플 형태로 전달하여 원하는 영역을 지정할 수 있습니다.

이미지 회전하기

아래 프로그램은 이미지를 불러온 후 45도 회전하여 외부 뷰어로 표시합니다.

from PIL import Image

image = Image.open('statue_of_unity.jpg')
image.rotate(45).show()

rotate() 메서드는 반시계 방향으로 각도만큼 이미지를 회전합니다. 시계 방향으로 회전하려면 음수 값을 전달하면 됩니다.

썸네일 만들기

아래 프로그램은 현재 작업 디렉터리에 있는 모든 jpeg 이미지의 128×128 썸네일을 생성합니다.

from PIL import Image
import glob, os

size = 128, 128

for infile in glob.glob("*.jpg"):
    file, ext = os.path.splitext(infile)
    image = Image.open(infile)
    image.thumbnail(size, Image.ANTIALIAS)
    image.save(file + ".thumbnail", "JPEG")

실행 결과

이 코드를 실행하면 현재 디렉터리(c:\python\python361)에 있는 'statue_of_unity.jpg'를 포함한 모든 jpeg 파일의 썸네일이 생성됩니다.

thumbnail() 메서드는 이미지의 가로세로 비율을 유지하면서 지정한 크기 이하로 축소해 줍니다. resize()와 달리 비율이 깨지지 않으므로 미리보기 이미지를 만들 때 유용합니다.

마무리

이처럼 Pillow 라이브러리를 활용하면 몇 줄의 코드만으로 이미지 불러오기, 형식 변환, 그레이스케일 변환, 크기 조절, 회전, 썸네일 생성 등 다양한 이미지 처리 작업을 손쉽게 수행할 수 있습니다. 참고로 최신 버전의 Pillow에서는 Image.ANTIALIAS 상수가 deprecated되었으며, 대신 Image.Resampling.LANCZOS를 사용하는 것이 권장되니 버전에 맞게 코드를 조정하시기 바랍니다.