Scale Space와 이미지 피라미드(image pyramid)

영상처리 2014.05.13 14:16

문일지십. 하나를 들으면 열을 깨닫는다.


보통은 머리가 뛰어난 사람을 일컫는 말이지만 꼭 그런 것만은 아니라고 생각한다. 우리가 어떤 잘 모르는 개념 또는 사물을 알고 싶을 때 한눈에 깨닫지 못할 때는 흔히 다양한 각도에서 대상의 실체를 알기 위해 노력한다. 하지만 어떤 설명을 읽어보아도 그 개념이 명확치 않은 경우가 종종 있다. 실체를 깨닫지 못한 상태에서는 아무리 많은 설명을 들어도 모두가 안개속이고 오히려 혼란만 가중되기 때문이다. 공부도 마찬가지이다. 안개속에 있는 사람에게는 아무리 다양한 방법으로 설명해 줘도 별 효과가 없는 경우가 대부분이다. 그런데.. 한가지, 단 한가지를 깨닫는 순간 그 모든 것들이 일시에 깨달아지는 순간이 있다. 핵심으로 향하는 문이 열리는 순간 그동안 자신을 괴롭히던 여러 문제들이 믿을수 없게 다 이해가 되고 낱낱이 흩여져 있던 사실들이 사실은 하나로 관통되어 있음을 깨닫게 된다. 하지만 그 문이 열리는 것은 결코 쉬운 일이 아니다.


Scale Space(스케일 스페이스)..


근 3주 가까이 머리 속에 맴돌고 있지만 틈틈히 자료를 읽어보아도 뭔가 개운하게 정리가 안된다. 대충은 알것 같은데 잘 정리가 안되는 것이 아무래도 핵심으로 가는 실타래를 아직 발견하지 못한 것 같다. 그래도 일단은 글로 적어보면서 정리해 보고자 한다.



참고자료

☞ 첫번째 자료가 scale space 이론에 대한 가장 대표적인 참고자료로 알려져 있지만 개인적으로 봤을 때 그렇게 잘 쓰여진 내용은 아니라고 생각합니다 (너무 어렵고 산만함). 오히려 두번째 자료의 9장 내용이 훨씬 좋습니다.



1. 스케일(scale)


우리는 동일한 장면을 보면서도 스케일에 따라서 전혀 다른 것들을 보게 된다. 예를 들어, 똑같은 나무에 대하여 작은 스케일에서는 나뭇잎이나 가지를 보겠지만 큰 스케일로는 나무가 포함된 숲을 볼 수도 있다.


영상인식, 컴퓨터 비전에서도 스케일은 중요한 문제 중의 하나이다. 이는 영상에서 물체의 특징을 계산할 때 어떤 스케일에서 보느냐에 따라 전혀 다른 결과가 나올 수 있기 때문이다. 일례로 영상 코너(corner) 검출에서,  아래 그림과 같은 형태의 물체는 큰 스케일(붉은색 박스)에서는 명확히 코너점으로 인식되겠지만 작은 스케일(연두색 박스)에서는 완만한 곡선 또는 직선으로밖에 인식되지 못할 것이다.


<그림 1> 스케일 문제 - 코너점 검출 예


이러한 스케일(scale) 문제에 있어서 가장 근원적인 해결책은 당연히 대상을 여러 스케일에 걸쳐 표현 (multi-scale representation)하고 분석하는 것이다.


영상처리 분야에서는 이미지의 스케일(scale)을 다루는 방법으로 크게 '이미지 파라미드(image pyramid)' 방법과 'scale space 이론' 방법이 있다.



2. 이미지 피라미드(image pyramid)


이미지를 여러 스케일(scale)에 걸쳐서 분석하는 가장 기본적인 방법은 입력 이미지의 크기를 단계적으로 변화(축소)시켜 가면서 필요한 분석 작업을 하는 것이다. 이 때 이렇게 생성된 일련의 이미지 집합을 이미지 피라미드(image pyramid)라 부른다.


예를 들어 영상에서 보행자를 검출하는 경우, 먼저 <그림 2>와 같이 이미지 피라미드를 생성한 후 각 스케일 영상에서 고정된 크기의 윈도우를 이동시켜 가면서 윈도우 내 영역이 보행자인지 여부를 판단하는 것이 일반적이다.


<그림 2> 이미지 피라미드


※ 스케일이 크다? 작다?

흔히 스케일이 크다는 것은 어떤 사물을 넓은 시야에서 본다는 의미이다. 그렇다면 이미지 피라미드에서 축소된 이미지들은 원본 이미지에 비해 스케일이 큰 것일까? 아니면 작은 것일까? 정답은 '크다'이다. 혼동되기 쉬운 부분이긴 한데 이미지의 크기(size)를 축소시킬수록 이미지의 스케일(scale)은 (반비례로) 큰 값을 갖는다. 축소된 이미지에서는 숲을 보게 되고 확대된 이미지에서는 나뭇잎을 보게 됨을 생각하면 된다. 논문 등에서 스케일(scale) 변화에 따른 성능 그래프 등을 볼 때 스케일 값이 클수록 그만큼 이미지는 축소된 것임에 주의해야 한다.


※ 스케일의 단계(scale step)

여러 크기의 물체를 검출할 목적인 경우 스케일을 보통 1.1배(또는 1.05배)씩 증가시켜 가면서 이미지 피라미드를 구성한다. 즉, 원본 이미지의 스케일을 1이라 했을 때 다음 이미지의 스케일은 1.1, 그 다음 이미지는 1.1*1.1, ... 과 같은 식이다. 이 때 이미지의 크기(size)는 1/스케일 배씩 축소된다. 즉, 처음 이미지의 크기가 1이라면 다음 이미지의 크기는 1/1.1, 그다음 이미지의 크기는 1/(1.1*1.1), ... 과 같은 식이다.


※ Gaussian Pyramid

