본문 바로가기
목차
Python

Pillow 사용법 - Basic 04 - ImageFilter

by ds31x 2025. 7. 1.
728x90
반응형

PIL.ImageFilter는 이미지에

  • blur, sharpening, edge detection, emboss 등
  • 다양한 시각적 효과를 적용할 수 있는 사전 정의된 필터들을 제공하는 모듈.

이는 convoluton 기반으로 동작하는 다양한 필터를 사전 정의하여 제공하며, 

사용자가 고유의 kernel 로 설계도 가능함.

 

참고로, 보다 정확하고 자세한 건 아래 url의 소스코드를 참고하라.

https://github.com/python-pillow/Pillow/blob/main/src/PIL/ImageFilter.py

 

Pillow/src/PIL/ImageFilter.py at main · python-pillow/Pillow

Python Imaging Library (Fork). Contribute to python-pillow/Pillow development by creating an account on GitHub.

github.com

 

이 문서의 필터는 다음의 gist 로 실제 동작을 확인할 수 있음:

https://gist.github.com/dsaint31x/5dbd4fdcac38108c9fe5a055dfe9778c

 

pillow_basic04_image_filter.ipynb

pillow_basic04_image_filter.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com


0. BoxBlur 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

단순 averaging blur를 적용하여 이미지를 부드럽게 만듦.

PIL.ImageFilter.BoxBlur(radius=1.0)
  • radius: blur radius (기본값 1, float 값 지원) - 반지름이라고 했지만, box의 폭을 결정하는데 사용됨.

수식:

각 픽셀에 대해 주변의 (2×radius+1)² 크기의 박스 내에서 모든 픽셀들의 평균으로 대체

  • radius 크기와 무관하게 선형 시간 복잡도로 동작 (매우 빠름)
  • radius는 float 값 지원으로 세밀한 조정 가능
  • radius=0이면 원본과 동일한 이미지 반환
  • 큰 반경의 블러에서도 우수한 성능을 보임

빠른 연산이지만 품질은 GaussianBlur보다 낮음.

 

사용 예는 다음과 같음:

from PIL import ImageFilter
blurred_img = img.filter(ImageFilter.BoxBlur(radius=4.5))


1. BLUR 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

5×5 크기의 "도넛 모양" 커널을 사용하여 특별한 블러 효과를 적용.

  • 일반적인 박스 블러와 다른 "도넛 블러" 효과
  • 중앙 픽셀 정보를 제외하고 주변부만으로 평균을 계산
  • 가장자리 정보를 더 많이 활용한 독특한 블러 알고리즘
PIL.ImageFilter.BLUR
  • 매개변수 없음 (고정된 5×5 커널 사용)

BLUR 커널:

1/16 * [1 1 1 1 1]  
       [1 0 0 0 1]  
       [1 0 0 0 1]  
       [1 0 0 0 1]  
       [1 1 1 1 1]
  • 테두리 16개 픽셀만 사용 (가중치 1)
  • 중앙 9개 픽셀은 무시 (가중치 0)
  • 결과 = (테두리 16개 픽셀의 합) / 16
# 동일한 효과의 커스텀 커널
custom_blur = ImageFilter.Kernel(
    size=(5, 5),
    kernel=[1, 1, 1, 1, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 0, 0, 0, 1,
            1, 1, 1, 1, 1],
    scale=16 # 나누어짐.
)

 

사용 예제 코드는 다음과 같음:

from PIL import ImageFilter
blurred_img = img.filter(ImageFilter.BLUR)


2. GaussianBlur 필터

PIL.ImageFilter 모듈에서 제공하는 클래스.

가우시안 분포를 사용한 가장 널리 사용되는 blurring filter.

PIL.ImageFilter.GaussianBlur(radius=2)
  • radius: blur 반경 (기본값 2.0, 클수록 더 흐릿함)

가우시안 수식:

$$G(x, y) = \frac{1}{2\pi\sigma^2} \, e^{-\frac{x^2 + y^2}{2\sigma^2}}$$

  • $\sigma$: radius 임. (Standard deviation of the Gaussian kernel)
  • 가장 널리 사용되는 Blur 중 하나.
  • BLUR보다 연산량이 많지만 품질은 보다 우수함.
  • 배경 흐림, 노이즈 감소, 부드러운 효과에 적합

사용예는 다음과 같음:

gaussian_blur = ImageFilter.GaussianBlur(radius=5)
blurred_img = img.filter(gaussian_blur)

 

참고로, 다른 라이브러리에선 radius와 $\sigma$가 보통 다를 수 있음.

OpenCV와 SciPy의 경우:

  • OpenCV: kernel_radius = $3\sigma$
  • SciPy: kernel_radius = int($4\sigma$ + 0.5)

3. SHARPEN 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

이미지의 가장자리를 강조하여 선명도를 향상시킴.

PIL.ImageFilter.SHARPEN
  • 매개변수 없음 (고정된 3x3 커널 사용)

