모션 벡터는 MPEG 예측 코딩에서 어떻게 작동합니까?


16

MPEG에는 이미지가 매크로 블록으로 분리되고 이러한 매크로 블록 각각에 대해 모션 벡터가 계산되는 프로세스가 있습니다. 그런 다음 이러한 벡터를 예측 오류와 함께 전송하여 비디오 시퀀스에서 다음 이미지를 재구성합니다.

이것이 어떻게 작동하는지 확실하게 파악하려고합니다. 각 매크로 블록에는 이와 관련된 모션 벡터가 있으며 (벡터가 [1,0] 인 all the pixels in this block move 1 in the x direction and 0 in the y direction for the next frame. 경우) 모든 모션 벡터가 올바르게 정렬되지 않으면 이미지의 영역이 고려되지 않은 영역 (예 : 그 매크로 블록이 처음이었습니다)?

예를 들어 다음과 같은 질문이 있습니다.

시간 t에서 다음 이미지를 고려하십시오.

7   7   7   7           
7   7   5   5        
7   5   5   8         
8   8   8   8           
9   9   9   9       
9   9   9   9

이 이미지는 2x2 매크로 블록으로 분리되었으며 다음 모션 벡터가 전송되어 다시 생성되었습니다.

(0,0)  (0,0)  (0,1)  (-1,1)  (0,0)  (0,0)

이전 시간 단계의 이미지 t-1은 다음과 같습니다.

7   7   7   7           
7   7   5   4        
7   7   7   7         
7   5   8   8           
8   9   8   9       
9   9   9   9   

전송 된 오류는 무엇입니까?

이 문제를 어떻게 해결 하시겠습니까?

답변:


5

혼란을 단순화하기 위해 두 가지 프로세스가 있습니다.

1. 모션 추정
2. 모션 보상

추정에 대해 이야기하기 전에 모션 보상에 대해 이야기해야합니다.

가 블록 B l o c k s t 에서 분할된다고 가정 해 봅시다.Imaget(x,y).Blockst[k](x,y)

모션 보상 작업이 생산하는 모든 영역에서의 I는 해요 g의 전자 t - 1 ( X , Y를 )Blockst[k](x,y)Imaget1(x,y) .

따라서 16x16 경계에 반드시 정렬 될 필요는없는 또 다른 블록은 가능한 최상의 일치 Blockst1[k](x+mx,y+my)

여기서, 를 모션 벡터라고합니다.mx,my

대상과 참조 사이의 오차를 다음과 같이 계산할 수 있습니다.

Errt[k](x,y)=Blockst[k](x,y)Blockst1[k](x+mx,y+my)

이제 엔코더는 기본적으로 (DCT 및 양자화)와 ( m x , m y ) [ k ]를 전송합니다.Errt[k](x,y)(mx,my)[k] 각 블록 ,.

따라서 인코더는 두 가지 작업을 수행합니다.

1. 모션 추정 E r r t [ k ] ( x , y ) 와 같이 모든 k에 대해 m x , m y [ k ]
의 프로세스 또는 추정mx,my[k]kErrt[k](x,y) 가 최소화 모션 추정이라고합니다.

에러 이미지의 2 세대 모션 보상 후의
시공 과정 에서 I t의 영상 화소 ( m의 X , m의 Y ) [ K ] 모션 보상이라고 . 오류 이미지가 전송됩니다.Blockst[k](x,y)It(mx,my)[k]

마지막으로, 디코더는 이미지의 최종 재구성을 위해 모이 톤 벡터 및 에러 이미지를 사용하여 자체적으로 모션 보상을 재실행 할 수있다.

