영상처리 - Motion Estimation

milkbottle·2024년 4월 21일

영상처리

목록 보기
8/12

Motion Estimation

현재 이미지는 과거이미지에서 얼마나 움직였는지 구할 때 사용하는 기술이다.

움직임 차이를 구하려면 어떤 알고리즘이 나올지 배우기전에 생각해보자.

단순히 픽셀별로 서로 차를 빼서 이미지를 만들면 되지않을까?

어떤 방법들이 있는지 알아보자.

Block Matching Algorithm

전체 이미지를 탐색하며 차를 빼는 건 비효율 적이다.

즉 구간을 나눠 탐색하여 얼마나 움직였는지를 나타내는 motion vector를 구하면 될 것이다.

현재의 템플릿 ft(x,y)f_t(x,y)에서 점점 범위를 넓혀가며 유사도가 높은 fr(x,y)f_r(x,y)를 찾는 것이다.

유사도가 가장 높은 sub image를 찾았다면, motion vector 를 구할 수 있다.

Block motion estimation, Pixel motion estimation으로 총 두가지가 있는데,

전자는 이미지를 원하는 크기 만큼 블록으로 나눠 움직임을 추정하는 것이고,

후자는 픽셀 하나하나 어디로 움직였는지 움직임을 추정하는 것이다.

Video Coding

Motion Compensation


이미지에서 ME를 통해 Motion Vector를 찾는다.

이 Motion Vector을 과거 이미지 fr(x,y)f_r(x,y)에 적용하여 예측이미지를 찾는 것이다.

Encoding, Decoding


이미지를 픽셀 그대로 저장하면 용량이 매우크다.

1920*1080이미지라고 하면 픽셀 개수만 해도 200만개이다.

그리고 하나의 픽셀에는 RGB값이 8비트로 총 3개로 24비트가 저장되어있다.

즉 총 5000만비트 = 약 6메가바이트 나 된다.

30fps의 10초짜리 동영상이라고하면 이런 이미지가 총 300장있는 것이므로

동영상만해도 1800메가바이트나 되는 미친 용량이 되기 때문에,

실제로 동영상은 MPEG 같은 기술로 압축된다.

그래서 동영상을 녹화하고 Encoder로 압축해서 bitstream으로 저장한다.

그리고 실행할때 bitstream의 데이터를 다시 Decoder로 해석해서 동영상으로 볼 수 있다.

Difference


그런데 이미지 전체를 저장하는 것은 너무 용량비효율적이다.

그래서 전 프레임의 이미지의 차이를 구한다.

이 차이의 이미지는 이미지 전체보다는 데이터 값이 매우 작다.

이를 계속 더하며 이후의 이미지를 만들어 내면 위의 방식보다 용량을 효율적으로 가져갈 수 있다.

Motion Estimation & Motion Compensation

사실 Difference를 인코딩 하는 것도 용량이 많이든다.

그래서 모션벡터를 통해 예측 이미지를 만들고, 결과이미지와 예측 이미지의 차이(오차)를 구한다.

이 잔차이미지는 Difference보다 0인 값들이 많아 용량을 효율적으로 가져갈 수 있다.

rt(x,y)=ft(x,y)ft(x,y)r_t(x,y)=f_t(x,y)-\overline{f_t}(x,y)

하지만 아까 배운 ME, MC를 적용해보자.

MC를 통해 예측이미지 ft(x,y)\overline{f_t}(x,y)를 구한다.

원본이미지 ft(x,y)f_t(x,y)와 예측이미지를 뺀 잔차rt(x,y)r_t(x,y)를 구한다.

동영상 파일에서 다시 동영상으로 복구하는 과정에서는 MC를 통해 다시 예측이미지를 만들고,

전달받은 잔차 값을 더해 결과이미지를 만들면 된다.

0개의 댓글