Feature detection
Peponi │ 6/26/2025 │ 13m
Feature detection
Peponi
1. Introduction
Feature detection
은 이미지 내에서 식별 가능한 특징을 찾아내는 과정이다. 이는 주로 점, 선, 면 등으로 나타나며 같은 종류의 다른 객체에 대해 반복적으로 나타나는 특징이 있다. Feature detection은 주로 다음과 같은 경우에 활용된다.
- Object recognition
이미지 내에 존재하는 특징점으로부터 사람, 자동차 등을 구별한다. - Image stitching
두 장의 이미지에 공통으로 존재하는 특징점을 찾아 정렬하여 연결된 이미지를 생성한다. - SLAM
자율 주행 시 주변 객체를 인식하여 경로를 설정하는 데 활용한다.
일반적으로 feature detection은 edge, corner, blob detection 등을 통해 수행하며 다음과 유사한 과정을 거쳐 결과를 도출할 수 있다.
- Feature definition
이미지 내의 특징점은 점, 선, 면 등으로 나타난다. 검출 대상을 기준으로 적절한 형태, 변환 불변성 (크기, 회전 등) 등을 설정한다. - Candidate detection
정의된 특징점 유형에 따라 적절한 검출 알고리즘을 설정하여 특징점 후보를 찾아낸다. - Non-maximum suppression
검출된 후보 중 불필요 후보가 섞이는 경우가 발생할 수 있는데, 인접 픽셀이 모두 후보로 검출되거나 약한 응답을 가지는 픽셀 등이 이에 해당될 수 있다. Non-maximum suppression은 이러한 불필요 후보를 제거함으로써 가장 응답이 강한 픽셀을 최종 특징점을 산출한다.
이 문서에서는 OpenCV에서 제공하는 검출 및 기술 알고리즘에 대한 간략한 설명과 함께 feature detection을 수행하는 예시를 보여준다. 실습에 사용할 이미지는 다음과 같다.

