관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

지역 특징 7 - 연습문제 풀기 3 : 문제 6번 본문

인공지능/컴퓨터 비전

지역 특징 7 - 연습문제 풀기 3 : 문제 6번

huenuri 2024. 11. 11. 18:20

나머지 문제도 이어서 풀어보겠다.


 

 

 

연습문제 풀기 세 번째

 

문제 6번

그림 5-9의 옥타브 영상을 마드는 프로그램을 작성하시오. 예시 영상은 스스로 고르시오.

(1) 그림처럼 6개의 가우시안 영상과 5개의 DOG를 만들어 서로 다른 윈도우에 디스플레이하는 프로그램을 작성하시오.

(2) 옥타브를 구성하는 가우시안 영상의 개수를 지정할 수 있도록 프로그램을 확장하시오.

 

 

그림 5-9

 

 

이 그림은 SIFT(Scale-Invariant Feature Transform) 알고리즘에서 사용하는 다중 스케일 공간의 개념을 보여준다. 여기서 옥타브(Octave)와 DOG(Difference of Gaussian)에 대해 설명하겠다.

옥타브(Octave)

  • 옥타브란 SIFT에서 이미지 피라미드의 한 층을 의미한다. 옥타브는 여러 스케일의 이미지를 포함하며, 각 스케일은 원본 이미지의 해상도에서 점점 낮아진다.
  • 예를 들어, 옥타브 0은 원본 이미지 크기와 동일한 해상도에서 시작하지만, 옥타브 1은 원본 이미지의 해상도를 절반으로 줄인 이미지로 시작한다. 이후 옥타브가 하나 증가할 때마다 해상도는 절반씩 감소한다.
  • 각 옥타브는 이미지에서 다양한 스케일(또는 크기)로 특징을 찾기 위해 사용된다. 이는 SIFT가 스케일 불변성을 가지도록 하는 중요한 요소다.

 

다중 스케일 이미지 생성

  1. 스무딩(Smoothing)
    • 각 옥타브 내에서 첫 번째 이미지(처음 스케일 이미지)는 가우시안 필터로 미리 약간 스무딩된 상태로 시작한다.
    • 이후 스무딩이 점점 강해지는 여러 스케일의 이미지를 생성한다. 가우시안 필터의 표준 편차 σ\sigma를 점점 크게 하여 여러 단계의 스무딩을 거친 이미지를 만들며, 각 옥타브 내에서 보통 5개 정도의 가우시안 스무딩 이미지가 만들어진다.
  2. 다운샘플링
    • 한 옥타브가 끝날 때마다, 다음 옥타브의 첫 번째 이미지는 이전 옥타브의 4번째 스케일 이미지를 다운샘플링(해상도 절반) 하여 시작한다.
    • 다운샘플링은 원본 이미지의 정보를 압축하여 작은 크기의 이미지로 변환하는 과정이다. 이를 통해 더 낮은 해상도에서 스케일별로 이미지가 축소된다.

 

DOG(Difference of Gaussian)

  • DOG는 두 개의 인접한 가우시안 스케일 이미지 간의 차를 계산하여 생성된다.
  • DOG는 특징을 더 쉽게 찾을 수 있는 이미지 차이를 만들어낸다. 이렇게 차 영상을 만들면 가우시안 스무딩에서 흐려진 정보가 사라지며, 주요한 에지와 코너 정보만 남게 된다.
  • DOG 영상은 가우시안 이미지들의 차이로 계산되기 때문에, SIFT에서는 DOG 영상에서 특징점을 찾는다. 각 옥타브에서 스케일별로 DOG 영상을 구하면 총 4개의 DOG 영상이 생긴다.

 

요약

  • 옥타브는 SIFT 알고리즘에서 다양한 해상도의 이미지를 표현하기 위해 해상도를 절반씩 줄여가며 구성한 이미지 피라미드의 각 단계다.
  • 각 옥타브 안에서 다양한 스무딩 수준의 이미지가 생성되며, 이로부터 인접한 스케일 이미지를 빼서 DOG 영상을 만든다.
  • DOG 영상은 가우시안 블러 차를 이용해 에지와 코너 같은 특징만 강조한 이미지로, SIFT는 여기서 특징점을 검출한다.

이 과정을 통해 SIFT는 이미지의 다양한 스케일에서 특징을 안정적으로 검출할 수 있어, 이미지가 크기나 회전에 대해 불변성을 가지게 된다.


 

 

 

(1) 6개의 가우시안 영상과 5개의 DOG를 만들어 서로 다른 윈도우에 디스플레이하는 프로그램을 작성

이 프로그램은 주어진 예시 영상에서 옥타브와 각 가우시안 블러 및 DOG 영상을 생성하고, 이를 각각 별도의 윈도우에 표시하도록 한다.

