Gabor 필터

개요

  • Gabor filter는 방향성 및 주파수를 이용한 선택적 엣지/텍스처 분석 필터로, Sobel 이나 Canny 처럼 단순 경계만 뽑는 용도보다는 방향, 주기, 질감까지 함께 분석하는데 강점을 가짐.
  • Gabor filter는 가우시안 함수와 사인/코사인 함수의 곱으로 구성되며, 가우시안이 공간적 성분을 제어하고 사인파는 방향과 주파수(스케일)를 제어한다고 해석할 수 있다.
  • 5-3. 엣지 검출 필터 - Gabor Filter

방법

  • 영상처리에서 주로 사용하는 2D-Gabor Filter의 실수형 표현은 아래와 같다.
  • 대상 좌표()에 대해 5개의 파라미터를 통해 edge의 크기와 방향성을 조정할 수 있다.
  • : 커널의 너비(폭), 가우시안 분포의 표준편차
  • : 커널의 방향, 추출하는 edge의 방향을 결정
  • : 사인파의 파장(스케일), 크면 저주파(큰 구조), 작으면 고주파(미세 패던)
  • : 공간 종횡비, 타원의 비율
  • : 위상 오프셋, 0

파라미터에 따른 커널 형태

(사인파의 파장, 스케일)

+full

(커널의 방향)

+full

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

+full

(커널의 너비)

+full

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

+full +full

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)

+full

다중 커널 생성 및 컨볼루션 합성

  • 여러 각도()에 대해 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 제곱을 사용하여 강한 신호는 더 강하게, 약한 신호는 더 약하게 핵심 방향만을 살려 노이즈에 강하고 안정적인 에너지 맵을 생성함.

참고