[Public] 신호처리/영상 객체검출

[Corner Detection] #2 캐니 에지(Canny Edge)

차출발 2012. 6. 13. 00:46
반응형

 

Canny Edge는 왜 중요한가?

Canny Edge Detection 은

1986년. John F. Canny 에 의해 개발된 알고리즘이다.

이제까지 논의된 에지 검출기들 보다 우월하기 때문이다.

윤곽을 가장 잘 찾아내면서도 원래 영상의 회색물질과 관련된

모든 에지(Edge)들을 제거할 수 있는 유일한 방법이다.

 

그럼 어떤 면에서 우월한가요?

  1. 낮은 에러율

    모든 에지가 검출되어야 하며

    의사반응(Spurious Response)가 없어야 한다.

    즉 검출된 에지가 참이어야 한다.

     

  2. 에지 점들의 위치가 정확히 측정 되어야 한다. (Well Localized)

    찾아진 에지가 참 에지와 가능한 가까워야 한다는 것이다.

    검출기에 의해 에지라고 표시된 점과 진짜 에지의 중심 간의 거리가

    최소여야 한다는 것이다.

     

  3. 단일 에지 점 응답

    검출기가 각 참 에지 점에 대해서 한 점만 반환을 해야 한다.

    참 에지 주위의 지역 최대들의 수가 최소여야 한다

    검출기가 에지 점이 하나만 있는 곳에서 여러 개를 식별하지 말아야 한다는 것이다.

     

     

     

단점도 있을 거 같은데?

구현이 복잡하고 실행 시간이 훨씬 길다는 것이다.

즉 실시간 산업 영상처리에서는 비용과 속도의 요구로 인하여

임계 값 처리된 기울기 방법 같은 방법을 이용하기도 한다.

 

 

 

그럼 어떻게 구현하죠?

알고리즘은 일반적으로 5단계로 진행이 된다.

 

  1. Smoothing        

        

노이즈 제거를 위한 스무딩(blur) 작업이다.

아래 그림을 보면

미분을 하게 되면 잡음에 의하여 noise가 많이 생기는 것을 볼 수 가있다.

우리는 이러한 잡음을 제거해 줄 필요가 있다.

 

일반적으로 Blur를 수행하는 함수는 미디언 필터 등등 다양한 함수들이 있다.

하지만 가우시안 함수를 많이 사용한다.

그 이유는 중요하니 공부하시길 바란다.

그래서 본 논문에서는 가우시안(Gaussian) 필터를 이용하게 된다.

일반적으로 가우시안 식을 복잡하게 이용하는 게 맞지만

논문에서는 가우시안 필터 마스크를 이용한다.

아래와 같은 마스크 필터를 이용하여 컨볼루션(Convolution)을 통하여

회선 값을 업데이트 하게 된다..

 

 

자 가우시안 필터를 적용하니 아래의 왼쪽 그림은 오리지날 영상

오른쪽은 위 가우시안 필터를 적용한 적용한 영상이다.

 

 

 

 

 

  1. Finding gradients

 

다음 단계로는 경사(미분)값을 통하여 Edge를찾는 단계 이다.

우선 아래 그림을 보자

보는 것과 같이 두 번째 그림은

첫 번째 이미지의 빨간 선 부분을 이미지를 2차원 그래프로 표현을 했다.

그리고 미분을 한 그림이 세 번째 그림이다.

 

눈 여겨 볼 그림은 3번째 그림에서 각각의 극 값이다.

이 극 값이 우리가 찾으려는 Edge가 되는 것이다.

 

Edge를 정의 하자면 Image의 강도(Intensity)가 급격하게 변하는 부분으로 본다.

극 값은 Maximum, Minimum 2군대를 찾을 수 있다.

많은 논문에서는 일반적으로 이 두 가지를 합쳐서 Extrema라고 부른다.

 

이렇게 Extrema를 찾기 위해서는 아래 그림과 같이

기본적인 Sobel Mask를 이용하여 컨볼루션 한다.

Sobel의 필터의 인자값이 궁금하면 곤잘레스 책을 찾아보면 이유가 설명되어 있으니 참고 바람

 

 

이렇게 X 축과 Y축에 대해서 미분을 하면

각각 영상을 얻을 수 있다.

 

근데 여기서 중요한 건 왜 우리가 X축과 Y축에 대해서 미분을 하였느냐 이다.

 

 

어떠한 함수 f(x, y)가 존재한다면 그것을 각 variables 로 미분 하면

아래와 같이 인자로 갖는 벡터를 가진다.

 

이것은 가장 빠르게 증가한 (most rapid increase) 방향(direction)을 나타냄과