2. SIFT
SIFT는 scale, rotation 등에 robust한 검출 알고리즘이다. 객체의 크기 또는 회전 상태가 변하더라도 안정적으로 검출할 수 있기 때문에 object recognition, image stitching 등에 유용하게 활용된다. 알고리즘의 특성상 높은 계산 비용을 요구하여 실시간 검출에는 적합하지 않을 수 있다.
private void SIFTDetection(Mat image)
{
// nFeatures : 검출할 최대 특징점의 수
// nOctaveLayers : 각 옥타브 (스케일 레벨) 에 있는 레이어의 수 (각 레이어 별로 블러 강도가 다름)
// contrastThreshold : 특징점의 contrast 임계값, 클수록 대비가 낮은 영역의 약한 특징점이 걸러짐
// edgeThreshold : 값이 클수록 엣지와 유사한 특징점들이 더 많이 유지됨
// sigma : 옥타브 #0 의 이미지에 적용되는 Gaussian smoothing sigma
// CV_32F 디스크립터
using var sift = SIFT.Create();
var keyPoints = sift.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("SIFT", detected);
}
3. SURF
SURF는 SIFT와 유사한 알고리즘으로 구성되어 scale, rotation 등에 robust한 특징을 가지는 알고리즘이다. SIFT의 속도 개선을 목표로 개발되어 SIFT보다 훨씬 빠른 속도를 보여준다. 따라서 SIFT와 유사한 검출 성능을 요구하면서 어느 정도 속도가 필요한 경우 적합할 수 있다.
private void SURFDetection(Mat image)
{
// hessianThreshold : 헤시안 키포인트 검출에 사용되는 임계값, 높을수록 더 강한 특징점만 검출
// nOctaves : 이미지 피라미드 옥타브 (스케일 레벨) 의 수
// nOctaveLayers : 각 옥타브에 있는 레이어의 수 (각 레이어 별로 블러 강도가 다름)
// extended : 디스크립터의 크기 결정. true로 설정 시 128차원 (기본값), false로 설정 시 64차원
// upright : 방향성 계산 여부 결정. true로 설정 시 회전 불변성이 없는 대신 속도가 빠름
// CV_32F 디스크립터
using var surf = SURF.Create(200);
var keyPoints = surf.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("SURF", detected);
}
4. ORB
ORB는 ORB: An efficient alternative to SIFT or SURF 논문에서 제기된 알고리즘으로 SIFT, SURF 대한 대안으로 OpenCV에서 개발한 알고리즘이다. FAST 검출 알고리즘과 BRIEF 디스크립터로 구성되어 있으며, orientation과 rotation에 robust한 특징을 가지고 있다. 또한 계산 속도가 매우 빠르고 메모리 사용량이 적기 때문에 실시간, 모바일, 임베디드 비전 시스템에 유용하다.
private void ORBDetection(Mat image)
{
// nFeatures : 검출할 최대 특징점의 수
// scaleFactor : 이미지 피라미드 층간 스케일 비율
// nLevels : 피라미드 레벨 (옥타브) 수
// edgeThreshold : 이미지 테두리 영역의 특징점을 검출하지 않을 경계 영역의 크기
// firstLevel : 피라미드의 첫 레벨 지정
// wtaK : BRIEF 디스크립터 생성 시 사용하는 샘플링 쌍의 수 (2~4)
// scoreType : 특징점 계산 방식. Harris (기본값) 또는 Fast
// patchSize : BRIEF 디스크립터 계산 시 패치 크기. edgeThreshold 값보다 크거나 같아야 함
// fastThreshold : scoreType을 Fast로 사용할 때의 임계값. 낮을 수록 더 많은 특징점 검출
// CV_8U 디스크립터
using var orb = ORB.Create(1000);
var keyPoints = orb.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("ORB", detected);
}
5. KAZE
KAZE는 SIFT나 SURF와는 다른 접근 방식을 사용하는 특징점 검출 알고리즘이다. SIFT, SURF가 가우시안 블러를 이용한 선형 스케일 공간을 사용하는 것과 달리, KAZE는 비선형 확산 필터링 (Non-linear diffusion filtering) 을 이용하여 스케일 공간을 구축한다. KAZE는 edge를 보존하면서 noise를 제거하고, scale, rotation에 robust한 특징을 가지고 있다.
private void KAZEDetection(Mat image)
{
// extended : 디스크립터의 크기 결정. true로 설정 시 128차원, false로 설정 시 64차원 (기본값)
// upright : 방향성 계산 여부 결정. true로 설정 시 회전 불변성이 없는 대신 속도가 빠름
// threshold : 특징점 검출에 사용하는 임계값. 높을수록 더 강한 특징점만 검출
// nOctaves : 이미지 피라미드 옥타브 (스케일 레벨) 의 수
// nOctaveLayers : 각 옥타브에 있는 레이어의 수 (각 레이어 별로 블러 강도가 다름)
// diffusivity : 비선형 확산 필터링에 사용되는 확산 함수 유형
// CV_32F 디스크립터
using var kaze = KAZE.Create();
var keyPoints = kaze.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("KAZE", detected);
}
KAZEDiffusivityType
Type Description DiffPmG1 Edge 영역에서는 확산을 거의 하지 않고, 평탄한 영역에서 확산을 많이 한다 DiffPmG2 기본값. DiffPmG1보다 edge 주변에서 부드러운 확산을 할 수 있다 DiffWeickert Edge 방향으로 확산을 주로 하고, 수직한 방향으로는 억제하는 특성을 가진다 DiffCharbonnier Gradient 변화에 덜 민감하여 강한 노이즈에 대해 robust한 특성을 가진다
6. A-KAZE
A-KAZE는 KAZE 알고리즘의 단점인 느린 속도를 개선하기 위해 개발된 알고리즘이다. Fast explicit diffusion (FED) 을 스케일 공간 구축 방법으로 사용하여 빠른 연산을 수행하면서도 기본적으로 KAZE와 동일한 장점을 가지고 있다.
private void AKAZEDetection(Mat image)
{
// descriptorType : 생성할 디스크립터의 유형
// descriptorSize : 디스크립터 크기 지정 (bit 단위)
// descriptorChannels : 디스크립터 계산에 사용될 이미지 채널 수
// threshold : 특징점 검출에 사용하는 임계값. 높을수록 더 강한 특징점만 검출
// nOctaves : 이미지 피라미드 옥타브 (스케일 레벨) 의 수
// nOctaveLayers : 각 옥타브에 있는 레이어의 수 (각 레이어 별로 블러 강도가 다름)
// diffusivity : 비선형 확산 필터링에 사용되는 확산 함수 유형
// CV_8U 디스크립터
using var akaze = AKAZE.Create();
var keyPoints = akaze.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("AKAZE", detected);
}
AKAZEDescriptorType
Type Description MLDB 기본값. 방향성을 고려하여 회전 불변성을 가진다 MLDBUpright MLDB 디스크립터를 사용하지만 방향성을 고려하지 않는다. 회전 불변성이 없는 대신 속도가 빠름 KAZE KAZE 디스크립터를 사용한다 KAZEUpright KAZE 디스크립터를 사용하지만 방향성을 고려하지 않는다
7. BRISK
BRISK는 SIFT, SURF의 대안으로 개발된 알고리즘이다. Scale, rotation에 robust한 특징을 가지고 있으며, binary 디스크립터로 인한 낮은 메모리 사용량과 빠른 연산 속도가 장점이다. 따라서 적당한 invariant가 요구되는 환경에서 빠르고 효율적으로 feature detection을 수행해야 하는 경우 유용할 수 있다.
private void BRISKDetection(Mat image)
{
// thresh : FAST 특징점 검출에 사용하는 임계값. 높을수록 더 강한 특징점만 검출
// octaves : 이미지 피라미드 옥타브 (스케일 레벨) 의 수
// patternScale : 디스크립터 생성 시 사용되는 샘플링 패턴의 스케일 인자
// CV_8U 디스크립터
using var brisk = BRISK.Create();
var keyPoints = brisk.Detect(image);
using var detected = new Mat();
Cv2.DrawKeypoints(image, keyPoints, detected, Scalar.DeepSkyBlue);
Cv2.ImShow("BRISK", detected);
}
8. 참조 자료
- OpenCV - Python Tutorials - Introduction to SIFT (Scale-Invariant Feature Transform)
- OpenCV - Python Tutorials - Introduction to SURF (Speeded-Up Robust Features)
- OpenCV - Python Tutorials - ORB (Oriented FAST and Rotated BRIEF)
- ORB: An efficient alternative to SIFT or SURF
- OpenCV - Python Tutorials - BRIEF (Binary Robust Independent Elementary Features)
- GitHub - pablofdezalc/kaze
- GitHub - pablofdezalc/akaze
- Fast Explicit Diffusion for Accelerated Features in Nonlinear Scale Spaces
- BRISK: Binary Robust Invariant Scalable Keypoints
- Edge detection
- Corner detection
- Circle detection
- Feature matching