본문 바로가기
목차
Python

Pillow에서 Custom Kernel Filter 사용

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

Pillow는 spatial domain에서 convolution을 이용한 다양한 필터를 PIL.ImageFilter 모듈에서 제공하지만,
사용자가 직접 정의한 custom kernel을 사용하는 기능도 제공한다.

 

다음 gist에서 Custom Filter를 참고:

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

 

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


Custom Kernel 사용하기.

  1. custom kernel의 matrix 직접 정의: 최종적으로는 1차원의 list 객체여야 함
  2. kernel의 shape와 scale 및 offset(=bias)를 1번에서 정의한 kernel matrix와 함께 ImageFilter.Kernel 생성자에 전달.
  3. 해당 kernel로 필터링할 PIL.Image.Image 객체에서 .filter() 메서드를 호출하면서 2번에 만든 커널 객체를 넘겨줌.

PIL.ImageFilter.Kernel 클래스

ImageFilter.Kernel은 사용자가 정의한 커널 행렬을 이미지에 적용할 수 있는 커널로 추상화해주는 Pillow의 클래스.

 

생성자는 다음과 같음:

ImageFilter.Kernel(
    size,      # tuple: (커널의 가로크기, 세로크기)
    kernel,    # list: 1차원 리스트로 변환한 커널 행렬 값
    scale=1,   # int or float: 결과를 정규화할 값 (기본값 1)
    offset=0   # int or float: 결과값에 더할 상수 (기본값 0)
)
  • size:
    • (width, height) 형태의 tuple로,
    • kernel matrix의 shape를 정의.
  • kernel:
    • 사용할 kernel matrix.
    • 반드시 1차원 리스트여야 함.
    • tuple로 넘겨지는 경우 에러가 발생하는 경우가 있을 수 있음.
  • scale
    • scale이라는 이름이지만, 나누어지는 숫자임.
    • 9로 지정할 경우, 앞서의 kernel로 convolution 후 9로 나누어지게 됨.
  • offset
    • convolution과 scale로 나누어진 연산 결과에 더해지는 bias 값.
    • 보통 [0,255] 의 값이어야하는 경우가 많으므로, 적절한 값을 넣어줘야 함.

유의사항

kernel matrix를 만들 때, 1d-sequence로 만들어야 한다는 점을 유의할 것.

일반적으로, NumPy의 ndarray를 사용하는 경우엔, .flatten() 메서드로 1D로 만들고, 이를 .tolist() 메서드로 리스트로 변환하여 사용한다.

  • 시작품 개발이나, 다른 라이브러리와 같이 비교할 때는 NumPy의 ndarray를 쓰지만,
  • exe 등으로 만들 때는 그냥 최종 결과 1d 리스트를 사용하는게 낫다 (용량 등 고려시)

Example

sharpening 에 사용되는 대표적인 HPF인 Laplacian filter 를 custom kernel로 만들어본다.

다음은 사용할 3x3 Laplacian 커널임.

[
 0, -1,  0
-1,  4, -1
 0, -1,  0
]

NumPy를 사용한 예제

from PIL import Image, ImageFilter
import numpy as np

img = Image.open("input.jpg")

laplacian_kernel = np.array([
    [ 0, -1, 0],
    [-1, 4, -1],
    [ 0, -1, 0]
])

kernel_list = laplacian_kernel.flatten().tolist()

laplacian_filter = ImageFilter.Kernel(
    size=(3, 3),
    kernel=kernel_list,
    scale=1,
    offset=128  # 음수 픽셀을 화면에 보이도록 이동
)

filtered_img = img.filter(laplacian_filter)
filtered_img.show()

순수 파이썬으로 작성한 예제

from PIL import Image, ImageFilter

img = Image.open("input.jpg")

kernel_list = [
     0, -1,  0,
    -1,  4, -1,
     0, -1,  0
]

laplacian_filter = ImageFilter.Kernel(
    size=(3, 3),
    kernel=kernel_list,
    scale=1,
    offset=128
)

filtered_img = img.filter(laplacian_filter)
filtered_img.show()

같이 보면 좋은 자료

많이 사용되는 kernel들은 다음으로 사전정의되어 제공됨:

2025.07.01 - [Python] - Pillow 사용법 - Basic 04 - ImageFilter

 

Pillow 사용법 - Basic 04 - ImageFilter

PIL.ImageFilter는 이미지에blur, sharpening, edge detection, emboss 등다양한 시각적 효과를 적용할 수 있는 사전 정의된 필터들을 제공하는 모듈.convoluton 기반.헷갈리면, 아래 url의 소스코드를 참고하라.https

ds31x.tistory.com

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

 

728x90