Python Pillow UnsharpMask 이미지 선명도 높이기

Python Pillow UnsharpMask 필터를 이용한 이미지 선명도를 개선하는 방법을 살펴보겠습니다.

이미지 선명도 높이기

지난 포스팅 Python Pillow 이미지 압축(60%) 및 선명도 개선에서는 임계값을 설정해서 해당 수치 이상의 값과 해당 수치 아래의 값을 동일한 값으로 처리해서 선명도를 높이는 방법을 살펴보았습니다. 특히 텍스트 이미지인 경우 처리하기에 유용한 방법이었죠.

이번에는 텍스트 이미지보다는 사진의 선명도를 개선하는데 도움이 되는 이미지 필터 UnsharpMask를 사용해 보도록 하겠습니다.

Python Pillow UnsharpMask 적용 결과

우선 Pillow UnsharpMask를 적용할 원본 이미지, 그리고 처리된 이미지를 함께 살펴보겠습니다. 아래 이미지는 tylermike525 님이 Pixabay에 제공한 구두 사진 원본 이미지입니다.

그림 1. Pillow UnsharpMask 적용 전 원본 이미지
그림 1. Pillow UnsharpMask 적용 전 원본 이미지

UnsharpMask 필터를 적용한 이미지는 그림 2와 같습니다. 원본 이미지에 비해 구두의 질감이 좀 더 뚜렷해진 것을 확인할 수 있습니다.

그림 2. Pillow UnsharpMask 적용한 이미지
그림 2. Pillow UnsharpMask 적용한 이미지

Python Pillow UnsharpMask 사용 방법

Image 모듈의 filter 메서드를 이용하는데 ImageFilter.UnsharpMask를 이용합니다. 파라미터는 3가지 radius, percent, threshold 값을 이용합니다.

radius는 값이 작을수록 작은 규모의 세부 묘사가 향상된다고 합니다. radius 값이 높을수록 가장자리에 후광이 생길 수 있다고 합니다.

percent는 가장자리 테두리가 얼마나 어두워지고 얼마나 밝아지는지를 설정할 수 있는 값입니다.

threshold는 임계값 설정을 통해서 더 뚜렷한 가장 자리를 선명하게 하는 데 이용할 수 있으며, 높은 임계값은 낮은 대비의 영역을 제외한다고 합니다.

각 값들은 적절하게 변경하면서 테스트 해 보고 경험해 보시기 바랍니다.

from PIL import Image, ImageFilter

img = Image.open("oxford-shoes-6078993_640.jpg")
sharpened_img = img.filter(ImageFilter.UnsharpMask(radius=5, percent=150, threshold=3))
sharpened_img.save("output.png")
Python

텍스트 이미지에 UnsharpMask 적용

앞서 텍스트 이미지에 사용하는 것보다 사진과 같은 이미지에 적용하는 것이 더 도움이 된다고 했는데, 그 이유는 아래의 적용 전 이미지와 적용 후 이미지를 비교해 보시면 느낄 수 있습니다. 우선 아래는 원본 이미지입니다.

그림 3. 텍스트 원본 이미지
그림 3. 텍스트 원본 이미지

구두 이미지에 적용한 코드와 동일한 파라미터 값을 이용하면 아래와 같은 이미지가 됩니다.

그림 4. 텍스트 이미지 UnsharpMask(radius=5, percent=150, threshold=3) 결과
그림 4. 텍스트 이미지 UnsharpMask(radius=5, percent=150, threshold=3) 결과

radius값을 30으로 높였습니다.

sharpened_img = img.filter(ImageFilter.UnsharpMask(radius=30, percent=150, threshold=3))
Python

radius 값을 30으로 높인 후 아래와 같이 보다 선명해진 텍스트를 확인할 수 있습니다. 배경에 얼룩이 좀 있기는 합니다. 그래서 텍스트에 적용하기에는 좀 아쉬움이 있다고 생각했습니다. 하지만, UnsharpMask를 통해서 선명도를 높이고, Python Pillow 이미지 압축(60%) 및 선명도 개선에서 언급한 방식으로 흐릿한 값들을 처리한다면 보다 선명한 텍스트 이미지를 얻어낼 수도 있을 것이라 조심스레 예상해 봅니다.

그림 5. 텍스트 이미지 UnsharpMask(radius=30, percent=150, threshold=3) 결과
그림 5. 텍스트 이미지 UnsharpMask(radius=30, percent=150, threshold=3) 결과

파라미터 값 조정에 따라 원하는 결과를 얻을 수 있을 것입니다. UnsharpMask 필터가 궁금하셨던 분들께 도움이 됐길 바랍니다.

관련 자료

Pillow의 이미지 필터 문서Wikipedia의 UnsharpMasking 문서를 참고하였습니다.

같이 읽으면 좋은 글

Leave a Comment