이미지 피라미드를 생성할 때, 일련의 블러링(blurring)과 다운 샘플링(sub sampling)을 통해 이미지를 1/2씩 축소시켜 가면서 피라미드를 생성하는 경우도 있다 (블러링->1/2축소->블러링->1/2축소->...). 블러링에는 Gaussian 필터를 이용하고 다운 샘플링은 짝수번째 픽셀들은 버리고 홀수번째 픽셀들만을 취하는 방식으로 진행한다. 이렇게 생성된 이미지 피라미드를 Gaussian pyramid라 부르는데, Gaussian pyramid에서는 이미지의 크기가 빠르게 줄어들기 때문에 피라미드를 구축하기 위한 시간과 메모리 요구량이 낮고 이후 빠른 영상분석이 가능한 장점을 갖는다. 하지만 스케일 축에서 보면 Gaussian pyramid는 물체가 가질 수 있는 연속된 스케일 변화를 매우 coarse하게만 샘플링한 것이기 때문에 스케일 축 상에서 물체를 비교하거나 매칭할 때 알고리즘적으로 문제가 어려워지는 단점을 갖는다.


<그림 3> Gaussian pyramid (그림출처: Twan Maintz, "Digital and Medical Image Processing")


따라서, Gaussian pyramid는 축소된 이미지에서 빠르게 원하는 특징이나 대상을 검출한 후에 점차적으로 원래의 스케일에서 보다 정확한 특징을 계산하는 coarse-to-fine 형태로 주로 사용된다. 일례로, opencv 등에 구현되어 있는 Lucas-Kanade optical flow 알고리즘은 먼저 피라미드의 최상층 이미지에서 optical flow를 대략적으로 계산한 후 이를 좀더 확대된 이미지에서 다시 계산(refine)함으로써 점차적으로 flow의 정확도를 높이는 방법을 사용한다.



3. Scale Space


Scale space... 단어적 의미로 본다면 scale space는 스케일(scale) 축을 따라서 생성되는 공간이다. 즉, 어떤 대상을 볼 때 하나의 스케일 또는 현재의 스케일 만을 보는 것이 아니라 대상이 가질 수 있는 다양한 스케일의 범위를 한꺼번에 표현하는 공간이다.


Scale space 이론은 대상의 구조를 여러 스케일에 걸쳐 다루기 위한 공식화된 이론으로서, 대상을 스케일 축을 파라미터로 하는 공간상의 한 점(instance)으로 표현한다. 이미지의 경우 이미지 f(x,y)에 대한 scale space 표현은 Gaussian blurring(2D Gaussian filter와의 convolution)을 통해 생성되는 일련의 스무딩(smoothing)된 이미지 fσ(x,y) 들로 정의된다.


 --- (1)


--- (2)


식 (1)에서 scale parameter σ는 convolution에 사용된 Gaussian 필터의 표준편차에 해당하며, σ=0일 때 f0(x,y) = f(x,y)로 정의된다.


<그림 4> Scale Space 예 (그림출처: 위키피디아)


☞ 참고로 원래는 t = σ2을 scale parameter로 잡고 scale space를 L(x,y;t) = g(x,y;t)*f(x,y)와 같이 표기하는 것이 보다 일반적이다. 하지만 이는 단지 표기상의 차이일 뿐이며 σ를 scale parameter로 표기하는 것이 보다 직관적이라 생각되어 이 글에서는 식 (1)과 같이 scale space를 정의한다.


이와 같이 어떤 이미지의 scale space는 Gaussian 블러링을 통해 생성되는 일련의 이미지들로 구성된다. 그런데 이렇게 블러링된 이미지가 스케일과 무슨 관계가 있을까?


이미지의 스케일(scale)을 변화시키는 방법은 앞서 봤듯이 이미지를 확대시키거나 축소시키는 것이다. 그런데, 이미지를 직접 확대, 축소시키지 않고도 스케일을 변화시키는 방법이 바로 이미지를 블러링(blurring)시키는 것이다. 이미지를 블러링시킬수록 세부적인 detail이 사라지고 보다 큰 스케일에서의 이미지의 구조를 파악할 수 있게 된다.


그렇다면 블러링된 이미지의 스케일 값은 얼마일까? 블러링된 이미지의 스케일은 사용된 Gaussian 필터의 시그마(σ)에 비례한다. 즉, 만일 σ2 = kσ1라면 fσ2(x,y)의 스케일은 fσ1(x,y)의 스케일의 k배가 된다. 그래서 위 <그림 4>는 scale 값이 계속 2배씩 증가되는 예에 해당한다.


☞ 스케일이 2배가 되는 지점은 앞서 설명한 Gaussian pyramid를 생성할 때 중요한 포인트가 된다. 왜냐하면 스케일이 2배가 되는 지점에서 이미지의 크기를 1/2로 축소하면 다운 샘플링에 따른 정보의 손실을 최소화하면서 해당 스케일의 이미지 구조를 유지할 수 있기 때문이다.


이미지를 블러링시키는 방법은 여러가지가 있지만 그중 Gaussian 필터를 이용한 방법만이 제대로된 scale space를 생성할 수 있는 유일한 방법이라고 한다 (Tony Lindeberg, "Scale-space theory: A basic tool for analyzing structures at different scales"). 그 기준은 블러링 과정에서 원래 이미지에 없던 새로운 구조가 나타나서는 안되며 coarse한 스케일에서의 이미지 구조는 원래의 fine 스케일에 있던 이미지의 구조에 대한 일종의 단순화(simplification)이어야 한다는 것이다. 그리고 이러한 조건을 만족하는 필터는 Gaussian 필터가 유일하다고 한다.


<그림 5> Gaussian Blurring (그림출처: Tony Lindeberg, "Scale-space theory: A basic tool for analyzing structures at different scales")


<그림 5>의 왼쪽 그림을 보면 Gaussian 블러링에 따라 점차적으로 큰 스케일의 구조만 남게 됨을 볼 수 있다. 또한 오른쪽 그림은 블러링에 따른 신호의 극대, 극소점의 위치변화를 보여주는데, 블러링에 따라 그 위치가 변함이 없음을 보여준다. 즉, Gaussian 블러링이 신호의 구조를 보존함을 보여준다.


또한 Gaussian 필터는 이미지의 구조를 유지시키는 외에도 scale space 생성에 매우 유용한 성질을 가지고 있다. 그것은 작은 크기의 Gaussian 필터를 중첩하여 적용(convolution)하면 큰 크기의 Gaussian 필터를 적용한 것과 동일한 효과를 갖는다는 것이다.


 --- (3)


식 (3)을 이용하면 scale space를 생성할 때 작은 크기의 Gaussian 필터들을 중첩하여 적용함으로써 일련의 scale space를 생성할 수 있게 된다. 즉, f(x,y)에 gσ(x,y)를 적용하면 fσ(x,y)가 나오고, fσ(x,y)에 다시 gσ(x,y)를 적용하면 fsqrt(2)σ(x,y), 여기에 다시 gsqrt(2)σ(x,y)를 적용하면 f(x,y), ... 와 같은 식으로 scale space를 생성할 수 있다.



4. Scale Space와 Octave 표현


Scale space 자체는 연속적으로 정의되지만 현실적으로 모든 스케일에 대해 분석하는것은 불가능하다. 따라서scale space를 영상처리에 활용하기 위해서는 스케일 축을 따라서 일정한 간격으로 샘플링된 scale space를 생성해야 한다. 이 때의 샘플링 간격을 scale step이라 부르는데 흔히 사용되는 scale step은 이다. 이 때, scale step은 +, -의 개념이 아니라 *, /의 개념임에 주의해야 한다. 즉, scale step을 s라 하면 σ, s*σ, s*s*σ, ...와 같은 형태로 샘플링이 이루어진다.


또한 scale space를 생성할 때, 메모리의 효율성과 연산의 효율성을 위해서 Gaussian 블러링과 다운 샘플링(sub sampling)을 혼용하여 사용하는 것이 일반적이다. 즉, Gaussian 필터를 단계적으로 적용하여 이미지의 스케일을 증가시켜 가다가 스케일이 2배가 되는 시점에서 1/2 크기로 다운 샘플링한다. 이후 다운 샘플링된 이미지에서 다시 Gaussian 필터를 적용해 가는 방식이다. 이 때, 스케일이 2배가 되기까지 Gaussian 블러링으로 생성되는 스케일 공간을 octave라고 부르며 scale step이 작을수록 한 octave를 구성하는 이미지의 개수가 많아진다.


<그림 6> scale space의 octave pyramid 샘플링 예



5. Scale Space의 활용


Scale space를 구축하는 목적은 다양한 스케일에 걸쳐서 이미지 특성을 분석하기 위함이다. 그런데 scale space 이미지에 직접 어떤 연산자(operator)를 적용하는 것은 몇가지 문제점이 있다.


Scale space 이론에 의해 생성되는 이미지들은 기본적으로 블러링만 되었을 뿐 원래 이미지와 크기(resolution)는 동일한다. 따라서 스케일별 특성을 분석하는 것이 목적이기 때문에 모든 이미지에 고정 크기의 연산자를 적용하는 적은 적합하지 않다. 그렇다고 이미지마다 서로 다른 크기의 연산자를 적용하는 것은 구현적인 측면에서 적합하지 않다. 또한 스케일이 원본 이미지의 정수배인 경우에는 다운 샘플링된 이미지에 연산자를 적용하면 되지만 정수배가 아닌 경우에는 이러한 적용도 쉽지 않다.


Scale space 관련하여 여러 자료를 찾아보았지만 이 문제에 대해 명확하게 설명되어 있는 자료는 찾지 못하였다. Twan Maintz의 저서 "Digital and Medical Image Processing" 9장(p.251)에 보면 differential operator를 사용하면 이 문제를 해결할 수 있다고 언급되어 있지만 왜 그런지에 대해서는 설명되어 있지 않다.


어쨌든 실제로 scale space가 활용되는 방식은 고정된 크기의 연산자를 모든 스케일의 이미지에 동일하게 적용하는 것이다. 그리고 이러한 연산자로는 그레디언트(gradient), 라플라시안(Laplacian), 헤시안(Hessian) 등과 같은 1차 또는 2차 미분을 기반으로 한 연산자가 주로 이용된다.


미분 연산자는 영상의 밝기변화 특성을 분석하기 위한 연산자로서 edge 검출에 사용되는 Sobel 필터 등이 대표적인 미분 연산자이다. 그런데, 미분 연산자는 블러링된 이미지에 미분을 적용하는 것과 Gaussian 필터에 미분을 적용한 후 블러링시키는 것이 동일한 결과를 갖는 매우 좋은 특성을 가지고 있다.


 --- (4)


즉, scale space 상의 이미지들에 직접 미분 연산자를 적용하는 것(좌변)과 Gaussian 필터에 미분을 적용한 후 convolution을 시키는 것(우변)이 동일하다는 것이다. 식 (4) 좌변과 같이 디지털 이미지에 직접 미분을 적용하는 것은 기본적으로 잘 정의되지 않는 ill-posed 문제이지만 우변과 같이 Gaussian 함수의 미분을 구하는 것은 수학적으로 잘 정의되는 well-posed 문제이다. 또한 직접 미분을 구하지 않고 Gaussian 필터에 미분을 적용한 후 블러링시키는 것이 계산상으로도 이득이다. 그리고 이러한 성질은 1차 미분 뿐만 아니라 모든 차수의 미분에 대해 성립한다.


Edge, ridge, corner, blob 등과 같은 영상 feature들은 대부분 이러한 미분 연산자를 기반으로 검출될 수 있다. 따라서 실제 scale space의 주 응용은 미분 연산자를 기반으로 edge, ridge, corner, blob 등과 같은 영상 특징들을 여러 스케일에 걸쳐 분석하는 것으로 볼 수 있다.


예를 들어, scale space 상에서 Laplacian을 이용하여 blob을 찾는 문제를 생각해 보자. 기본적으로 Laplacian은 이미지의 밝기 변화의 곡률(curvature)를 계산해 주는 연산자로서 이미지의 밝기가 지역적으로 극대(극소)인 점에서 최소(최대)값을 갖는다.


--- (5)


이 때, scale space 상의 이미지들에 대한 Laplacian은 원본 이미지에 LoG(Laplacian of Gaussian) 필터를 적용함으로써 얻어질 수 있다.


<그림 7> Gaussian 블러링(상단 그림)과 LoG 결과 (하단 그림)