먼저, cv2와 numpy 라이브러리를 사용하여 각 옥타브 내의 가우시안 영상과 DOG 영상을 생성하고 시각화한다.

 

 

 

 

 

 

 

 

 

 

 

 

가우시안 수치가 높아질수록 영상이 흐려진다. 하지만 DOG에는 아무런 이미지도 출력되지 않았다.

 

 

 

 

 

이미지에서 DOG(Difference of Gaussian) 영상에 아무것도 출력되지 않은 이유는 원본 이미지가 텍스처가 적거나 대비가 낮은 영역이 많기 때문일 가능성이 높다. DOG는 주로 엣지, 코너, 텍스처와 같은 특징이 있는 영역에서 값이 두드러지게 나타나며, 평평한 영역이나 대비가 낮은 영역에서는 값이 거의 나타나지 않는다.

이 이미지는 해변과 바다, 하늘의 넓은 평탄한 영역이 많이 포함되어 있다. 따라서, DOG를 생성할 때 인접한 가우시안 블러 영상에서 차이가 거의 없어지는 경우가 생길 수 있다.

 

해결 방법

  1. 강한 텍스처가 포함된 이미지 사용: 건물, 나무, 바위 등 텍스처와 대비가 많은 이미지를 사용하는 것이 DOG 영상을 생성하는 데 유리하다.
  2. 이미지 대비 조정: DOG 생성 전에 이미지의 대비를 높여서 더 뚜렷한 특징이 생기도록 하면, DOG 영상에서도 더 명확한 차이가 나타날 수 있다.
  3. Gaussian 스무딩 설정 조정: Gaussian 블러의 sigma 값을 조정하여 가우시안 블러의 강도를 조절하면 DOG에 차이가 나타날 수 있다.

혹은 이 이미지에서 배가 있는 부분에 초점을 맞추고, 그 부분을 이미지의 일부분으로 잘라서 DOG 영상을 확인해 보는 것도 방법이다.


 

 

DOG 이미지 나타나도록 코드 수정하기

다른 사진으로 해도 마찬가지여서 코드를 수정해 보았다. DOG 이미지가 검은색으로만 나타나는 이유는, 두 가우시안 블러 이미지 간 차이가 크지 않거나, 차이값이 양수와 음수 값으로 포함되어 있어 이미지의 모든 픽셀이 검은색으로 보일 수 있기 때문이다. OpenCV의 cv.subtract 함수는 두 이미지 간의 차이에서 음수 값을 모두 0으로 처리하여, 결과적으로 검은색이 될 가능성이 크다.

이를 해결하기 위해, DOG 이미지의 값을 시각적으로 볼 수 있도록 조정하는 방법이 필요하다. 아래 코드에서는 DOG 이미지를 float32 형식으로 계산하고, 그 값을 0에서 255 사이로 정규화하여 검은색이 아닌 값을 포함하도록 한다.

 

 

 

 

 

 

 

 

 

 

DOG는 약간 판화 느낌으로 만들어지는데 역시 수치가 높아질수록 흐려진다.

 

코드 설명

  1. float32 타입으로 변환:
    • img.astype(np.float32)로 변환하여 가우시안 블러와 DOG 계산 시 정밀도를 높인다.
  2. DOG 이미지 생성:
    • 인접한 가우시안 블러 이미지를 뺀 후, 결과를 dog_images 리스트에 저장한다.
  3. DOG 이미지 정규화:
    • cv.normalize()를 사용하여 각 DOG 이미지를 0에서 255 사이의 범위로 정규화한다. 이렇게 하면 양수와 음수 차이를 모두 표현할 수 있어 시각적으로 잘 보인다.

 

 

 

 

(2) 옥타브를 구성하는 가우시안 영상의 개수를 지정할 수 있도록 프로그램을 확장하기

아래 코드는 옥타브를 구성하는 가우시안 영상의 개수를 사용자로부터 입력받아 지정할 수 있도록 프로그램을 확장한 것이다. 이 코드에서는 옥타브 개수뿐만 아니라 각 옥타브 내의 가우시안 영상의 개수도 지정할 수 있도록 했다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

학습을 마치고

문제 풀이가 길어서 한 문제만 풀어보았다. 이제 두 문제 남았으니 이 문제도 풀어보려고 한다. 조금 전에 별 도움도 안 되는 시험을 보느라 1시간 반 이상을 낭비했더니 시간이 좀 아까운 생각이 든다.

그래도 이런 시험도 있구나 싶었다. 그저 답만 달달 외워서 자격증을 땄다는데 만족하는 시험은 다시는 보고 싶지 않다. 내게 필요하고 공부하는 기쁨을 느끼는 그런 시험을 앞으로 볼 생각이다. 인사교 생활도 빨리 끝났으면 좋겠다.

 

요즘 따고 싶은 자격증도 몇 개 있는데 내년에 꼭 도전해 봐야겠다~