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 사용하기.
- custom kernel의 matrix 직접 정의: 최종적으로는 1차원의
list객체여야 함 - kernel의 shape와 scale 및 offset(=bias)를 1번에서 정의한 kernel matrix와 함께
ImageFilter.Kernel생성자에 전달. - 해당 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
'Python' 카테고리의 다른 글
| cv.undistort()와 cv.initUndistortRectifyMap() + cv.remap() (0) | 2025.07.04 |
|---|---|
| cv.getOptimalNewCameraMatrix() (0) | 2025.07.04 |
| Pillow 사용법 - Basic 04 - ImageFilter (2) | 2025.07.01 |
| Pillow 사용법 - Basic 02 - copy, ImageDraw (0) | 2025.07.01 |
| Pillow 사용법 - Basic 03 - Image Enhance (0) | 2025.07.01 |