<그림 7>에서 윗쪽 그림은 검은색 blob 이미지에 대한 Gaussian 블러링 결과이고 아래쪽은 윗 이미지에 3 x 3 Laplacian을 적용한 결과 이미지이다. 그림에서 볼 수 있듯이 원본 스케일에서는 blob 특성이 Laplacian으로는 잘 드러나지 않는다. 하지만 점차 이미지를 블러링시킴에 따라서 blob 영역의 밝기 변화가 완만한 곡선을 이루면서 blob 중심에서 Laplacian 값이 극대가 되는 순간이 존재한다. 그리고 이 순간을 넘어서서 더욱 더 블러링을 시키게 되면 그 곡선이 점차 완만해지기 때문에 Laplacian 값 또한 줄어들게 된다. 이 때, Laplacian 값이 극대가 되는 이미지 스케일은 blob의 크기에 비례하여 증가하므로 어떤 스케일 이미지에서 Laplacian이 극대가 되었는지를 알면 blob의 크기(경계)를 결정할 수 있게 된다.


이와 같이, 이미지에서 Laplacian을 이용한 blob 검출은 각각의 스케일 이미지 내에서 뿐만 아니라 스케일 축을 따라서도 Laplacian 값이 극대가 되는 지점을 찾음으로써 검출이 가능하다 (blob의 위치뿐만 아니라 크기까지 결정할 수 있음).



6. Scale Invariance


사실 scale space의 가장 큰 활용은 영상에서 스케일에 불변(scale invariant)인 특징을 뽑는 것으로 볼 수 있다. 스케일에 불변인 특징이라 하면 이미지를 어떤 스케일에서 찍었든 간에 (즉, 카메라가 물체 가까이서 찍었든 멀리서 찍었든) 동일한 물체 지점에 대해 계산된 영상 특징은 서로 동일해야 함을 의미한다. 그런데, 이미지의 스케일이 바뀌면 계산된 영상 특징은 당연히 바뀌기 때문에 일반적으로는 scale invariance를 만족시키기 어렵다. 하지만 다음과 같이 scale space 이론을 활용하면 scale invariant한 영상 특징 추출이 가능해진다.


그 방법은 먼저 현재 이미지 내에서뿐만 아니라 스케일 축 상에서 특징점(keypoint)을 찾은 후, 해당 특징점이 발견된 스케일 이미지에서 영상 특징을 계산하는 것이다. 이러한 영상 특징점(keypoint)으로는 카메라 시점이 바뀌어도 쉽게 반복 검출이 가능한 코너점(corner point)이 주로 사용된다(영상 특징점(keypoint) 추출방법 글 참조). 코너점을 찾는 방법에는 여러 가지가 있지만 그중 한 방법은 Laplacian이 극대 또는 극소인 점을 찾는 것이다. 즉, 이미지 내에서 뿐만 아니라 스케일 축을 따라서도 Laplacian이 극대 또는 극소가 되는 점을 찾으면 해당 점이 스케일에 불변인 특징점이 된다. 그리고 이렇게 찾아진 특징점 위치 및 스케일에서 영상 특징량(descriptor)을 계산하면 스케일에 불변인 영상 특징량이 된다. 이렇게 찾아진 특징점 및 특징량이 스케일에 불변인 이유는 입력 이미지가 어떤 스케일에서 촬영되었다 하더라도 스케일 공간 탐색을 통해서 해당 스케일을 찾아냄으로써 동일한 특징량 계산이 가능해지기 때문이다.


