2009-09-08 4 views
4

Canny 엣지 감지 - Wikipedia entry - 알고리즘이 구현 된 방법에 대한 설명이 약간 있습니다. 2D Gaussian 필터를 사용하여 노이즈 감소를 수행하는 것은 매우 간단하지만 두 개의 1D 필터를 사용하는 방법을 들었습니다. 그래디언트 및 가장자리 방향을 계산하는 것도 간단합니다. 그러나, 최대가 아닌 억압을 수행 할 때 둥근 각을 얻기위한 깔끔한 트릭이 있습니까? 현재 내가하고있는 것은 가장자리 방향 (세타) 값을 파이/4로 나누고이를 정수로 캐스팅하고 switch 문을 사용하는 것입니다. 그러나, 음의 세타 값을 어떻게 처리할까요? 즉, -pi/4는 3 * pi/4 또는 pi/4와 같은 방식으로 처리해야합니까?Canny Edge Detector in C

모든 조언/링크를 보내 주시면 감사하겠습니다.

감사 벤

답변

7

가우스 분포 :

g2d (X, Y) = EXP (-x XY Y) 상수는 생략된다] = EXP (-x^2) * exp (-y^2) = g1d (x) * g1d (y)

따라서 1d 분포의 곱셈으로 분리 될 수있다. 각 외부 여기서 0이면

: 그리하여 여과 (독립적으로 각각의 컬럼)에 Y 방향

둥근 각도에 후 x 방향을 먼저 (독립적으로 각 행에) 될 수있다. .pi)이 경우 필요한만큼 pi를 더하거나 뺄 때 (또는 함수 fmod를 사용하는 경우) 올바르지 만 [0..pi]의 경우 모두 분명합니다.

또한 플랫폼에 따라 arctan 사용을 전혀 피할 수 있습니다. 원을 그려 4 개의 영역으로 나누고 산술 연산만을 사용하는 그라디언트 구성 요소에 대한 조건 집합을 생성하고 영역 방향은이다.

1

직접 구현해야합니까, 아니면 라이브러리를 사용할 수 있습니까? OpenCv는 컴퓨터 시각에 알고리즘을 포함하고있는 거대한 C 라이브러리입니다 (예 : http://opencv.willowgarage.com/documentation/image_processing.html?highlight=canny#cvCanny).

교육 목적으로 사용하는 경우 컴퓨터 비전에 관한 좋은 텍스트를 구입하는 것이 좋습니다. 거의 모든 소개 텍스트는 Gaussian (잘 문서화 된 1d 트릭)뿐만 아니라 canny edge detection과 non-maximum suppression에 대해서도 논의 할 것입니다.

1

둘 다 동일한 대각선을 정의하기 때문에 -pi/4는 3 * pi/4와 같은 방식으로 처리되어야한다고 생각합니다.

enum Angle 
{ 
    HORIZONTAL, 
    DIAG_UP, 
    VERTICAL, 
    DIAG_DOWN 
}; 

Angle quantizeAngle(double theta) 
{ 
    if (0 <= theta && theta < PI/8.0) || (7.0*PI/8.0 <= theta && theta < PI)) 
     return HORIZONTAL; 
    else if (PI/8.0 <= theta && theta < 3.0*PI/8.0) 
     return DIAG_UP; 
    else if (3.0*PI/8.0 <= theta && theta < 5.0*PI/8.0) 
     return VERTICAL; 
    else 
     return DIAG_DOWN; 
} 
:이 [0, 파이에있다 있도록) 기울기의 각도를 정상화 할 수있는 경우

는, 당신은 각도를 양자화하기 위해 다음과 같이 간단한 기능을 사용할 수 있습니다