Python Pillow Blur 특정 영역 처리 방법

Pillow를 이용하여 좌표값 (x1, y1)부터 (x2, y2)까지의 영역만 블러 처리하려면 어떻게 해야 할까요? Python Pillow Blur 특정 영역 처리 방법을 알아보겠습니다.

Python Pillow Blur 특정 영역 처리 방법?

앞서 포스팅 한 Python Pillow Blur 처리 방법 3가지에서 Pillow를 이용하여 Blur 처리하는 방법을 살펴 보았습니다. 그런데 (x1, y1)부터 (x2, y2)까지 Blur 처리하는 방법이 있는지 궁금하셨죠?

이번엔 좌표를 지정해서 그 영역만 블러 처리하는 방법을 알아보도록 하겠습니다.

우선 결론부터 말씀드리면 Pillow 자체에서 그런 기능을 제공하는 메서드는 없습니다.

그래서 오늘은 특정 영역을 Blur 처리해 주는 함수를 직접 제작해 보도록 하겠습니다.

이미지 처리 방식

우선 Blur 처리 하려는 이미지를 Crop해서 따낸 후, 해당 이미지를 블러처리하고 다시 원본 이미지의 해당 영역에 붙여넣는 작업을 해야 합니다.

아래 그림 1은 처리하고자 하는 원본 이미지입니다. 기존에 Python Pillow Blur 처리 방법 3가지에서 사용한 이미지를 동일하게 활용하도록 하겠습니다.

그림 1. Python Pillow Blur 특정 영역 처리를 위한 원본 이미지
그림 1. Python Pillow Blur 특정 영역 처리를 위한 원본 이미지

아래의 코드는 이미지를 불러와서 (60, 120)부터 (300, 190)까지의 영역을 가우시안 블러처리하는 코드입니다.

from PIL import Image, ImageFilter

img = Image.open("test.png")
box = (60, 120, 300, 190)
cropped = img.crop(box)
blurred_cropped = cropped.filter(ImageFilter.GaussianBlur(radius=3))
img.paste(blurred_cropped, box)
img.save("output.png")
Python

라인 3은 이미지를 불러옵니다.

라인 4는 블러 처리할 영역을 지정해 줍니다.

라인 5는 해당 영역을 Crop 처리해서 따냅니다. Crop 처리한 이미지는 다음 그림과 같습니다.

그림 2. crop 처리된 이미지
그림 2. crop 처리된 이미지

라인 6은 따낸 이미지를 블러처리 합니다.

그림 3. crop한 이미지를 blur 처리한 이미지
그림 3. crop한 이미지를 blur 처리한 이미지

라인 7은 블러처리한 이미지를 원본 이미지에 붙여넣습니다.

라인 8은 output.png 파일로 저장합니다.

그림 4. Python Pillow Blur 특정 영역 처리 결과
그림 4. Python Pillow Blur 특정 영역 처리 결과

Refactoring

위의 코드를 그대로 사용하려면 재사용하기 불편합니다. 코드를 매번 복붙해야 하는 수고로움이 따르겠죠. 간단한 함수로 리팩터링 해 보겠습니다. 사용하고 싶은 필터는 직접 넣어서 사용하면 되겠습니다. 처음에는 함수명을 blur로 하려고 했는데, 코드를 다시 보니 특정 영역을 filter 처리한 이미지를 돌려주는 함수라서 그냥 filter로 함수명을 정했습니다. 리팩터링은 일단 간단히 이정도만 해 두겠습니다.

from PIL import Image, ImageFilter

def filter(img, box, image_filter):
    cropped = img.crop(box)
    filtered = cropped.filter(image_filter)
    img.paste(filtered, box)
    return img


img = Image.open("test.png")
box = (60, 120, 300, 190)
blurred = filter(img, box, ImageFilter.GaussianBlur(radius=3))
blurred.save("output.png")
Python

필터를 변경할 필요없이 가우시안 블러만 이용하겠다면, 위와 같은 함수보다는 아래와 같은 함수가 더 재사용이 용이하겠죠? 리팩터링 정답이 없습니다. 필요한 곳에 필요한 정도로 리팩터링 하면 됩니다.

from PIL import Image, ImageFilter

def gaussian_blur(img, box):
    cropped = img.crop(box)
    filtered = cropped.filter(ImageFilter.GaussianBlur(radius=3))
    img.paste(filtered, box)
    return img


img = Image.open("test.png")
box = (60, 120, 300, 190)
blurred = filter(img, box)
blurred.save("output.png")
Python

여기까지 Python Pillow Blur 특정 영역 처리 방법을 함께 살펴보았습니다.

관련 자료

Pillow의 ImageFilter Module, Image Module 페이지를 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment