Python Pillow resize resample 파라미터 6가지 사용법

이미지 화질에 영향을 미치는 Pillow resize resample 파라미터를 소개하겠습니다.

Python Pillow resize resample 파라미터

resize 메서드 이용시 발생하는 문제점

지난 포스팅 Python Pillow resize 사용 방법에서는 Pillow를 이용하여 이미지 크기를 확대하거나 축소하는데 사용하는 resize 메서드에 대해서 살펴보았습니다. 그런데 resize 메서드를 이용해서 이미지를 확대하거나 축소하게 되면 이미지 손실이 뒤따르게 됩니다. 이러한 경우 resample을 이용하면 보다 깨끗한 이미지를 얻을 수 있습니다. resample 방식에 따른 이미지 확대와 축소의 결과를 살펴보도록 하겠습니다.

원본 이미지는 Pixabay에 TheUjulala가 공유한 이미지를 활용했습니다. 이미지를 제공해 주셔서 고맙습니다. 나무의 나이테와 테두리 등이 도드라지는 이미지라 resample 파라미터를 적용해 보기 좋겠다는 생각이 들어서 사용하게 되었습니다.

원본 이미지는 아래와 같습니다. 우선 resize를 통해서 확대할 부위는 아래의 빨간색 상자와 같습니다.

그림 1. Pillow resize resample에 이용할 원본 이미지
그림 1. Pillow resize resample에 이용할 원본 이미지: 확대

이미지 확대

우선 그림 1의 빨간 상자에 해당하는 이미지의 크기는 150×150이며, 400×400의 크기로 확대할 것입니다.

from PIL import Image
from PIL.Image import Resampling

size = (400, 400)
box = (100, 100, 250, 250)
img = Image.open("heart-1288420_640.jpg")
img_NEAREST = img.resize(size=size, box=box, resample=Resampling.NEAREST)
img_NEAREST.save("output_NEAREST.png")
img_BOX = img.resize(size=size, box=box, resample=Resampling.BOX)
img_BOX.save("output_BOX.png")
img_BILINEAR = img.resize(size=size, box=box, resample=Resampling.BILINEAR)
img_BILINEAR.save("output_BILINEAR.png")
img_HAMMING = img.resize(size=size, box=box, resample=Resampling.HAMMING)
img_HAMMING.save("output_HAMMING.png")
img_BICUBIC = img.resize(size=size, box=box, resample=Resampling.BICUBIC)
img_BICUBIC.save("output_BICUBIC.png")
img_LANCZOS = img.resize(size=size, box=box, resample=Resampling.LANCZOS)
img_LANCZOS.save("output_LANCZOS.png")
Python

resample 방식에 따른 결과는 아래의 이미지를 확인하면 됩니다. 쭉 확인해 보세요.

그림 2. Resampling.NEAREST 사용결과: 확대
그림 2. Resampling.NEAREST 사용결과: 확대
그림 3. Resampling.BOX 사용결과: 확대
그림 3. Resampling.BOX 사용결과: 확대
그림 4. Resampling.BILINEAR 사용결과: 확대
그림 4. Resampling.BILINEAR 사용결과: 확대
그림 5. Resampling.HAMMING 사용결과: 확대
그림 5. Resampling.HAMMING 사용결과: 확대
그림 6. Resampling.BICUBIC 사용결과: 확대
그림 6. Resampling.BICUBIC 사용결과: 확대
그림 7. Resampling.LANCZOS 사용결과: 확대
그림 7. Resampling.LANCZOS 사용결과: 확대

NEAREST와 BOX는 거의 같은 결과를 보여줍니다. 해당 픽셀이 박스 형태로 살아있습니다.

HAMMING은 NEAREST와 BOX보다 조금 부드럽게 다듬어준 느낌이 납니다. 이 세 가지는 픽셀의 박스 느낌이 살아있습니다.

BILINEAR, BICUBIC, LANCZOS의 경우에는 픽셀화되어 울퉁불퉁했던 이미지를 매끄럽게 교정해 주는 방식이 적용되었습니다. BILINEAR보다는 BICUBIC이 그리고 BICUBIC 보다는 LANCZOS가 보다 선명한 결과를 가져왔습니다. 차이가 아주 크지는 않지만 미세하게 차이가 있었습니다.

