CODIFICACÃO DE VÍDEO

O olho humano possui a propriedade de reter imagens por alguns milisegundos após as mesmas desaparecerem. Assim, se uma sequência de imagens for apresentada ao olho acima de uma determinada taxa de apresentação, ela não será percebida como uma sequência de imagens e sim como uma imagem contínua, ou seja, como vídeo. Logo, podemos dizer que um sinal de vídeo é composto de uma sequência de imagens (denominadas de quadros) apresentada a uma taxa constante (por exemplo, 30 quadros por segundo).

Na codificação digital, uma imagem é composta de elementos de imagens denominados de pixels, sendo cada pixel representado por um determinado número de bits. O número de pixels em um quadro define a resolução da imagem (quanto mais pixels maior a resolução). Por exemplo, o padrão MPEG2 (Motion Picture Experts Group) define uma resolução de alta definição com 1920 x 1080 pixels.

A Figura 5.20 ilustra a composição de um sinal de vídeo como uma sequência de quadros, cada um composto por pixels. Dentro de um quadro temos o que denominamos de amostras espaciais, enquanto os quadros sucessivos compõem as amostras temporais.

Figura 5.20. Amostras espaciais, temporais, quadro e pixel.

O processo de codificação utiliza um determinado número de bits para representar cada pixel. Com 1 bit por pixel, por exemplo, poderíamos diferenciar apenas entre as cores branca e preta. Com 8 bits por pixel, poderíamos representar 256 níveis de cinza. Para representar as cores, poderíamos utilizar 24 bits por pixel. No entanto, a codificação desta forma resultaria em taxas de transmissão proibitivas. Por exemplo, com 30 quadros por segundo, cada quadro com 1920 x 1080 pixels e cada pixel com 24 bits, teríamos uma taxa de transmissão de 30 x 1920 x 1080 x 24 = 1.49 Gbps.

Para reduzir as taxas de transmissão, os codificadores de vídeo utilizam a redundância espacial e a redundância temporal presentes em um sinal de vídeo. A redundância espacial diz respeito à possível redundância entre pixels de um mesmo quadro (redundância entre as amostras espaciais na Figura 5.20), enquanto a redundância temporal diz respeito à possível semelhança entre quadros sucessivos (redundância entre as amostras temporais na Figura 5.20). O grau de redundância depende do tipo de imagem. Uma imagem que retrate uma paisagem, por exemplo, possui muita redundância temporal, pois a paisagem praticamente não muda com o tempo (mantendo-se o enquadramento da câmera, obviamente), enquanto a largada de uma corrida de Fórmula 1 possui pouca redundância temporal, pois a imagem é muito dinâmica. Já a imagem de uma parede branca possui muita redundância espacial, pois há muita semelhança entre os diversos pixels que compõem um quadro, bem como muita redundância temporal, pois praticamente não há mudança entre quadros sucessivos.

A Figura 5.21 ilustra o diagrama em blocos de um codificador de vídeo genérico. O codificador é composto de três blocos básicos: um modelo temporal, um modelo espacial e um codificador de entropia. O modelo temporal tem por objetivo reduzir a redundância temporal, usualmente fazendo uma predição do quadro corrente e subtraindo esta predição do quadro corrente real (uma predição simples seria utilizar o quadro anterior como predição para o quadro corrente), gerando um quadro residual, que será entregue ao modelo espacial. A eficiência do modelo será maior se o mesmo utilizar alguma forma de predição de movimento das imagens entre quadros sucessivos. Logo, o modelo temporal também tem por saída um conjunto de vetores de movimento que descrevem como o movimento foi compensado. O modelo espacial tem por objetivo reduzir a redundância espacial, tipicamente aplicando uma transformada nas amostras residuais e quantizando o resultado, gerando um conjunto de coeficientes (este processo será melhor descrito na Seção 5.3.2). Por fim os vetores de movimento e os coeficientes do modelo espacial são codificados em um codificador de entropia, que elimina a redundância estatística presente nestes dados. [RICHARDSON,2003]

Figura 5.21 – Diagrama em blocos de um codificador de vídeo básico genérico.

Os principais codificadores de vídeo utilizados hoje são o MPEG2 e o MPEG4. A análise completa destes codificadores está fora do escopo deste texto. No entanto, vamos apresentar nas sub-seções seguintes os principais conceitos utilizados nos mesmos. Para o leitor interessado, recomendamos a referência [RICHARDSON,2003].

5.3.1. Conceitos Básicos sobre Sinais de Vídeo

Antes de iniciarmos a descrição dos princípios de operação do MPEG vamos apresentar alguns conceitos básicos sobre sinais de vídeo.

Como sabemos, qualquer cor pode ser gerada pela combinação das três cores denominadas primárias: vermelho, verde e azul, dando origem à representação que denominamos RGB (Red, Green, Blue ou vermelho, verde e azul). O processo de digitalização, no entanto, é realizado a partir de sinais que são a composição dos sinais R, G e B, denominados de sinais compostos. Os sinais compostos são combinações lineares dos sinais RGB, da forma: [RICHARDSON,2003]

(5.13)

O sinal composto Y é denominado de luminância e os sinais Cb, Cr e Cg de sinais de crominância. As constantes kr, kge kb variam de um sistema para outro. Por exemplo, a recomendação ITU-R BT601-7 [ITU-R,2011] estabelece os valores kr = 0.299; kb = 0.114 e kg= 1 – krkb = 0.587.

De fato, o sinal de crominância Cg não precisa ser armazenado ou transmitido, pois pode ser obtido a partir dos outros sinais. Então, o sinal de vídeo armazenado ou transmitido é composto de um sinal de luminância, Y, e dois sinais de crominância: Cb e Cr.

A Tabela 5.1 mostra, a título de ilustração, os valores dos sinais Y, Cr e Cb, como definido na Equação (5.23),em função da cor do pixel, para as constantes kr e kb definidas em [ITU-R,2011].

Cor

R

G

B

Y

Cr

Cb

Branco

1

1

1

1

0

0

Preto

0

0

0

0

0

0

Vermelho

1

0

0

0.299

0.701

-0.299

Verde

0

1

0

0.587

-0.587

-0.587

Azul

0

0

1

0.114

-0.114

0.886

Amarelo

1

1

0

0.886

0.114

-0.886

Ciano

0

1

1

0.701

-0.701

0.299

Magenta

1

0

1

0.413

0.587

0.587

Tabela 5.1 – Exemplo de valores de R, G, B, Y, Cr e Cb para algumas cores.

O máximo sinal de luminância corresponde ao branco, em que R = G = B = 1, resultando em Y = 1, enquanto a luminância mínima corresponde ao preto (R = G = B = 0), em que Y = 0.

O máximo valor de Cr corresponde ao vermelho (R = 1, G = B = 0), com Cr = 1 – kr, enquanto seu mínimo valor corresponde à cor ciano (R = 0, G = B = 1), com Cr = – (1 – kr). Logo, o valor de Cr excursiona entre –(1 – kr) e +(1 – kr). Para fazer com que a excursão total seja igual a 1 (entre -0,5 e +0,5), basta multiplicar o valor de Cr por 0,5 e dividir por (1 – kr).

Já o valor máximo de Cb corresponde ao azul (B = 1, G = R = 0), com Cb = 1 – kb, enquanto seu mínimo valor corresponde à cor amarela (B = 0, G = R = 1), com Cb = – (1 – kb). Logo, Cb excursiona entre –(1 – kb) e +(1 – kb). Para tornar a excursão total igual a 1 (entre -0,5 e +0,5), basta multiplicar o valor de Cb por 0,5 e dividir por (1 – kb).

Após as normalizações acima, os sinais compostos assumem a forma: [RICHARDSON,2003]

(5.14)

Podemos verificar na Tabela 5.1 que o sinal de luminância varia de 0 a 1, enquanto o sinal de crominância Cr varia de -0,701 a +0,701 e o sinal de crominância Cb varia de -0.886 a +0.886. Portanto, neste caso, para que Cr e Cb excursionem entre -0,5 e +0,5, deve-se dividir Cr por 1,402 e Cb por 1,772. Ou seja, deve-se aplicar as normalizações apresentadas na Equação (5.14).

Por fim, no processo de quantização dos sinais Y, Cr e Cb, novas alterações podem surgir na Equação (5.14). Por exemplo, para uma quantização com 8 bits (256 níveis de quantização), a recomendação BT-601-7 estabelece que o sinal de luminância deve ocupar apenas 220 níveis de quantização e que a luminância correspondente ao preto deve corresponder ao nível de quantização 16. Para os sinais de crominância, a mesma recomendação estabelece que eles devem ocupar apenas 225 níveis de quantização e que à crominância de magnitude zero deve corresponder o nível de quantização 128. Estas definições alteram a Equação (5.14) para: [ITU-R,2011]

(5.15)

Há ainda várias outras formas de transformar os sinais RGB nos sinais compostos Y, Cb e Cr, mas para os objetivos deste texto basta sabermos que Y, Cb e Cr são transformações lineares dos sinais RGB.

O sistema visual humano é menos sensível aos sinais de crominância que ao sinal de luminância. Esta característica faz com que a representação YCbCr ofereça uma importante vantagem sobre a representação RGB: a possibilidade de representar os sinais Cb e Cr com menos resolução que o sinal Y , reduzindo a quantidade de dados requerida para representar os sinais de crominância, sem perda significativa de qualidade visual [Livro]. Por exemplo, o padrão MPEG-4 suporta três formas de amostragem dos sinais Y, Cb e Cr, denominadas de 4:4:4, 4:2:2 e 4:2:0. Na amostragem 4:4:4, para cada 4 amostras de luminância há 4 amostras de cada sinal de crominância e, portanto, se preserva totalmente a fidelidade dos sinais de crominância. Na amostragem 4:2:2, na direção horizontal, há duas amostras de Cb e Cr para cada 4 amostras do sinal Y, ou seja, a resolução horizontal de Cb e Cr é a metade da resolução horizontal de Y. Na amostragem 4:2:0, cada sinal de crominância tem ¼ do número de amostras do sinal de luminância, com metade da resolução horizontal e metade da resolução vertical. A codificação 4:2:0 é largamente utilizada em aplicações comerciais, como vídeo conferência, TV digital e DVD (Digital Versatile Disk). O número de bits utilizados para representar um quadro com amostragem 4:2:0 é exatamente a metade do número utilizado para amostragem 4:4:4. [RICHARDSON,2003]

5.3.2. Discret Cosine Transform (DCT)

O processo de codificação de vídeo utilizado no MPEG utiliza uma técnica de transformação denominada Transformada Discreta de Coseno (DCT – Discret Cosine Transform). A DCT é realizada sobre um bloco de N x N pixels e é realizada pela operação:

(5.16)

onde X é a matriz de amostras, Y é a matriz dos coeficientes da DCT, A é uma matriz de transformação N x N e ATé a matriz transposta de A, obtida trocando-se em A as linhas pelas colunas e vice versa. Os elementos de A são dados por: [RICHARDSON,2003]

(5.17)

Exemplo 5.5 [RICHARDSON,2003]: A matriz, X, abaixo, representa os valores das amostras de luminância de um bloco de 4 x 4 pixels de um sinal de vídeo. Calcule a DCT de X.

j = 0

1

2

3

i = 0

5

11

8

10

1

9

8

4

12

2

1

10

11

4

3

19

6

15

7

Solução:

Para encontrar Y, precisamos primeiro encontrar a matriz de transformação, A. Utilizando a Equação (5.17), temos:

ou

Para encontrar Y devemos primeiro fazer Y’ = AX, ou seja:

O produto entre as duas matrizes é feito multiplicando cada linha de A por cada coluna de X. Por exemplo:

Y’01 = (0,5 x 5) + (0,5 x 9) + (0,5 x 1) + (0,5 x 19) = 17

Y’01 = (0,5 x 11) + (0,5 x 8) + (0,5 x 10) + (0,5 x 6) = 17,5

O resultado final é:

Finalmente, a matriz dos coeficientes da DCT é obtida multiplicando Y’ por AT, ou seja:

resultando em:

*****

Semelhante à Transformada de Fourier, uma operação de transformação inversa retorna o sinal para o domínio do tempo. A Transformada Inversa Discreta de Coseno (IDCT), neste caso, é calculada por:

(5.18)

É importante notar que a DCT em si não resulta em compressão, pois em geral são necessários mais bits para representar os coeficientes da DCT do que para representar o valor original das amostras. O processo de compressão é, de fato, resultante da eliminação dos coeficientes da DCT que são menos relevantes para a recomposição do sinal original. Para entender melhor esta abordagem, vamos tomar o resultado do Exemplo 5.5 e calcular a transformada inversa em diversas situações.

Inicialmente, vamos calcular a IDCT mantendo apenas o termo mais significativo da matriz de coeficientes e fazendo os demais iguais a zero. A matriz resultante possui todos os termos com um único valor, 8,75, a média dos valores originais dos pixels [livro]. O resultado é apresentado na matriz X1,a seguir:

Tomando agora a matriz de coeficientes com os dois termos mais significativos, temos:

Finalmente, tomando a matriz de coeficientes com os cinco termos mais significativos temos:

Comparando X1, X2 e X3, observamos que o resultado da transformada inversa se aproxima do resultado original à medida que aumentamos o número de termos na matriz de coeficientes da DCT. Isto mostra que é possível construir uma versão aproximada da matriz X a partir de um subconjunto dos coeficientes da DCT da matriz original. Assim, se removermos os coeficientes com magnitude menos significativas, por exemplo, por quantização da matriz de coeficientes da DCT, podemos representar os dados com um número reduzido de coeficientes e, consequentemente, com um número reduzido de bits, ao preço de uma perda de qualidade. Observe que a IDCT realizada com a matriz de coeficientes completa retorna, praticamente, a matriz X original (faça esta operação a título de exercício).

Na discussão acima consideramos, por simplicidade, a DCT realizada sobre um bloco de 4 x 4 pixels. Em geral a DCT é realizada sobre um bloco de 8 x 8 pixels. O procedimento é exatamente o mesmo descrito acima, apenas trabalhando com matrizes de maior dimensão.

Para um sinal de vídeo real os coeficientes da DCT tendem a tornarem-se insignificantes à medida que nos afastamos, tanto verticalmente quanto horizontalmente, da posição (0,0) (posição correspondente à 1ª linha e 1ª coluna da matriz de coeficientes), que representa o nível DC do sinal.

5.3.3. Quantização

Um quantizador mapeia o sinal original, que pode assumir um conjunto X de valores, para um sinal quantizado, que pode assumir um conjunto Y, menor, de valores. A redução nos valores que o sinal pode assumir permite que o mesmo seja representado por uma quantidade menor de bits.

Os quantizadores podem ser divididos em escalares e vetoriais. Um quantizador escalar mapeia uma amostra do sinal de entrada para um valor do sinal quantizado, enquanto um quantizador vetorial mapeia um grupo de amostras de entrada (um vetor) para um grupo de valores quantizados.

Um quantizador escalar uniforme pode ser representado, de forma geral, pela equação:

(x)

na qual  representa o passo de quantização, X é o sinal na entrada do quantizador e a função round representa pegar o inteiro mais próximo do argumento da função.

Nos codificadores de vídeo a matriz de coeficientes da DCT passa por um processo de quantização linear. O objetivo é mapear os coeficientes com valores menos significativos para zero, permitindo o uso de técnicas de codificação que resultem na redução do número de bits necessários para transmitir os coeficientes da DCT. Ou seja, espera-se que a matriz de coeficientes quantizadas seja uma matriz esparsa, com poucos coeficientes não nulos.

No decodificador, o sinal quantizado passa por um processo inverso, em que se busca recuperar os valores originais dos coeficientes, com exceção dos coeficientes transmitidos como zero. No entanto, o processo de quantização não é reversível e os coeficientes recuperados não possuem os mesmos valores dos coeficientes originais.

Em alguns codificadores de imagem, como no padrão JPEG, o valor de  é especificado em uma matriz, com um valor definido para cada coeficiente da DCT. Em outros casos, o valor de  é fixo para todos os coeficientes da DCT, mas pode variar, dentro de uma faixa especificada, de um bloco de pixels para outro.

Após a quantização, com o objetivo de agrupar os elementos não nulos da matriz, os coeficientes quantizados são reordenados. O processo de reordenação leva em conta a característica, descrita anteriormente, de que os valores dos coeficientes tornam-se insignificantes à medida que nos afastamos da posição (0,0). Uma forma de reordenação é denominada de varredura zig-zag, e é ilustrada na Figura 5.22. [RICHARDSON,2003]

Figura 5.22 – Varredura zig-zag para reordenar os coeficientes DCT quantizados.

Após a reordenação os coeficientes podem ser codificados utilizando a técnica denominada run-level, em que cada coeficiente não nulo é representado por um par (run,level), em que run representa o número de coeficientes nulos que precedem o coeficiente não nulo e level representa o valor do coeficiente não nulo. Por exemplo, a sequência 16,0,5,7,0,0,0,0,0,-7,3,0,0,0,0,8.... seria codificada como (0,16), (1,5), (0,7), (5,-7), (0,3) e (4,8)....

Como a matriz de coeficientes reordenada, normalmente, termina com muitos coeficientes nulos em sequência, é importante criar uma forma de identificar o último elemento não nulo da matriz. Uma forma de fazer isto é acrescentar mais um elemento ao par (run,level), com o objetivo de sinalizar que aquele elemento não nulo é o último da matriz, dando origem à representação (run,level,last), em que a posição last é feita igual a 1 para o último elemento não-nulo da matriz. Por exemplo, se na sequência do parágrafo anterior o coeficiente 8 é seguido apenas de coeficientes nulos (ou seja, ele é o último não nulo), a codificação resultante seria: (0,16,0), (1,5,0), (0,7,0), (5,-7,0), (0,3,0) e (4,8,1).

5.3.4. Modelo Temporal

O modelo temporal tem por objetivo reduzir a redundância temporal do sinal. O processo envolve formar uma predição do quadro e subtrair esta predição do quadro corrente, formando um quadro residual. Quanto mais eficiente for o modelo temporal, menor será a energia contida no quadro residual. A predição do quadro é feita com base em um ou mais quadros de referência. Na sua forma mais simples, o quadro anterior é utilizado como predição para o quadro corrente. Ou seja, o quadro (n – 1) é utilizado como predição para o quadro n e o quadro residual é utilizado subtraindo o quadro (n – 1) do quadro n.

Para melhorar a eficiência do processo de predição utilizam-se algoritmos para estimação e compensação de movimento o quadro (ou quadros) de referência e o quadro corrente.

Uma abordagem bastante utilizada para compensação de movimento é a denominada compensação de movimento baseada em bloco, na qual realiza-se a operação em seções retangulares de M x N amostras, denominadas blocos, do quadro corrente. O procedimento, ilustrado na Figura 5.23, consiste basicamente dos seguintes passos: [RICHARDSON,2003]

  1. Para fazer a estimação de movimento o bloco M x N do quadro corrente é comparado com todas (ou algumas) as possíveis regiões M x N de uma determinada área de busca (usualmente uma área centrada na posição atual do bloco) de um quadro de referência1 (que já tenha sido codificado e transmitido). O objetivo é encontrar o melhor casamento entre o bloco corrente e a região M x N do quadro de referência. Um critério para definir o melhor casamento é a energia residual obtida da subtração do bloco corrente da região M x N candidata; a região M x N que minimiza a energia residual é escolhida como a região de melhor casamento.

  2. A região M x N escolhida no passo 1 é utilizada como preditora para o bloco M x N corrente. Assim, a região é subtraída do bloco corrente para gerar um bloco residual (que será entregue ao modelo espacial na Figura 5.21). Este processo é chamado de compensação de movimento.

  3. O bloco residual é codificado e transmitido, juntamente com uma informação que identifica a diferença de posição, denominada vetor de movimento, entre o bloco corrente e a região M x N escolhida no passo 1.

O decodificador utiliza o vetor de movimento para recriar a região de predição, decodifica o bloco residual e adiciona o mesmo à região de predição para gerar a versão decodificada do bloco M x N original.

Figura 5.23 – Ilustração do processo de estimação e compensação de movimento.

Nos principais codificadores de vídeo este processo é realizado em uma região composta de 16 x 16 pixels, denominada de macrobloco. O tamanho da região influi na quantidade de energia do quadro residual, com menos energia para menores regiões (o que permite maior redução na redundância). No entanto, a diminuição do tamanho da região resulta em mais processamento e, consequentemente, maior complexidade, além de resultar em um maior número de vetores de movimento. Alguns codificadores, como o H.264, utilizam tamanhos de bloco adaptativos às características do vídeo, resultando em um melhor desempenho do processo. [RICHARDSON,2003]

Exercício: A matriz X, abaixo, representa os valores das amostras de luminância de um sinal de vídeo. Calcule os coeficientes da DCT de X. Reescreva a matriz dos coeficientes da DCT de X para as seguintes situações: mantendo apenas o coeficiente mais significativo e fazendo os demais iguais a zero, mantendo os dois mais significativos e fazendo os demais iguais a zero, mantendo os três mais significativos e fazendo os demais iguais a zero e mantendo os cinco mais significativos e fazendo os demais iguais a zero. Para cada caso, faça a transformada inversa para recuperar X e compare a matriz X original com a matriz recuperada.

1 É interessante observar que o quadro de referência pode ser anterior ou posterior, na ordem de exibição, ao quadro corrente, importando apenas que ele já tenha sido codificado.

Comentários