by 다크 프로그래머


  • 이전 댓글 더보기
  • OPENCV CAFE ID : SIFT 2014.09.06 21:36 신고 ADDR 수정/삭제 답글

    하 ㅠㅠ 죄송합니다.. 식은 그렇다 하더라도 ㅠㅠ...
    아직도 이해가 안갑니돠 ㅠㅠ...

    g(1)*g(1)*f = g(2)*f, g(2)*g(1)*g(1)*f = g(4)*f

    이게 갑자기 왜 나온건지 왜 이해를 제가 못하는걸까요 ㅠㅠ;;

    • BlogIcon 다크pgmr 2014.09.06 21:46 신고 수정/삭제

      그림 6의 가우시언 필터링 과정을 그대로 식으로 적은 것입니다.
      원본 이미지 f에 대해 처음 필터링한 이미지가 g(1)*f, 그 다음 이미지는 g(1)*g(1)*f, 그 다음은 g(2)*g(1)*g(1)*f, ...
      그리고 이렇게 얻어진 이미지들의 스케일이 1, sqrt(2), 2, ...란 의미입니다.

  • OPENCV CAFE ID : SIFT 2014.09.06 22:37 신고 ADDR 수정/삭제 답글

    답변 정말 감사드립니다. 이해가 그래도 안가는 점.. 제가 다시 질문을 해볼게요. 질문을 조금 정리해서 확실하게 넘어가는게 좋을 것 같다는 생각입니다.

    일단, 식 (3)은

    g(sigma1) * g(sigma2) = g(sigma) , sigma1^2 + sigma2^2 = sigma^2 이라고 써져있죠.

    그런데 다크pgmr님이 g(v1)*g(v2) = g(v1+v2) 라고 쓰셨죠. v = sigma^2라고 하셨으니 제가 식(3) 쓴 것에서 2번째에 해당하잖아요? 곧, sigma1^2 + sigma2^2 = sigma^2 이요.

    1. 갑자기 왠 더하기가 나왔나요? g(v1+v2)
    제가 보기엔 왼쪽 식과 오른쪽 식을 뭔가 연계하셔서 쓰신거 같은데... 알려주세요 ㅠ.ㅠ

    2. 식(3) 밑에 쓰신 것을 그대로 써보면

    " f(x,y)에 gσ(x,y)를 적용하면 fσ(x,y)가 나오고, fσ(x,y)에 다시 gσ(x,y)를 적용하면 fsqrt(2)σ(x,y), 여기에 다시 gσ(x,y)를 적용하면 f2σ(x,y), ... 와 같은 식으로 scale space를 생성할 수 있다. "

    라고 적어주셨습니다.
    그림 6이 이를 토대로 그린 것인가요? 아니면 블러 이미지마다 시그마가 다른 가우시안 필터를 사용해서 그린 것인가요? (글을 읽고도 이해를 못하냐고 생각하시면 제가 너무 슬픕니다 ㅠㅠ... 저는 처음에 물음 중에서도 후자로 생각했습니다. -> 그러니 이해를 못하여 질문 한 것이죠 ㅠㅠ;)

    3.
    2.질문 중에서 전자라는 가정하에 그림 6을 보면서 질문을 드리면

    f(x,y) 바로 옆 g(sigma1) 필터를 적용해서 f(sigma1)(x,y) , sigma = 1 인 블러 이미지가 생겼잖아요?
    현재 가우시안 필터의 초기 sigma 값은 1 Scale step은 root(2)로 주셨죠.

    그러면 f(sigma1)(x,y) , sigma = 1 에서 현재 첫 번째 블러 된 이미지는 sigma 값에 따라 스케일이 정해진다고 본문에 말씀하셨으니 이를 표시하는 목적으로 sigma = 1이렇게 쓰신 것이죠.

    그 다음에 위로 올라가니 g(sigma1)를 f(sigma1)(x,y)에 컨벌루션 해서 f(sigma1)(x,y), sigma = root(2)를 얻으셨는데 여기까지는 이해가 갑니다.

    " f(x,y)에 gσ(x,y)를 적용하면 fσ(x,y)가 나오고, fσ(x,y)에 다시 gσ(x,y)를 적용하면 fsqrt(2)σ(x,y), 여기에 다시 gσ(x,y)를 적용하면 f2σ(x,y), ... 와 같은 식으로 scale space를 생성할 수 있다. "

    본문에 위와 같이 쓰셨으니까요.

    근데 문제는 다음입니다.

    f(sigma1)(x,y), sigma = root(2)에서 " " 안에 말씀을 따르면 g(sigma1)를 다시 적용(컨벌루션)해야 맞으나 현재 그림 6은 g(sigma = root(2))를 적용(컨벌루션)하고 계십니다. 이유가 무엇인가요?

    4. 2.질문 중 후자로 가정하면

    그림 6에서 f(x,y)에 각각 g필터를 sigma가 1, root(2) ... 이렇게 가야하는데
    f(sigma1)(x,y) , sigma = 1에 g(sigma 1)을 적용하고 있습니다.

    명확한 답변 부탁드립니다.
    이 질문은 분명 저 뿐만 아니라 다른 분들도 보고 배울 수 있다는 점을 알고 있습니다.

    5. 추가 질문인데요.
    1옥타브의 마지막 이미지와 2옥타브 첫 번째 이미지가 현재 스케일이 갖죠.
    그러면 사실상 이미지 피라미드 구조로 볼 시 2개의 이미지 사이즈는 서로 같다고 볼 수 있나요?

    감사합니다.

    • BlogIcon 다크pgmr 2014.09.07 10:37 신고 수정/삭제

      본문의 내용을 보니 일부 오류가 있었습니다.
      "즉, f(x,y)에 gσ(x,y)를 적용하면 fσ(x,y)가 나오고, fσ(x,y)에 다시 gσ(x,y)를 적용하면 fsqrt(2)σ(x,y), 여기에 다시 gσ(x,y)를 적용하면 f2σ(x,y), ... 와 같은 식으로 scale space를 생성할 수 있다."
      부분을
      "즉, f(x,y)에 gσ(x,y)를 적용하면 fσ(x,y)가 나오고, fσ(x,y)에 다시 gσ(x,y)를 적용하면 fsqrt(2)σ(x,y), 여기에 다시 gsqrt(2)σ(x,y)를 적용하면 f2σ(x,y), ... 와 같은 식으로 scale space를 생성할 수 있다."
      로 수정하였습니다.
      감사합니다.

    • BlogIcon 다크pgmr 2014.09.07 10:57 신고 수정/삭제

      한가지 덧붙이면, 이미지 피라미드는 스케일 공간을 균일하게 샘플링하여 생성합니다. 그리고 원하는(균일한) 샘플링이 나오도록 식 (3)을 이용하여 그때 그때 필요한 가우시언의 시그마를 계산합니다.

  • OPENCV CAFE ID : SIFT 2014.09.07 13:26 신고 ADDR 수정/삭제 답글

    답변 감사합니다.
    수정하신 부분이 그림 6과 일치하는데요.
    사실상 식(3)을 이용하여 케스케이딩 방법을 적용하신거 맞죠? -> 첫 번째 질문

    케스케이딩 방법을 적용하신 거라면
    " " 안에 수정하신 부분이 사실 한 커널(마스크 또는 필터)로 이루어져야하니 즉, 처음 수정 전에 쓰셨던 " " 이 내용으로 다시 바꾸고 그림을 수정해야하지 않나요?
    -> 두 번째 질문

    확인차 여쭤보는 세 번째 질문인데요.
    한가지 덧붙이면, 이라고 쓰신 부분은 제 전 질문에서 추가 질문인 5번 질문에 답변해주신 것 맞나요?
    결국 다크pgmr님은 5번 질문에서 같다고 보신거죠? ->세 번째 질문

    • BlogIcon 다크pgmr 2014.09.07 14:16 신고 수정/삭제

      의사 전달을 한다는게 참 어려운 일이네요..
      => SIFT님께서는 계속 동일한 필터(g)를 중첩해서 스케일 스페이스를 생성하는 것이라고 생각하는 것 같습니다. 하지만 동일한 필터를 중첩해서는 균일하게 scale space를 샘플링할 수 없습니다 ㅠ.ㅠ
      => 균일하게 scale space를 샘플링한다는 의미에 대해 맨 처음 댓글 3번째 질문에 대한 제 답변 내용을 다시 한번 적어봅니다.
      3. scale step은 스케일 축에 대한 샘플링 간격입니다. 그런데, 스케일 축에서 일정한 간격으로 샘플링을 한다고 하는 것은 샘플링된 스케일들 사이의 일정한 곱하기(상수배) 관계가 있다는 의미입니다. 예를 들어, 1배, 2배, 4배, 8배, 16배, ... 와 같이 스케일을 샘플링하는 것이 스케일 축에서는 균일하게 샘플링을 하는 것으로서 이 때의 스케일 step은 2입니다. 그리고, 이미지를 1/2로 축소(down sampling)시켜 가면서 이미지 피라미드를 구축하는 것이 가장 기본적이기 때문에 스케일 step 2는 가장 기본적인 샘플링 간격으로 볼 수 있습니다. 그런데, 스케일 step 2는 너무 샘플링 간격이 크기 때문에 스케일 축을 좀더 촘촘히 샘플링하고 싶은 경우에는 1배, 2배, 4배, ... 의 기본 샘플링은 유지하면서 그들 사이를 좀더 세밀하게 샘플링하는 것이 좋습니다. 즉, 1배, sqrt(2)배, 2배, sqrt(2)*2배, 4배, ... 와 같이 스케일 step을 sqrt(2)로 주거나 혹은 1배, 2^(1/3)배, 2^(2/3)배, 2배, 2*2^(1/3)배, ... 와 같이 스케일 step을 2^(1/3)으로 줄 수 있습니다. 이와 같이 스케일 step은 sqrt(2)나 2의 삼중근, 2의 사중근,... 등으로 잡을 수 있으며 이들 중 문제의 특성에 따라서 어떤 스케일 step을 선택하도 좋지만 흔히 sqrt(2)가 일반적으로 많이 사용되는 기본적인 스케일 step입니다.

  • OPENCV CAFE ID : SIFT 2014.09.07 13:27 신고 ADDR 수정/삭제 답글

    엇 잘못써서 수정하려고 했는데... 수정을 눌러도 반응이 없네요.

    식(3)이 케스케이딩 방법을 이용할 수 있는 식 아닌가요?
    그래서 첫 번째랑 두 번째 질문드린거에요 ^^

  • OPENCV CAFE ID : SIFT 2014.09.07 14:00 신고 ADDR 수정/삭제 답글

    그림 6에서 다운 샘플을 한 뒤 첫 이미지(곧, 옥타브2에서 첫 번째 이미지)의 스케일을 시그마로 2라고 표현해주셨는데요. 제 생각은 시그마가 1이라고 생각합니다.

    가우시안 이미지의 스케일 곧, 시그마가 2sigma인데 이걸 다운 샘플하면 1sigma가 됩니다.
    옥타브에서 가우시안 이미지 수를 적게 잡으셔서 그렇지 혹시나 그림을 좀 더 의미있게 그리신다면 SIFT논문처럼 4sigma까지 간 후 다운 샘플해서 쌓으면 되지 않을까 싶네요. 후에 DoG를 하더라도 DoG 스케일이 2sigma에서(1옥타브 내에) 다음 2옥타브에서 생기는 DoG 스케일이 2*root(2) sigma로 시작할 수 있게 말이죠.



  • OPENCV CAFE ID : SIFT 2014.09.07 14:41 신고 ADDR 수정/삭제 답글

    다크프로그래머님
    감사합니다.

  • OPENCV CAFE ID : SIFT 2014.09.07 18:39 신고 ADDR 수정/삭제 답글

    Scale step을 s라 하면 σ, s *σ, s * s *σ, ...와 같은 형태로 샘플링이 이루어진다.라고 말씀하셨는데

    이미지 블러 하시고 (곧, σ 가우시안 컨벌루션하고) s *σ인 가우시안 필터와 컨벌루션해야하는데

    다시 σ인 가우시안 필터와 컨벌루션한다고 말씀하셨잖아요?

    왜그런건가요 ㅠㅠ?

    아 갈수록 헷갈려지네요.

    • BlogIcon 다크pgmr 2014.09.07 19:08 신고 수정/삭제

      원래 쉽지 않은 내용입니다. 그리고 어느 정도는 본인 스스로 이해하고 정리하는 시간을 갖는게 좋다고 생각합니다. 지금까지의 댓글 내용과 본문 내용을 천천히 정리해 보시기 바랍니다.

  • 김진팔 2014.09.29 13:39 신고 ADDR 수정/삭제 답글

    안녕하세요?
    얼마전 vs 2010 관련 질문드렸던 사람입니다.
    덕분에 오픈cv를 잘 공부하고 있습니다.
    사소한 의문점이 생겼습니다.
    어떤 코딩을 하면, 디버그 버튼을 누르자마자 실행이 되지만,(카메라 켜기예제)
    어떤 코딩을 하면, 프로젝트 폴더에서 exe 파일을 찾아서 더블클릭 해 줘야만 실행이 됩니다.(사진, 동영상 출력 예제)

    이건 버그일까요?
    아니면 원래 그런 것일까요?

    • BlogIcon 다크pgmr 2014.09.29 18:29 신고 수정/삭제

      안녕하세요. 버그는 아니고 기본설정 경로와 관련된 문제입니다.
      글로 설명하기는 참 어려운 문제인데요;;
      예를 들어 opencv의 imread('ttt.jpg') 함수를 통해서 사진을 불러오는 코드가 프로그램에 포함된 경우에 이 프로그램을 실행하면 기본적으로 '현재폴더로 설정된 경로'에서 이 사진을 찾으려고 합니다. 그런데, '현재 폴더'에 해당 사진이 없으면 오류가 발생하는 것입니다.
      exe 파일을 찾아서 실행할 경우에 '현재폴더'는 exe 파일이 위치한 폴더입니다. 그래서, exe 파일이 위치한 폴더에 ttt.jpg 사진이 있으면 프로그램이 정상 실행됩니다.
      그런데, vs에서 프로그램을 실행하면 vs에 설정되어 있는 '기본폴더'에서 사진을 찾게 됩니다. vs의 '기본폴더' 위치는 버전마다 다른데, vs 2008의 경우에는 프로젝트 폴더이고 vs 2012의 경우에는 debug 폴더가 기본폴더입니다 (release로 컴파일할 경우에는 release 폴더가 기본폴더). vs 2010의 경우에는 제가 써보지를 않아서 기본폴더가 어디로 설정되어 있는지는 모르지만 프로젝트 폴더 혹은 debug(release)일 것이므로 해당 위치에 사진파일이 존재해야만 오류가 발생하지 않을 것입니다.

    • BlogIcon 김진팔 2014.09.30 10:28 신고 수정/삭제

      정말 감사합니다.
      글로 설명하셨지만 아주 잘 이해 했습니다.

      Koala.cpp 파일이 들어있는 폴더에
      Koala.jpg 파일을 넣었더니 문제가 해결 되었습니다.

      답례로 뭘 드릴 것은 없고, 대신
      다크 프로그래머님이 복 많이 받으시고 가정에 평화가 영원하시길 기원드리겠습니다.^^

  • BlogIcon 김동빈 2015.02.26 09:46 신고 ADDR 수정/삭제 답글

    다크님 원본이미지를 블러해서 원본이미지랑 빼면 라플라시안 이미지가 생성되는데요 이 라플라시안 이미지하고 블러한 이미지를 더하면 원본과 차이가 많이 나는데요 이게 맞는건가요?

    • BlogIcon 다크pgmr 2015.02.27 06:59 신고 수정/삭제

      라플라시안은 원래 +,- 가 다 나오는데, 이를 이미지로 보여주기 위해서 값을 조정했기 때문이 아닐까 싶습니다. '라플라시안 이미지'와 블러 이미지를 더하지 말고 '라플라시안'과 블러 이미지를 더해보시기 바랍니다.

  • BlogIcon 김동빈 2015.02.27 11:00 신고 ADDR 수정/삭제 답글

    가우시안 이미지가 아니고 가우시안이란것이 뭔지 잘 모르겠어요

    • BlogIcon 다크pgmr 2015.02.27 11:16 신고 수정/삭제

      가우시안이 아니고 라플라시안입니다..
      이미지에 대해 식(5)를 이용하여 라플라시안을 구하면 +와 -값이 모두 나옵니다. 그런데 -값은 이미지로 표현할 수 없기 때문에 라플라시안 결과를 이미지로 표현하기 위해서는 적당한 상수값을 더한 후 이미지로 표현합니다. 즉, 라플라시안 이미지의 픽셀값은 사람에게 보여주기 위해서 변경된 값이므로 실제의 라플라시안 값은 아닙니다. 따라서, 변경된 라플라시안 값에 블러한 이미지를 더하면 원본 이미지가 나오지 않을 것입니다. 혹시 그러한 이유로 원본과 차이가 난 것이 아닌지 확인해 보시란 의미였습니다.

  • SIFT 초보 2015.04.03 00:10 신고 ADDR 수정/삭제 답글

    정말 감사합니다!!!! SIFT를 처음 접하는데 다른 사이트에는 너무 어려운 용어를 사용하거나 내용이 빈약해서 이해하기가 어려웠거든요ㅠ. 다크님 덕분에 기초를 확실히 이해했네요~ 감사합니다~

    • BlogIcon 다크pgmr 2015.04.03 06:28 신고 수정/삭제

      감사합니다. 저도 아직 scale space에 대해서는 일부밖에 알지 못합니다만 도움이 되셨다니 다행입니다.

  • 루니 2015.05.26 09:19 신고 ADDR 수정/삭제 답글

    안녕하세요. 영상처리 분야를 이제 막 공부하기 시작한 학생입니다.

    다크님의 사이트는 항상 잘 보고 있습니다.
    논문등을 볼때 정리가 쉽지 않았는데 많은 도움을 받고 있습니다.

    4. Scale Space와 Octave 표현쪽에서 궁금한 사항이 있어 질문 드립니다.

    "scale step은 +, -의 개념이 아니라 *, /의 개념임에 주의해야 한다."

    라는 구절에서 *, / 의 기호는...convolution과 나누기를 의미하는건가요?
    곱하기와 나누기를 의미하는 건가요?

    미약한 초보에게 도움을 주셔서 감사합니다.

    • BlogIcon 다크pgmr 2015.05.26 10:37 신고 수정/삭제

      안녕하세요. 곱하기 나누기 의미로 사용하였습니다. ^^

  • hep93 2015.07.26 16:45 신고 ADDR 수정/삭제 답글

    공부하면서 한국어로 된 자료 찾기가 정말 어려웠는데 오아시스같은 글입니다. 감사합니다

  • ㅇㅋㅇㅋ 2016.10.21 13:27 신고 ADDR 수정/삭제 답글

    ;;;;;;그냥 책하나 쓰셔도 될듯하네요
    다른쪽 전공하다가 컴퓨터 비전쪽 해보고 싶어서 해보고있는데
    다른거보는 것보다 님 블로그 보는게 훨씬 이해가 잘되네요

  • BlogIcon 톈진난만 2017.05.29 10:37 신고 ADDR 수정/삭제 답글

    sift 공부하면서 스케일이라는 단어 자체가 조금 모호하게 느껴져서 일단 블러의 정도가 커지는 것으로 받아들였는데, 글을 통해 좀 더 분명히 이해가 되었습니다 ㅎㅎ 감사합니다!

  • 느림보 2017.11.24 17:30 신고 ADDR 수정/삭제 답글

    안녕하세요. 님 블로그에서 많은 도움 얻고 있습니다.
    감사합니다.
    본문 내용 중 질문이 하나 있어요.

    1. σ=0일 때 f0(x,y) = f(x,y)로 정의된다. <-- 원본이미지
    2. "만일 σ2 = kσ1라면 fσ2(x,y)의 스케일은 fσ1(x,y)의 스케일의 k배가 된다."

    원본 이미지의 경우 σ=0인데 어떻게 생각해야 할까요?
    즉, 이미지 피라미드의 가장 밑단의 스케일 관계는 어떻게 계산되나요?
    σ=1 인 경우 원본 영상 대비 블러가 실제로 적용되고 실질적으로 스케일이 커진것으로 보이는데 말이죠.

    • BlogIcon 다크pgmr 2017.11.26 13:12 신고 수정/삭제

      네 좋은 질문입니다. 하지만 저도 그 부분은 아직 설명이 안됩니다. 원본 이미지의 스케일이 보존되는 경우는 g가 디렉델타(Dirac delta) 함수일 때뿐입니다. 그리고 Gaussian 함수에서 σ -> +0으로 보내면 디렉델타 함수가 됩니다. "만일 σ2 = kσ1라면 fσ2(x,y)의 스케일은 fσ1(x,y)의 스케일의 k배가 된다."는 문장에 대해서는 저도 좀더 고민해 봐야겠습니다.

    • 느림보 2017.11.27 11:34 신고 수정/삭제

      답변 감사합니다.

      천천히 곱씹어보니 continuous 공간에서 위 1, 2는 납득이 되는데요.

      픽셀 공간으로 넘어오면서 그대로 적용이 어려워지는 것 같습니다.

      사실상 원본 영상도 물리 --> 픽셀로 넘어오면서 pixel 사이즈로 averaging 비슷한 것을 해서 얻어진 것이니까...

      대략 sigma < 0.25 인 경우의 discrete Gaussian mask는 원본 영상을 유지시키는 1x1 unit delta 로 근사화 되는 것을 감안해서

      원본 영상의 sigma를 대략 0.25 등 적절한 값으로 가정하고 거기서부터 sigma = 0.5를 원본의 2배 scale로 본다거나 하는 방법이 있지 않을까 추측해봅니다.

    • BlogIcon 다크pgmr 2017.11.27 15:55 신고 수정/삭제

      네, 기본적으로는 느림보님과 제가 알고 있고 이해하고 있는 바에 큰 차이가 없는 것 같습니다. 다만 원본영상과 sigma=1 가우시언 필터링 영상의 스케일 차이에 대해서는 개인적으로는 좀더 고민을 해봐야 할 것 같습니다.

  • BlogIcon 드리머즈 2018.04.14 19:30 신고 ADDR 수정/삭제 답글

    이미지 피라미드가 궁금했었는데 잘보고 갑니다~!

  • 지나가던학부생 2018.05.16 07:01 신고 ADDR 수정/삭제 답글

    안녕하세요. 피라미드 방식인 opencv cv2.calcOpticalFlowPyrLK()를 사용하려고 합니다. 해당 메소드로 https://docs.opencv.org/3.3.1/d7/d8b/tutorial_py_lucas_kanade.html 이쪽 코드를 사용해서 만들었는데요, 추적점별로 한 프레임에서의 좌표를 csv파일로 출력하게 고쳤습니다.
    그런데 flow는 영상에서만 표시가 되고, 특징점의 시간에 따른 벡터를 구하고 싶어서 이 특징점들의 id를 정해서 출력하고 같은 id끼리 비교하고 싶은데 방법이 없더라구요. 혹시 동일한 특징점에 id를 부여하는 방식이나, 해당 특징점의 시간별 벡터를 구할 수 있는 방법이 있을까요?

    • BlogIcon 다크pgmr 2018.05.16 10:35 신고 수정/삭제

      optical flow를 구할 때, 이미지에서 자동으로 특징점을 찾아서 구하지 않고 사용자가 특징점 좌표를 입력으로 주고 flow를 구할 수 있습니다. 함수의 option이나 파라미터를 잘 찾아보시기 바랍니다.

  • 머신비전꿈나무 2019.03.27 11:12 신고 ADDR 수정/삭제 답글

    안녕하세요. 정리를 잘 해놓으신거 같아 많은 도움이 되었습니다. 읽어보다가 제가 하고싶은 아이디어가 적용이 가능할까 해서 여쭈어봅니다. 우선 이진화 된 예를들어 255 픽셀값 으로 이루어진 물체가 Target물체가 되고 이 물체들과 제가 정의해 놓은 5가지 종류의 이진화된 255 픽셀값의 DB 뮬체와 어느 정도 유사한지를 알고 그 유사도에 따라서 5가지로 분류를 하고 싶습니다. 예를 들어 1,2,3,4,5 중 1DB에 가까운지 2에 가까운지 3에 가까운지를 유사도에 따라 분류를 하고싶은게 목적인데 이를 가능케 하려면 SIFT 알고리즘에서 가우시안 피라미드 개념을 적용하여 여러 피라미드이미지에 DoG를 적용하여 차영상을 하고 그 극대 극소인 부분을 찾아서 특징점으로 후보로 올려놓고 그 후보영역에 Gaussian 블러를 적용하여 Gradient Histogram 형성 후 가장 큰값 알아 내서 , 회전에도 인식가능케 하고 Descriptor를 계산하려면 특징점에 Gaussian weight Function 을 곱해주면 된다는데 이렇게 구한 Descriptor로 DB와 Target 을 비교하여 즉 매칭을 하여 유사도를 알 수있는 방법으로 가능할지 여쭈어 봅니다. 그리고 매칭을 할때 따로 쓰는 방법이 어떠한것인지도 알려주시면 정말 감사하겠습니다. 허접한 글 읽어주셔서 감사합니다.

    • BlogIcon 다크pgmr 2019.03.27 17:08 신고 수정/삭제

      안녕하세요. opencv에 보면 선택한 featrue(sift, surf, orb 등)에 따라서 특징점을 뽑아주는 함수, 뽑아진 특징점에 대해 descriptor를 계산해 주는 함수, 두 descriptor들을 매칭해 주는 함수들이 제공됩니다. 그리고, 사용법 예제코드(opencv\samples\cpp\...)도 같이 제공되기 때문에 참조해 보시면 좋을 것 같습니다.

  • 신동철 2019.04.11 03:39 신고 ADDR 수정/삭제 답글

    항상 다크프로그래머님글에 많은 도움 받고 있습니다.
    본문 내용중 질문이 있습니다.

    언급하신 내용중

    Gaussian pyramid에서 처음에 '블러링->1/2축소' 하고, 그 다음에 두번째로 블러링->1/2축소
    를 수행 하게 될텐데요. 처음에 수행하는 블러링의 σ1 와 두번째로 블러링하는 σ2 의 관계가 이해하지 못하겠습니다.

    언급해주신 내용은 σ가 2배가 된다면, 스케일도 2배로 된다고 말씀해주셨는데요.
    그것은 downsampling(1/2축소과정)을 거치지 않은 거라서 이해는 하지만,
    gaussian pyramid 같은 경우는 중간 중간마다 downsampling(1/2축소과정)을 거치게 되어서
    예로 들어 주신것과 조금 다른것 같은데, 이에 대해서 여쭙고 싶습니다.