SHARPEN 커널:

  [-2 -2 -2]
  [-2 32 -2]
  [-2 -2 -2]
  • 이 커널 적용 후 1/16을 곱해줌.
filterargs = (3, 3), 16, 0, (
    -2, -2, -2,
    -2, 32, -2,
    -2, -2, -2,
)
# 정규화하면: 1/16 × 커널
  • 중심 픽셀을 강조하고 주변 픽셀을 약화시켜 대비 증가
  • 흐릿한 이미지의 선명도 복원에 사용
  • 과도하게 적용하면 노이즈 증가 및 부자연스러운 효과 발생

사용예는 다음과 같음:

sharpened_img = img.filter(ImageFilter.SHARPEN)


4. EDGE_ENHANCE 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

이미지의 가장자리를 강화하여 (SHARPEN 대비) 윤곽선을 더욱 뚜렷하게 만듦.

PIL.ImageFilter.EDGE_ENHANCE
  • 매개변수 없음 (고정된 3x3 커널 사용)

Edge Enhance 커널:

  [-1 -1 -1]
  [-1 10 -1]
  [-1 -1 -1]

 

Pillow의 코드 구현을 참고하면 다음과 같음.

filterargs = (3, 3), 2, 0, ( #2는 나누어지는 normalizaton factor, 0은 bias.
    -1, -1, -1,
    -1, 10, -1,
    -1, -1, -1,
)
# 정규화하면: 1/2 × 커널
  • Pillow에선 SHARPEN과의 차이가 강도차이만 존재
  • 원래 Edge Enhancement는 subtle detail은 강조하지 않는 것이 일반적이나, Pillow에선 둘 다 high pass filter (HPF)임.
    • Pillow의 EDGE_ENHANCE는 좀 더 강력한 HPF라고 봐도 된다. 
  • EDGE_ENHANCE는 중심 가중치가 5로 훨씬 강하게 고주파 성분이 강조됨.
    • SHARPEN은 32/16=2 로 중심이 나머지 주변은 -2/16=-0.125로 가중치가 주어짐.
    • EDGE_ENHANCE는 10/2=5 로 중심에 보다 높은 가중지를 주고, 주변도 -1/2=-0.5로 음의 방향으로 더 높은 가중치가 주어짐.
  • 더 강한 HPF는 EDGE_ENHANCE_MORE 임.

사용예제 코드는 다음과 같음:

edge_enhanced = img.filter(ImageFilter.EDGE_ENHANCE)


5. FIND_EDGES 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

이미지에서 가장자리만을 검출하여 윤곽선 이미지를 생성.

검은 배경에 밝은 edge가 됨.

PIL.ImageFilter.FIND_EDGES
  • 매개변수 없음 (고정된 3x3 커널 사용)

가장자리 검출 커널 수식:

  [-1 -1 -1]
  [-1  8 -1]
  [-1 -1 -1]
  • 원본 이미지 정보는 제거되고 edge만 큰 값으로 남김
  • 객체 인식, 윤곽선 추출, 스케치 효과에 사용

사용 예제 코드는 다음과 같음:

edges = img.filter(ImageFilter.FIND_EDGES)

 


6. CONTOUR 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

가장자리 검출 후 배경이 흰색이 되고 윤곽이 어두워지는 스타일로 변환.

흰 배경에 어두운 윤곽선!
(FINDE_EDGES와 차이점)

사전 정의된 필터.

PIL.ImageFilter.CONTOUR
  • 매개변수 없음 (고정된 3x3 커널 사용)

CONTOUR 커널:

  [-1 -1 -1]
  [-1  8 -1]
  [-1 -1 -1]
class CONTOUR(BuiltinFilter):
    name = "Contour"
    # fmt: off
    filterargs = (3, 3), 1, 255, (
        -1, -1, -1,
        -1,  8, -1,
        -1, -1, -1,
    )
    # fmt: on
  • 위의 커널로 가장자리 검출
    • 평탄한 영역: 0에 가까움.
    • edge나 boundary는 양과 음으로 큰 수를 intensity로 가짐.
  • 이후 result + 255 하고 클리핑
    • 평탄한 영역은 흰 색.
    • edge나 boundary는 클리핑 되는 등으로 인해 255보다 작은 intensity : 검은 윤곽선.
  • FIND_EDGES 의 결과를 반전시킨 것과 유사한 결과를 얻음.

사용 예는 다음과 같음:

contour = img.filter(ImageFilter.CONTOUR)


7. EMBOSS 필터

PIL.ImageFilter 모듈에서 제공하는 사전 정의된 필터.

 

이미지에 대각선 방향 그래디언트를 계산하여 양각(엠보스) 효과를 적용.

PIL.ImageFilter.EMBOSS
  • 매개변수 없음 (고정된 3x3 커널 사용)

EMBOSS Kernel:

  [-1  0  0]
  [ 0  1  0]
  [ 0  0  0]
  • 대각선 방향의 그래디언트(좌상단(-1)과 중앙(1)의 차이를 계산)를 계산하여 입체감 표현
  • 대각선 방향의 가장자리 검출
  • 결과에 128을 더해 중간 회색을 기준점으로 설정
  • 음수 결과는 어두운 부분, 양수 결과는 밝은 부분으로 표현
  • 128 offset으로 인해 변화가 없는 부분은 중간 회색으로 표시