이제 우리는 몇 가지 사항을 깨닫습니다.

  1. 최상의 모션 추정은 전송에 필요한 에너지를 최소화하는 데 도움이되므로 주어진 품질에 맞게 비트를 최적화합니다.

  2. 그러나 가 이상적이지 않거나 장면이 마지막 사진에 비해 크게 변경된 경우에도 E r r t [ k ] ( x , y ) 는 항상 수신기로 전송되므로 재구성 항상 완벽합니다 (양자화에 의해 생성 된 손실). 따라서, 차선의 모션 벡터가 있거나 중복성이 많지 않더라도 더 많은 비트가 있어도 재구성이 항상 완벽합니다!(mx,my)[k]Errt[k](x,y)

  3. Blockst[k](x,y)

  4. Blockst[k](mx,my)[k]Blockst[k+1]

  5. Energy(Errt[k](x,y))>Energy(Blockst[k](x,y))

이러한 경우 차이를 전송하는 것보다 예측없이 직접 블록을 전송하는 것이 좋습니다. 이것은 또한 INTRA 블록이라는 규정에 의해 인코더에서 가능하다.


3

아니요, 벡터가 알 수없는 프레임 (P 또는 B)에서 알려진 프레임 (I- 프레임)에 있기 때문에 구멍을 남기지 않습니다 . 그것은 이미지 변환을 계산하는 방법을 조금 생각 나게합니다-구멍을 피하기 위해 뒤로 변환을 사용합니다.


3

많은 표준 신호 처리 루틴의 경우와 마찬가지로 종이에 대해서는 매우 간단하고 실제로 약간 까다 롭습니다. 이미지를 6 개의 블록으로 분리했습니다(나는,제이)나는={0,1,2}제이={0,1}. 이 블록들 각각은(2나는,2제이)(우리는 위치를 식별하기 위해 각각의 왼쪽 상단을 고려합니다). 따라서 이제 6 개의 블록이

(0,0) (0,2)
(2,0) (2,2)
(4,0) (4,2)

계산 된 모션 벡터 미디엄(나는,제이) 각 블록마다

(0,0) (0,0)
(0,1) (-1,1)
(0,0) (0,0)

이제 결과 이미지를 계산하려면 먼저 모든 블록이 어디로 이동했는지 알아야합니다. 이를 위해 위의 좌표 행렬을 모션 행렬에 추가하면됩니다.'(나는,제이)=(나는,제이)+미디엄(나는,제이). 우리는 얻는다

(0,0) (0,2)
(2,1) (1,3)
(4,0) (4,2)

당신이 말한대로 "구멍"을 방지하기 위해, 우리는 단순히 우리가 가지고, 새로운 하나를 얻기 위해 주변의 원래 프레임의 블록을 이동하지 않는 원래의 참조로 하나를하고 주입 새로 계산 된 블록을. 이를 위해 먼저 원본 프레임의 사본을 만듭니다. 우리는 그때마다'(나는,제이) 해당 픽셀로 교체하십시오 (나는,제이).

참고 : "동작 중"블록이 겹치지 않도록 보호되지 않습니다 (두 블록이 겹치는 위치로 이동). 이를 처리하는 방법이 있지만이 응답의 범위를 벗어납니다. 지금은 블록으로 픽셀을 다시 써서 위치로 옮길 것이므로 이전에 블록이 이동 했더라도 덮어 쓰기됩니다.

이제 질문에 따라 순서대로 블록 단위로 이동하여 모든 것을 대체합니다. '(나는,제이) 상응하는 (나는,제이). followinf 추정 프레임을 얻습니다에프이자형

7 7 7 7
7 7 5 7
7 7 7 8
7 5 5 8
8 9 8 9
9 9 9 9

오류 이자형 추정 된 프레임 사이에서 발견됨 에프이자형 우리가 예측하려고하는 에프 에 의해 발견 이자형=에프에프이자형 우리는

0 0 0           
000-3        
000 -1         
0 3 0           
0 0 0       
0 0 0

나는 지금까지 신호 처리 커뮤니티가이 질문을하기에 가장 좋은 곳이라고 생각하지만, 이와 같은 주제와 관련이있는 기술은 자신 만의 공간이 필요합니다. Q & A 사이트 방송 및 미디어 기술에 대한 새로운 제안이 있습니다. 참여하십시오.
Dipan Mehta

@DipanMehta 매우 멋지다! =)
Phonon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.