현재 이미지는 과거이미지에서 얼마나 움직였는지 구할 때 사용하는 기술이다.
움직임 차이를 구하려면 어떤 알고리즘이 나올지 배우기전에 생각해보자.
단순히 픽셀별로 서로 차를 빼서 이미지를 만들면 되지않을까?
어떤 방법들이 있는지 알아보자.
전체 이미지를 탐색하며 차를 빼는 건 비효율 적이다.
즉 구간을 나눠 탐색하여 얼마나 움직였는지를 나타내는 motion vector를 구하면 될 것이다.

현재의 템플릿 에서 점점 범위를 넓혀가며 유사도가 높은 를 찾는 것이다.
유사도가 가장 높은 sub image를 찾았다면, motion vector 를 구할 수 있다.
Block motion estimation, Pixel motion estimation으로 총 두가지가 있는데,
전자는 이미지를 원하는 크기 만큼 블록으로 나눠 움직임을 추정하는 것이고,
후자는 픽셀 하나하나 어디로 움직였는지 움직임을 추정하는 것이다.


이미지에서 ME를 통해 Motion Vector를 찾는다.
이 Motion Vector을 과거 이미지 에 적용하여 예측이미지를 찾는 것이다.

이미지를 픽셀 그대로 저장하면 용량이 매우크다.
1920*1080이미지라고 하면 픽셀 개수만 해도 200만개이다.
그리고 하나의 픽셀에는 RGB값이 8비트로 총 3개로 24비트가 저장되어있다.
즉 총 5000만비트 = 약 6메가바이트 나 된다.
30fps의 10초짜리 동영상이라고하면 이런 이미지가 총 300장있는 것이므로
동영상만해도 1800메가바이트나 되는 미친 용량이 되기 때문에,
실제로 동영상은 MPEG 같은 기술로 압축된다.
그래서 동영상을 녹화하고 Encoder로 압축해서 bitstream으로 저장한다.
그리고 실행할때 bitstream의 데이터를 다시 Decoder로 해석해서 동영상으로 볼 수 있다.

그런데 이미지 전체를 저장하는 것은 너무 용량비효율적이다.
그래서 전 프레임의 이미지의 차이를 구한다.
이 차이의 이미지는 이미지 전체보다는 데이터 값이 매우 작다.
이를 계속 더하며 이후의 이미지를 만들어 내면 위의 방식보다 용량을 효율적으로 가져갈 수 있다.
사실 Difference를 인코딩 하는 것도 용량이 많이든다.
그래서 모션벡터를 통해 예측 이미지를 만들고, 결과이미지와 예측 이미지의 차이(오차)를 구한다.
이 잔차이미지는 Difference보다 0인 값들이 많아 용량을 효율적으로 가져갈 수 있다.

하지만 아까 배운 ME, MC를 적용해보자.
MC를 통해 예측이미지 를 구한다.
원본이미지 와 예측이미지를 뺀 잔차를 구한다.
동영상 파일에서 다시 동영상으로 복구하는 과정에서는 MC를 통해 다시 예측이미지를 만들고,
전달받은 잔차 값을 더해 결과이미지를 만들면 된다.