사용예는 다음과 같음:

embossed = img.filter(ImageFilter.EMBOSS)


8. UnsharpMask 필터

PIL.ImageFilter 모듈에서 제공하는 클래스.

 

Unsharp Masking 기법을 사용한 고급 샤프닝 필터.

PIL.ImageFilter.UnsharpMask(
    radius=2, 
    percent=150, 
    threshold=3,
)
  • radius: 블러 반경 (기본값 2.0), float 지원
  • percent: 샤프닝 강도 백분율 (기본값 150), int만 가능
  • threshold: 적용 임계값 (기본값 3, 작을수록 더 많은 픽셀에 적용), int만 가능.

언샤프 마스킹 수식:

  sharpened = original + (original - blurred) * (percent/100)
  (단, |original - blurred| > threshold인 경우만)
  • 이미지 샤프닝에 가장 널리 사용되는 표준 기법
  • 노이즈 증가 없이 선명도 향상 가능

사용예는 다음과 같음:

unsharp = ImageFilter.UnsharpMask(radius=3, percent=200, threshold=5)
sharpened = image.filter(unsharp)

https://dsaint31.tistory.com/931

 

Unsharp Masking and Selective Unsharp Masking

정의Unsharp Maskingsharpness를 높이는 대표적인 sharpening 기법.그러나 평탄부의 Noise까지 강조함.Selective Unsharp Masking선택적으로 sharpening을 적용.Edge Enhancement 에 속함.2024.09.05 - [Programming/DIP] - [CV] Sharpnes

dsaint31.tistory.com


9. MedianFilter 필터

PIL.ImageFilter 모듈에서 제공하는 클래스.

주변 픽셀들의 중간값을 사용하여 노이즈를 제거하는 non-linear filter.

PIL.ImageFilter.MedianFilter(size=3)
  • size: 필터 크기 (기본값 3)
    • 홀수 int 만 가능

중간값 필터 수식:

  output(x,y) = median{input(x+i, y+j) | i,j ∈ [-size/2, size/2]}
  • 가장자리를 보존하면서 노이즈 제거하는 non-linear filter
  • salt and pepper noise 제거에 매우 효과적
  • blur 필터와 달리 가장자리가 흐려지지 않음

사용예는 다음과 같음:

median = ImageFilter.MedianFilter(size=5)
denoised = noisy_img.filter(median)


참고: Custom Kernel Filter

사용자 고유의 kernel을 사용하는 것도 가능함:

다음을 참고:

2025.07.02 - [Python] - Pillow에서 Custom Kernel Filter 사용

 

Pillow에서 Custom Kernel Filter 사용

Pillow는 spatial domain에서 convolution을 이용한 다양한 필터를 PIL.ImageFilter 모듈에서 제공하지만,사용자가 직접 정의한 custom kernel을 사용하는 기능도 제공한다. 다음 gist에서 Custom Filter를 참고:https://g

ds31x.tistory.com


같이보면 좋은 자료들

convolution에 대한 이해:

https://dsaint31.me/mkdocs_site/DIP/cv2/etc/dip_convolution/

 

BME

Convolution 이 문서에서의 convolution은 digital image processing등에서의 convolution을 다루고 있음. signal processing의 discrete convolution에 대한 건 다음 문서를 참고할 것: Discrete Convolution, Circular Convolution Deep Lea

dsaint31.me


2025.06.30 - [Python] - Pillow 사용법 - Basic 01

 

Pillow 사용법 - Basic 01

Pillow 라이브러리의 기본적인 사용법을 다룬다. 2024.06.03 - [Python] - [Python] PIL, Pillow, OpenCV, and Scikit-image [Python] PIL, Pillow, OpenCV, and Scikit-imagePIL, Pillow, OpenCV, and Scikit-imagePython에서 이미지를 다룰 때

ds31x.tistory.com

2025.07.01 - [Python] - Pillow 사용법 - Basic 02 - copy, ImageDraw

 

Pillow 사용법 - Basic 02 - copy, ImageDraw

1. copy() 메서드PIL.Image.Image 객체에서 제공하는 메서드.현재 이미지의 완전한 복사본을 생성하여 새로운 PIL.Image.Image 객체를 반환.PIL.Image.Image.copy() -> PIL.Image.Image매개변수 없음이미지 데이터와 메

ds31x.tistory.com

2025.07.01 - [Python] - Pillow 사용법 - Basic 03 - Image Enhance

 

Pillow 사용법 - Basic 03 - Image Enhance

ImageEnhance 모듈을 통해 Image Enhancement 기능을 지원. 참고로, torchvision.transforms 의 image adjustment와 알고리즘이 유사함 api document: https://pillow.readthedocs.io/en/stable/reference/ImageEnhance.html 관련 gisthttps://gist.

ds31x.tistory.com

 

728x90