ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 엣지 픽셀(Edge pixels)과 엣지(Edges)
    컴공지식/컴퓨터비전 2024. 9. 25. 23:25

    엣지 픽셀은 이미지에서 밝기(인텐시티)가 갑자기 변하는 지점을 말한다.

    이 그림을 보면 갑자기 탁 튀는 부분이 보이는데 그 부분들이 엣지 픽셀이다.

    이 그림에는 4개의 엣지 픽셀이 있다.

     

    엣지는 이런 엣지 픽셀들이 서로 연결되어 만들어진 선을 말한다.

     

     

    다음 그림은 1차 미분(first derivative)을 이용해 엣지를 감지하는 그림이다.

    1차 미분이란, 이미지의 밝기(강도)가 어떻게 변하는지 즉, 변화의 기울기를 나타낸 게 1차 미분이다.

    이미지에서 밝기 변화가 갑자기 확 커지면 그 부분이 엣지일 가능성이 높다.

     

    다음은 이미지 그래디언트를 사용해 엣지를 감지하는 방법이다.

    이건 2D 엣지 감지 방법인데 그라디언트 벡터의 크기(인텐시티)가 클수록 엣지가 있을 가능성이 높다.

    엣지 감지를 한다는 건 마치, 복잡한 미로를 탐험하는 것과 같은데

    미로 속에서 길을 찾으려면, 벽을 따라가면서 어디서 꺾어야 할지 알아야 한다.

    이 바로 이미지에서 엣지이고 이미지 그래디언트는 미로를 헤매면서 벽을 찾기 위해 손을 뻗는 것과 같다.

    g_x는 오빠가 왼쪽이나 오른쪽으로 손을 뻗었을 때 느끼는 벽,

    g_y는 위아래로 손을 뻗었을 때 느끼는 벽이다.

    그래디언트의 크기(M(x, y))는 벽이 얼마나 딱딱한지, 아니면 미묘한지 감지하는 것과 같다.

    g_x와 g_y 이 두 값의 크기를 결합한 값이라고 생각하면 된다.

    손을 뻗었을 때 뭔가 딱딱하게 느껴진다면(즉, 그라디언트 값이 크다면), 거기가 확실한 벽인 것이다.

    α(x, y)는 벽이 어느 방향으로 뻗어있는지 파악하는 거다.

    미로에서 벽이 꺾여 나가는 방향을 알면, 그걸 보고 미로를 탈출할 수 있다.

     

    우리가 엣지를 감지하기 위해서는 주의해야 할 점이 있다.

    바로 노이즈들이다.

    이 노이즈가 있으면 엣지를 감지하는 데 방해가 된다.

    엣지 감지를 제대로 하려면, 먼저 이미지 스무딩을 통해 노이즈를 제거해야 한다.

    스무딩은 이미지의 불필요한 변화를 줄여줘서 노이즈를 줄이고, 엣지를 더 명확하게 보이게 해주는 작업이다.

    average filtering 같은 것을 이용해서 스무스하게 만들어주자.

     

     

    이제 Sobel 연산자에 대해 알아보자

    이미지를 x방향과 y방향으로 각각 미분해서, 밝기가 급격하게 변하는 부분(엣지)을 찾아내는 거다.

    일단 미분을 하기 전에 이미지를 스무딩해주는 것 잊지 말자!

    g_x 방향으로 미분을 하게 되면 가로로 미분을 하는 것이니 가로 쪽의 엣지들이 잘 보일 것이다. 예를 들어 쌓여있는 책 더비들의 엣지 같은 느낌?

    g_y 방향으로 미분을 하게 되면 세로 쪽의 엣지들이 잘 보이게 될 것이다. 예를 들어 쇠창살 같은 것들?

    이 두 가지의 크기를 결합(M(x, y))하면 엣지들이 골고루 잘 보인다.

    마지막 작업으로 Thresholding (임계값 설정)이 있다.

    엣지가 감지되는지 여부를 결정하기 위해, 그래디언트 값이 일정한 수준을 넘었을 때만 엣지로 인식하겠다는 거다.

    그래디언트 크기가 너무 작으면, 그건 그냥 약간의 밝기 변화일 뿐이고 엣지라고 하기엔 부족할 수 있다.

    그래서 사용하는거다.

    말하자면.. 진짜 중요한 엣지만 남기는 과정이다.

     

     

    다음은 Canny Edge Detector 알고리즘에 대해 알아보자

    이 알고리즘에서는 처음에 가우시안 필터를 이용해 이미지를 스무딩한다.

    그리고 Sobel 연산자를 사용해서 그래디언트의 크기와 각도를 계산하고

    비최대 억제(Non-maxima Suppression) 단계에서 엣지가 아닌 곳의 값을 0으로 만들어 엣지의 선명함을 최대화하는 작업을 한다.

    이렇게 하면 엣지 부분이 깔끔하게 남고, 흐릿하거나 약한 엣지는 제거된다.

    마지막으로, 두 개의 임계값을 설정한다.

    두 개의 임계값 T_H (높은 임계값)과 T_L (낮은 임계값)을 설정해서, 엣지인지 아닌지 결정한다.

    M(x, y) > T_H 면 확실한 엣지로 간주

    아니면 거른다.

     

     

    이제 Hough 변환(Hough Transform)에 대해 알아보자..

    호우 변환..

    Hough 변환은 이미지에서 선을 감지하는 기법인데, 수학적으로 선을 어떻게 표현하는지부터 시작한다.

    b = -ax + y 방정식을 사용해서, 각 엣지 픽셀에서 가능한 (a, b) 값을 모두 찾는 거다.

    여러 픽셀이 하나의 선을 공유하고 있다면, 그 조합이 여러 번 반복되니까 이 반복된 조합이 실제 선을 나타내는 거다.

    그런데 직선이 수직에 가까워질 때, 즉 세로로 서 있을 때, 기울기 a가 무한대에 가까워져서 계산이 어려워지는 문제가 생긴다.

    그래서 ρ(선이 원점에서 떨어진 거리), θ(선이 x축과 이루는 각도)로 표현하는 방식을 사용한다.

    ρ=xcos(θ)+ysin(θ)

    직선의 방정식을 이렇게 표현하면 기울기가 무한대가 되는 경우를 피할 수 있고, 수직선도 잘 감지할 수 있다.

     

    이제 호우 변환의 전체 알고리즘을 살펴보자

    먼저 이미지를 엣지 감지로 처리해서 엣지들만 남긴 이진(binary) 이미지를 만든다.

    이진 이미지는 엣지 부분은 흰색(1), 엣지가 아닌 부분은 검은색(0)으로 표현된다.

    θ값을 기준으로 그래프를 그리는데, 각각의 픽셀 위치를 (x, y)로 보고 그에 해당하는 ρθ값을 계산한다.

     θ가 특정 값에 대해 많이 겹치는 곳, 즉 여러 픽셀이 한 직선에 해당하는 곳에서는 누적된 값이 커지는데

    이 누적값이 높을수록 그 직선이 이미지에 존재할 가능성이 커진다.

    즉, 이 값이 높을수록 이미지에서 실제로 존재하는 직선이라고 볼 수 있다.

     

    요약하자면 

     

    1. 엣지 이미지를 얻고,

    2. 각 픽셀의 ρθ를 계산해 누적기에 값을 채우고,

    3. 누적된 값이 많은 곳이 직선으로 감지되는 거다.

     

    그러면 호우 변환으로 직선 말고 은 어떻게 감지할 수 있을까?

    Hough 변환은 단순히 직선만 찾는 게 아니라, 다양한 모양도 찾을 수 있다.

    이것은 원의 방정식이다.

    (c1,c2)는 원의 중심 좌표고

    이미지에서 엣지 픽셀을 찾고, 각 픽셀이 에 속할 수 있는 모든 가능성을 계산한다.

    각 엣지 픽셀은 여러 개의 원을 포함할 수 있는데, 그 픽셀이 해당하는 원의 중심이 될 수 있는 (c_1, c_2)와 반지름 c3값을 추정해 나가는 방식이다.

    모든 엣지 픽셀에 대해 이런 계산을 반복하고, 중심과 반지름이 많이 겹치는 곳이 바로 원이라고 판단하는 거다.

     

    이를 비유를 통해 설명해보자면

    도화지 위에 여러 개의 동그라미를 그린다고 상상해보라. 도화지에 여러 점(엣지 픽셀)이 찍혀 있고, 각 점에서 원을 그려보는 거다. 이 과정에서 겹치는 원들이 많을수록, 그곳이 진짜 원의 중심이 될 가능성이 높은 거다.

     

     

     

     

     

     

    '컴공지식 > 컴퓨터비전' 카테고리의 다른 글

    Canny 엣지 검출기 구현  (0) 2024.09.25
    Sobel 엣지 검출기(Sobel Edge Detector) 구현  (0) 2024.09.25
    White Balancing 예제  (0) 2024.09.20
    Pseudo Coloring 예제  (0) 2024.09.20
    HSI 예제  (1) 2024.09.20
Designed by Tistory.