그것의 값(norm)은 크기를 나타낼 수 있기 때문이다.

 

그래서 우리는 이 norm을 통하여 증가 량을 비교할 수 있으며

이 Direction에 대하여 방향을 구할 수 있기 때문이다.

 

 

 

 

그럼 이 Direction과 Norm은 어떻게 구하나요?

 

먼저 강도(Norm)를 구해야 한다.

아래 그림과 같이 피타고라스의 정리를 통하여 경사 강도를 얻을 수 있다.

 

일반적으로 강도의 크기를 얻는 방법이다.

 

하지만 다른 방법으로는 아래와 같이 유클리디안 거리를 사용하지 않는

아래와 같이 대각선을 고려하지 않는 맨하탄 거리를 이용하는 방법도 있다.

 

 

다음으로 방향 (Direction) 구해야 한다.

이는 아래 그림과 같이 삼각함수를 이용하여 방향을 구할 수 있다.

x축과 y축 방향에 대해서 삼각함수를 이용하면 각도(Angle)를 구할 수 있다.

우리는 X축의 미분값과 Y축의 미분값을 가지고 있다. 이미 소벨마스크를 통하여

그렇기 때문에 삼각함수인 아크탄젠트를 이용하여

아래와 같이 식을 이용하면 각도 세타를 얻을 수 있다.

 

 

 

이 각도를 구하게 된 다음 각각의

방향성에 있어서는 다음 단계에서 사용하기 위하여 각도를 그룹화 시켜준다.

아래 그림과 같이 5개의 구역 ( 0, 45, 90, 135, 180)으로 구분하게 된다.

 

 

즉 논문에서는 일반적으로 -22.5 에서 22.5도를 기준으로 이를 0도(상방향)로 구분하고 있다.

총 그러니 8방향으로 구분이 된다. (상하좌우 4개방향과 대각선 4개 방향)

이해가 안 가면 아래에서 그림 예시가 있는데 그걸 보면 쉽게 이해가 갈것이다.

 

아래 그림은 Gradient magnitudes의 그림이다.

        즉 소벨 마스크를 통하여 얻은 이미지 이다. (왼쪽은 아까 위에서 Blur 한 영상)

 

        

 

  1. Non-maximum suppression

     

    Local maxima 선택하는 단계이다. 매우 중요하다.

    극 값을 선택하는데 있어서 잘못된 영역이 나올 수 있다.

    즉 진짜 Edge가 아님에도 불구하고 검출이 된 영역이 있다는 것이다.

    이들(Non-Maximum)을 제거 해야 한다.

     

    그래서 Blur를 통하여 흐려진 Edge에서 잘못된 검출이 발생한다는 것이다.

    그래서 다시 Sharp한 edge로 다시 변환해야 한다.

    그래서 local Maxima는 남기고 나머지는 모두 제거하는 작업을 진행하는 것이다.

     

     

    이는 먼저 경사 방향을 45도 간격으로 라운딩 하면서8방향의 이웃을 설정하게 된다.

    이는 이전에서 작업을 하였다.

    우리는 Norm과 Direction을 가지고 있지 않는가?

    하지만 본 논문에서는 상하좌우만 판단하는 것 같다.

     

    그리고선 양 방향과 음 방향으로 에지 강도와

    현재 픽셀의 에지 강도를 비교판단을 하는 것이다

     

     

    예를 들면 아래 그림과 같이

    현재 픽셀의 에지 강도가 가장 크다면 그 값을 보존하고 아니면 삭제 하는 것이다.

    그러면 Local Maxima 만 하얀색으로 설정 됨을 알 수 가 있다.

     

    왼쪽 아래를 보면 4방향만 고려하기 때문에 6이 최대이기 때문에 넌 Maximum

    오른쪽은 4방향 고려하기 때문에 넌 4인데 최대는 7이기 때문에 넌 Non-Maximum 이 된다.

    4 5 7    5 7 6

    5 6 4    6 4 3

    3 4 3    4 3 1

     

    이렇게 Local Maxima 를 선택하게 되면 아래와 같은 결과를 얻을 수 있다.

    왼쪽 그림이 Non-Maximum Suppression을 진행한 이미지

 

 

 

  1. Double thresholding

     

    위에서 non-maximum suppression을 거친 이미지에 나타나는 에지들 중에는

    실제 에지(Edge)와 약간의 노이즈(Noise) 등 즉 잡음에 의해 검출된 것들이 존재 한다.

    그래서 이들을 구별해 내어야 한다.

     

    가장 구별하기 쉬운 방법으로는 임계 값을 사용한다.

    여기서 임계 값은 2개를 이용하게 되는데

     

    위 그림과 같이 low와 high를 기준으로

    파랑색 영역제거 하고

    주황색 영역빨간색 영역을 각각 구분하게 된다.

     

    아래 그림은 임계 값 20과 80을 설정한 경우를 나타낸다.

     

    왼쪽 이미지는 아까 Non-Maxinum Surression 했던 이미지이고

    오른쪽 이미지는 이를 토대로 2개의 임계값에 대하여

     

    진한 하얀 영역은 빨간색 영역 (High 이상 값)    강한 에지라 부르겠음

    옅은 회색 영역은 주황색 영역 (Low 와 High 사이 값)    약한 에지라 부르겠음

     

     

    이렇게 나누게 되면 진한 하얀 영역은 진짜 Edge가 되고

    옅은 회색 영역은 이제 연관성을 판별해야 한다.

    

 

 

  1. Edge tracking by hysteresis

     

    다음단계가 연관성의 판별 단계이다.

    빨간색 영역의 에지(High 보다 더 큰 )강한 에지로 설정하고

    최종 에지 영상에 추가하게 된다.

     

    주황색 영역의 에지(Low 와 High 사이)약한 에지로 설정하게 되고

    강한 에지들과 연결될 경우에만 추가 하게 된다.

     

    왜냐하면 노이즈나 다른 작은 변화량들은 강한 에지들과 연관성이 떨어지기 때문이다.

    그렇기 때문에 사실 강한 에지 들이 거의 실제에지로 나타나는 현상이 발생한다.

     

    에지 트래킹은 BLOB-analysis(binary Large Object)를 통하여 구현하게 된다.

    강한 에지를 포함하는 Blob은 보존되고 그 이외는 제거하게 되는 것이다.

     

    한마디로 약한 에지에 대해서만 8방향으로 검색하여 연결성 여부를 판단하는 것

    만약 강한에지가 연결되어 있음 에지 등록

    만약 약한 에지가 연결되어 있음 스택에 넣고 연결 전체를 따라다니며 강한 에지가 연결되어 있나 확인

    없으면 넌 에지가 아니다. 하고 판결 내림

     

    아래 그림은

    첫번째 이미지는 회색영역만 판별한다.

    그래서 이를 토대로 약한 에지를 판별해본 결과

     

    두번째 이미지에서

    파랑색은 강한 에지와 연관성을 가지고 있는 약한 에지를 나타냄

    빨간색은 강한 에지와 연관성을 가지고 있지 않는 약한 에지를 나타냄

     

    그래서 마지막 이미지는 강한 에지와 연관성있는 약한 에지만 합친 영상

    이게 최종 Canny Edge 영상의 결과물

 

 

