Gabor 필터
개요
- Gabor filter는 방향성 및 주파수를 이용한 선택적 엣지/텍스처 분석 필터로, Sobel 이나 Canny 처럼 단순 경계만 뽑는 용도보다는 방향, 주기, 질감까지 함께 분석하는데 강점을 가짐.
- Gabor filter는 가우시안 함수와 사인/코사인 함수의 곱으로 구성되며, 가우시안이 공간적 성분을 제어하고 사인파는 방향과 주파수(스케일)를 제어한다고 해석할 수 있다.
- 5-3. 엣지 검출 필터 - Gabor Filter
방법
- 영상처리에서 주로 사용하는 2D-Gabor Filter의 실수형 표현은 아래와 같다.
- 대상 좌표()에 대해 5개의 파라미터를 통해 edge의 크기와 방향성을 조정할 수 있다.
- : 커널의 너비(폭), 가우시안 분포의 표준편차
- : 커널의 방향, 추출하는 edge의 방향을 결정
- : 사인파의 파장(스케일), 크면 저주파(큰 구조), 작으면 고주파(미세 패던)
- : 공간 종횡비, 타원의 비율
- : 위상 오프셋, 0
파라미터에 따른 커널 형태
(사인파의 파장, 스케일)

(커널의 방향)

(공간종횡비, 타원의 비율)

(커널의 너비)

다양한 커널에 따른 검출 엣지 특성

OpenCV
Gabor Filter 커널 생성 및 컨볼루션
import cv2
import numpy as np
img = cv2.imread('image.jpg', 0) # gray scale
img = origin_img.astype(np.float32) / 255
# Generate Garbor filter
kernel = cv2.getGaborKernel(
ksize = (21,21),
sigma = 5.0,
theta = np.pi/4,
lambd = 10.0,
gamma = 1,
psi = 0
)
filtered = cv2.filter2D(img, cv2.CV_32F, kernel)
다중 커널 생성 및 컨볼루션 합성
- 여러 각도()에 대해 Gabor Filter 생성 후 이미지에 각각 컨볼루션.
- 여러 커널에 대한 결과를 하나의 엣지 맵으로 생성함.
import cv2
import numpy as np
img = cv2.imread('image.jpg', 0) # gray scale
img = origin_img.astype(np.float32) / 255
# Generate Garbor filter
kernel = cv2.getGaborKernel(
ksize = (21,21),
sigma = 5.0,
theta = np.pi/4,
lambd = 10.0,
gamma = 1,
psi = 0
)
filtered = cv2.filter2D(img, cv2.CV_32F, kernel)
# 여러 방향 결과를 하나로 합쳐 에너지맵을 생성
energy = np.zeros_like(img)
for res in results:
energy += res**2
energy = np.sqrt(energy)
- 각 커널의 결과를 제곱 → 합 → 제곱근으로 L2 norm 을 취해 합치는 이유는, 방향과 부호에 무관한 에너지 크기(magnitude)만을 남기기 위함.
- 절대값을 사용하는 L1 norm에 비해 L2 제곱을 사용하여 강한 신호는 더 강하게, 약한 신호는 더 약하게 핵심 방향만을 살려 노이즈에 강하고 안정적인 에너지 맵을 생성함.