Music, books, alcohols... and you

옵티칼 플로우 (Optical Flow) 본문

엔지니어링

옵티칼 플로우 (Optical Flow)

paeton 2011.10.27 23:50


(이미지는 위키피디아 optical flow 설명 페이지에서 퍼왔다. http://en.wikipedia.org/wiki/File:Opticfloweg.png)


영상에서 Motion Estimation을 하는 방법 중 아마 가장 유명한것이 Block-Matching-Algorithm (BMA) 와 이 Optical Flow가 아닐까 한다.


BMA는 뭐 그냥 블록을 나누고 두 영상에서 가장 비슷한 블록을 찾아내는 거니까 이해하는데 별 큰 어려움이 없고, 근데 이 Optical Flow는 좀 아리송 하다.


설명을 해야하는데, 귀찮기도 하고 위키피디아에 설명이 잘 되어있으니까 그걸 가지고 하겠다. 아래는 그냥 위키피디아에 있는걸 요점 정리만 해서 쓴거다. 원본은 여기 있다. http://en.wikipedia.org/wiki/Optical_flow

간단하게 2D이미지 의 경우를 생각해 보자. 원래 시간 t에서 (x,y)의 위치에 있던 voxel(또는 pixel)의 intensity를 I(x,y,t)라고 하자. 매우 짧은 시간 δt동안, voxel의 intensity는 변하지 않았고, 위치의 변화만 일어났다고 가정하자. 역시 작은 움직임 δx와 δy가 각각 x, y의 축에서 일어났다고 하면, 그때의 intensity는 I(x + δx,y + δy,t + δt)라고 할 수 있다. 그러면, 아래와 같은 식이 성립하게 된다.


I(x,y,t) = I(x + δx,y + δy,t + δt)     - (1)


이 때, 오른쪽에 있는 식을 Taylor series 전개를 하면 다음과 같은 식이 만들어진다.


  H. O. T.     - (2)


여기에서 위의 (1)과 (2)가 동시에 성립하려면, (2)에 있는 미분식의 합이 0이어야 한다. 즉,





이어야 하고, δx, δy, δt 를 다시 쓰면 아래와 같다.





δx/δt, δy/δt 각각 결국 x 방향의 속도 Vx, Vy 이다. 또한, δI/δx, δI/δy, δI/δt 는 각각 이미지 I에 대한 x 방향, 그리고 y방향의 편미분 Ix, Iy, It이다. 최종적으로 위의 식은 다음과 같이 쓸 수 있다.


IxVx + IyVy = − It

매트릭스 식으로 나타내면 아래처럼 쓸 수 있다.




아주 쉽게 말하면, Motion Vector (Vx, Vy)를 구하는데있어서, 영상을 x축으로 미분(Ix)하고, y축으로 미분(Iy)하고, 시간축으로 미분(It)해서 저 식에 대입해서 Matrix를 풀면 바로 구할 수 있다는 이야기다.





여기서 그럼, "아 그럼 이미지를 x방향으로 미분하고 y방향으로 미분하고, 또 시간축에서 미분한 담에 저 매트릭스를 풀면 되겠구나~" 라고 생각할 수도 있겠다.

근데 생각해보자.... 저 식에서 Ix, Iy, It는 matrix가 맞는데... Vx, Vy 는? matrix인가?

아니다. ㅋㅋㅋ

그러니까, 단순히 전체 이미지를 저 식에 넣어서 풀면, 전체 이미지에 대한 모션 벡터 딸랑 한개만 나온다. 이건 우리가 원하는게 아니다.

이 페이지를 찾아온 많은 사람들이 원하는 것은 아마도, 아래 그림처럼, 각 부분(또는 픽셀)에 대한 모션 벡터를 찾는 것일 것이다.


위 그림은 간 초음파 영상에서 Optical Flow를 이용해서 움직임 벡터를 찾은 것을 표시한 것이다.




위와 같은 움직임 벡터를 찾기 위해서는 다른 방법을 써야 하는데, 구현이 쉽고, 그 원리 또한 쉬운방법 중 하나가 아래에 소개할 Lucas-Kanade 방법이다.

이 optical flow를 실제로 구현하는 방법으로는 위에 링크되어있는 위키피디아에 보면 상당히 많은 방법이 나와있는데, 그중에 가장 또 직관적으로 쏙쏙 들어오는게 Lucas-Kanade 방법이다. http://en.wikipedia.org/wiki/Lucas-Kanade_method


뭐 엄청나게 어렵거나 별거 없고, 영상에서 각 점마다 그 점을 중심으로 하는 블록을 설정하고, 그 블록 단위로 저 공식을 적용해서 Motion Vector를 구하는 것이다.

설명이나 수식보다는 직접 구현된 코드를 보고 실행해보는게 가장 이해가 빠를거라 믿는다. 아래 링크에 가보면 이 Lucas-Kanade Optical Flow를 Matlab으로 구현해 놓은 코드가 있다. 돌려보고 이해해 보자.

http://www.cs.ucf.edu/vision/public_html/source.html#Optical%20Flow


다음에는 Matlab에서 코드 3줄로 구현하는 Image Warping에 대해 써보겠다.



쫄지말고, 화이팅 하자.




'엔지니어링' 카테고리의 다른 글

이미지 워핑 (Image Warping)  (4) 2012.04.26
ECG 신호처리 (1)  (2) 2012.01.25
옵티칼 플로우 (Optical Flow)  (4) 2011.10.27
Magnitude & Phase Spectrum Viewer  (0) 2011.10.27
FDATOOL을 이용해서 Matlab에서 필터 설계하기  (13) 2011.10.26
jimagesc v0.3  (0) 2010.11.03
4 Comments
댓글쓰기 폼