최근에도 Canny Edge알고리즘을 사용합니까?

최근 Canny Edge는유용하게 사용되고 있다.

OpenCV 2.4 버전부터는 GrayScale 버전이 아닌

Color영상에서도 Canny Edge를 지원한다고 한다.

 

 

이를 구현하고 싶은데 어떻게 구현하는 소스는 없나요?

http://www.pages.drexel.edu/~nk752/Research/cannyTut2.html

여기 참고 하면 그냥 구현해놓은 소스가 잘 나와 있슴당.

 

 

에이 이를 언제 다 구현하고 앉아 있어요, 좀더 편하게 OpenCV로 구현하고 싶어요!

  1. VS2010을 키고 환경 설정

    내 컴에는 2.3.1 버전이 깔려 있기에 2.3.1로 하겠습니다.

    우리는 일반적으로 opencv함수를 사용하기 위하여

    opencv_core231, opencv_highgui231를 추가해주고

     

     

  2. 간단하게 영상을 하나 뛰웁시다.

 

  1. cvCanny 함수를 사용합니다.

Canny함수를 사용하려면 Imgproc231.lib 있어야 합니다. 추가하세요

그리고 인자값은 SrcImage 원본 영상, DstImage 반환 영상

임계값 2개 설정 해주면 끝입니다.

 

별거 아니네,,,, ㅡ,.ㅡ

 

그 결과 다음과 같은 결과를 얻을 수 있습니다.

그림을 1 2 3 4 라고 했을 때

4번 사진 100 100 설정은 강한 에지만 구하려고 설정

2번 사진과 4번을 비교 하였을 때

50~ 100 사이의 연결 에지 들이 많다는 것을 알았습니다.

그래서 강도를 50 ~ 200으로 설정하니 좀더 깔끔한 에지를 구할 수 있었음

 

결론은

2개의 임계 값을 어떻게 설정하느냐 ??????

이에 대한 것은 논문을 추후 찾아 봐야겠습니다.

 

 

 

 

도움이 되셨다면

리플하나 달아 주는 센스^^