이미지 축소

이미지를 축소했을 때에는 각 필터의 효과가 어떻게 나는지 살펴보도록 하겠습니다. 이미지 축소에 사용할 원본의 영역은 아래와 같습니다. 크기는 (100, 100) 위치부터 350x350px입니다.

그림 8. Pillow resize resample에 이용할 원본 이미지: 축소
그림 8. Pillow resize resample에 이용할 원본 이미지: 축소

확대할 때 사용한 코드와 모두 동일하고, size와 box 파라미터 값에만 변화가 생겼습니다.

from PIL import Image
from PIL.Image import Resampling

size = (200, 200)
box = (100, 100, 450, 450)
img = Image.open("heart-1288420_640.jpg")
img_NEAREST = img.resize(size=size, box=box, resample=Resampling.NEAREST)
img_NEAREST.save("output_NEAREST.png")
img_BOX = img.resize(size=size, box=box, resample=Resampling.BOX)
img_BOX.save("output_BOX.png")
img_BILINEAR = img.resize(size=size, box=box, resample=Resampling.BILINEAR)
img_BILINEAR.save("output_BILINEAR.png")
img_HAMMING = img.resize(size=size, box=box, resample=Resampling.HAMMING)
img_HAMMING.save("output_HAMMING.png")
img_BICUBIC = img.resize(size=size, box=box, resample=Resampling.BICUBIC)
img_BICUBIC.save("output_BICUBIC.png")
img_LANCZOS = img.resize(size=size, box=box, resample=Resampling.LANCZOS)
img_LANCZOS.save("output_LANCZOS.png")
Python

resample 방식에 따른 이미지 축소 결과는 아래에 있습니다. 모두 살펴보세요.

그림 9. Resampling.NEAREST 사용결과: 축소
그림 9. Resampling.NEAREST 사용결과: 축소
그림 10. Resampling.BOX 사용결과: 축소
그림 10. Resampling.BOX 사용결과: 축소
그림 11. Resampling.BILINEAR 사용결과: 축소
그림 11. Resampling.BILINEAR 사용결과: 축소
그림 12. Resampling.HAMMING 사용결과: 축소
그림 12. Resampling.HAMMING 사용결과: 축소
그림 13. Resampling.BICUBIC 사용결과: 축소
그림 13. Resampling.BICUBIC 사용결과: 축소
그림 14. Resampling.LANCZOS 사용결과: 축소
그림 14. Resampling.LANCZOS 사용결과: 축소

NEAREST의 경우에는 색상이 전반적으로 좀 짙게 나타납니다. 선명도는 높으나 이미지 자체가 매끄럽게 표현되지는 않는 것 같습니다. BOX는 NEAREST에 비해 옅은 색상을 보입니다. 나이테는 보다 매끄럽게 표현되는 느낌입니다. 마찬가지로 BILINEAR는 BOX보다 더 옅은 느낌으로 이미지를 보다 부드럽게 표현해 냅니다.

BILINEAR에 비해 HAMMING은 선명도가 살짝 올라간 느낌입니다. BICUBIC과 LANCZOS는 HAMMING에 비해 조금 더 미세한 부분의 표현력이 나아지기는 했지만, 큰 차이는 없었습니다.

HAMMING과 BICUBIC, LANCZOS 이 세 가지는 큰 차이를 보이지 않았습니다.

정리

정리해보면 NEAREST와 BOX는 확대나 축소했을 때의 픽셀화된 느낌이 도드라지며, HAMMING은 BOX쪽에 다소 가까운 경향으로 선명도가 올라가는 느낌이 있습니다. BILINEAR, BICUBIC, LANCZOS의 경우에는 엇비슷한 결과를 보이며 비교적 이미지를 매끄럽게 처리하는 경향이 있었습니다. 보다 깨끗한 이미지를 얻기 원한다면 BILINEAR, BICUBIC, LANCZOS 이 세 가지 중에서 고르면 나쁘지 않을 것 같아 보입니다.

관련 자료

Pillow 패키지의 Image Module 페이지에서 resize 메서드 부분 중 resample 파라미터 부분을 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment