ak codificacao dct2

19
Notas de Aula – Codificação de Fonte usando DCT – Aldebaro Klautau – UFPA - Agosto, 2008. Objetivo da Codificação de Fonte: reduzir a quantidade de bits necessária para representar a fonte de informação, sem que haja perda na qualidade desta informação. Extrair a redundância na informação para economizar bits. Codificação por Transformada Usando DCT O primeiro passo, na maioria dos sistemas de compressão de imagens e vídeo, é identificar a presença de redundância espacial (semelhança entre um pixel e os pixels em sua vizinhança) em cada imagem, campo ou frame do vídeo. Isto é feito geralmente, aplicando-se a Transformada Discreta de Cosenos (DCT) ao longo da imagem. A DCT é um processo sem perda (lossless) e reversível Matematicamente, corresponde a uma simples multiplicação por uma matriz, que tem a propriedade de converter dados de amplitude espacial (os valores dos pixels) em coeficientes representando freqüências espaciais. Ao invés de ser feita a transformação da imagem como um todo, com uma única multiplicação por matriz (o que exigiria uma matriz imensa !), o cálculo da DCT é feito geralmente para cada bloco de 8 por 8 amostras da imagem. Quando a imagem é preto e branco (possui apenas a componente de luminância), a DCT é feita nos valores de luminância. Para imagens coloridas, é calculada a DCT dos blocos correspondentes às amostras de crominância, dos valores RGB, ou de qualquer outra representação adotada para a imagem. A transformada DCT é simples de entender. Para cada dimensão de blocos a ser usada (a mais usada é de 8 x 8 pixels), existe uma matriz de DCT fixa. Realizar a transformação implica simplesmente em em recolher 64 pixels da imagem, fazer o cálculo da DCT para estes valores, obtendo-se novos 64 valores, que são chamados coeficientes da DCT. Este processo é repetido para todos os blocos da imagem. Pode-se entender melhor a transformação DCT com um exemplo. A figura 3.1a mostra uma imagem (chamada Lenna) preto e branco com 512 x 512 pixels. Cada pixel da imagem é representado por 8 bits, onde o valor 0 corresponde ao preto, o valor 255 corresponde ao branco e os valores intermediários fornecem tons de cinza. Essa é uma típica imagem preto e branco. Supõe-se que 1

Upload: andrea-lopez

Post on 21-Jan-2016

22 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Ak Codificacao Dct2

Notas de Aula – Codificação de Fonte usando DCT – Aldebaro Klautau – UFPA - Agosto, 2008.

Objetivo da Codificação de Fonte: reduzir a quantidade de bits necessária para representar a fonte de informação, sem que haja perda na qualidade desta informação. Extrair a redundância na informação para economizar bits.

Codificação por Transformada Usando DCT

O primeiro passo, na maioria dos sistemas de compressão de imagens e vídeo, é identificar a presença de redundância espacial (semelhança entre um pixel e os pixels em sua vizinhança) em cada imagem, campo ou frame do vídeo. Isto é feito geralmente, aplicando-se a Transformada Discreta de Cosenos (DCT) ao longo da imagem. A DCT é um processo sem perda (lossless) e reversível Matematicamente, corresponde a uma simples multiplicação por uma matriz, que tem a propriedade de converter dados de amplitude espacial (os valores dos pixels) em coeficientes representando freqüências espaciais. Ao invés de ser feita a transformação da imagem como um todo, com uma única multiplicação por matriz (o que exigiria uma matriz imensa !), o cálculo da DCT é feito geralmente para cada bloco de 8 por 8 amostras da imagem. Quando a imagem é preto e branco (possui apenas a componente de luminância), a DCT é feita nos valores de luminância. Para imagens coloridas, é calculada a DCT dos blocos correspondentes às amostras de crominância, dos valores RGB, ou de qualquer outra representação adotada para a imagem.

A transformada DCT é simples de entender. Para cada dimensão de blocos a ser usada (a mais usada é de 8 x 8 pixels), existe uma matriz de DCT fixa. Realizar a transformação implica simplesmente em em recolher 64 pixels da imagem, fazer o cálculo da DCT para estes valores, obtendo-se novos 64 valores, que são chamados coeficientes da DCT. Este processo é repetido para todos os blocos da imagem.

Pode-se entender melhor a transformação DCT com um exemplo. A figura 3.1a mostra uma imagem (chamada Lenna) preto e branco com 512 x 512 pixels. Cada pixel da imagem é representado por 8 bits, onde o valor 0 corresponde ao preto, o valor 255 corresponde ao branco e os valores intermediários fornecem tons de cinza. Essa é uma típica imagem preto e branco. Supõe-se que se calcula a DCT em blocos de 8 x 8 pixels, como usual. No exemplo, o bloco em questão localiza-se na região do olho da Lenna e está identificado pelo quadrado superposto à figura. Retira-se o bloco de 8 x 8 pixels (mostrado graficamente na figura 3.1c), cujos valores dos pixels são mostrados na figura 3.1b. Observa que o primeiro pixel deste bloco tem o valor 172, que corresponde a um tom de cinza. É aplicada a DCT aos valores mostrados na figura 3.1b, obtendo-se assim os coeficientes da DCT, mostrados numericamente na figura 3.1d. A figura 3.1e é uma visualização gráfica dos coeficientes da DCT deste bloco. Pode-se observar que os coeficientes possuem valores positivos e negativos, e que o primeiro coeficiente (canto superior esquerdo) possui o maior valor, enquanto os últimos coeficientes (próximos ao canto inferior direito) possuem valores pequenos. Estes valores pequenos normalmente são desprezados (o que corresponde a substituí-los por zero), sem que a imagem sofra grandes deformações. A possibilidade de desprezar os coeficientes menos significativos sem perda da qualidade da imagem é justamente a razão principal de se usar a DCT na codificação de imagens (e vídeo), pois permite grande economia de bits.

1

Page 2: Ak Codificacao Dct2

(a)

172 179 188 191 196 200 204 174188 187 190 193 199 201 178 101189 189 196 197 199 183 117 84186 192 197 199 189 130 85 85198 197 199 192 149 100 100 95195 195 193 158 108 98 96 98195 189 171 111 111 108 104 96192 177 124 110 113 113 108 100

(b)

(c)

1256,4 228,6 -50,0 17,7 -15,6 2 -2,7 5,8154,8 -80 -93,2 27 -6,5 12,3 2 0,79,7 -92,3 57,3 39,3 -29 3,4 6,3 1,516,3 -12,7 35,4 -47,6 -6,9 17,8 -2,1 4,42,1 -18,2 4 -14,4 27,6 -5,7 -12,9 -1,4-3 -3,9 0,6 -9,3 2,5 -17,8 12,3 6,1

-1,2 -5,4 1,9 -7,2 6,2 -1,5 6,2 -11,87,1 -2,9 3,8 0,9 -1,4 0 2 2,9

(c)

(e)

Figura 3.1: (a) Imagem de 512x512 pixels; (b) Valores dos pixels; (c) Visualização do bloco 8x8 com os pixels da imagem; (d) Valores dos coeficientes DCT do bloco; (e) Visualização da DCT do bloco.

Separação da imagem dentro dos blocos:Ao se usar DCT em codificação de imagens, não se costuma calcular uma única DCT para

a imagem toda, pois isso exigiria um número muito grande de cálculos. A alternativa adotada é segmentar a imagem em blocos e calcular a DCT para cada bloco. As seguintes considerações são importantes:

Um tamanho de bloco grande conduz à maior eficiência de codificação, mas requer maior poder computacional.

Tipicamente são usados blocos de 8x8 ou 16x16 pixels. Bloco de 8x8 é um bom compromisso (tradeoff) entre a eficiência de compressão e a complexidade computacional.

Uma melhor eficiência de compressão pode ser alcançada pelo uso de blocos de diferentes dimensões, entretanto isto aumenta a complexidade computacional.

2

512 pixels

512 pixels

Page 3: Ak Codificacao Dct2

A propriedade importante da DCT é que ela transforma os pixels de um domínio onde “todos são iguais”, para um novo domínio, onde há hierarquia. O primeiro coeficiente da DCT ( nível DC ) é mais importante que o 64º ( coeficiente AC de mais alta frequência ). Ver figura 2.6 que mostra a distribuição de frequência em uma DCT de duas dimensões de 16 x 16 pixels.

Figura 2.6 Distribuição de frequência

Os coeficientes da DCT-2D podem ser escaneados em uma maneira predeterminada. Um modelo padrão chamado de scan zig-zag mostrado na figura 2.7 depende da distribuição de frequências.

Figura 2.7 Scan Zig-Zag

Exemplo 5.3 – Construção da imagem utilizando as componentes de frequências.

São mostradas abaixo quatro situações distintas, onde se pode notar sensíveis mudanças em relação à qualidade de imagem ( a imagem original considerada para este exemplo é uma partição da figura lena512 ). Em todos os casos foram realizadas DCT’s em

3

Page 4: Ak Codificacao Dct2

blocos 8x8 pixels. No primeiro caso, figura 2.8 (a), apenas a componente DC da imagem foi utilizada e os outros 63 coeficientes foram considerados iguais a zero. No segundo caso, figura 2.8 (b), considerou-se a componente DC mais dois componentes AC, melhorando a definição da imagem, até que na última figura ( figura 2.8 (d) ) são usados todos os coeficientes. Observa-se com isso a cópia fiel em relação à figura original, não havendo perdas de informações.

(a) somente componente DC (b) componente DC +2 AC mais baixos

(c) componente DC + 9 AC mais baixos (d) todos os 64 coeficientes

Figura 2.8 Exemplo de DCT's utilizando coeficientes pre-determinados

Os coeficientes representam as componentes de frequência espacial que compõem o bloco original. Cada coeficiente pode ser visto como um peso aplicado a uma função base apropriada.

Quando se está navegando na Internet e faz-se o download de uma imagem no formato JPEG (extensão .JPG), que está codificada na forma progressiva do JPEG, a imagem vai se tornando cada vez mais nítida. Isto ocorre pois são enviados primeiro os coeficientes DC das DCT's e depois os coeficientes AC, gradativamente, desde os AC de mais baixa frequência até os de mais alta.

4

Page 5: Ak Codificacao Dct2

Demo do Matlab (execute dctdemo.m no Matlab):

Figura – Usando-se apenas um único coeficiente DCT pode-se ver que a reconstrução não é aceitável. O erro quadrático médio (MSE) foi de 0.00603.

5

DCT coeffic ientsOriginal Saturn Im age

Reconstructed Im age Error Im age

Page 6: Ak Codificacao Dct2

DCT coeffic ientsOriginal Saturn Im age

Reconstructed Im age Error Im age

Figura – Usando-se três coeficientes DCT pode-se ver que a reconstrução se torna bem melhor. O erro quadrático médio (MSE) foi de 0.00237.

6

Page 7: Ak Codificacao Dct2

DCT coeffic ientsOriginal Saturn Im age

Reconstructed Im age Error Im age

Figura – Usando-se 32 coeficientes DCT, metade dos 64 originais, pode-se ver que a reconstrução é muito boa. O erro quadrático médio (MSE) foi de 0.000179.

7

Page 8: Ak Codificacao Dct2

Apêndice 1 – Calculando a DCT para Codificação de Imagem por Transformada

Na codificação de imagem por transformada, uma imagem é transformada em um domínio significativamente diferente do domínio da imagem, e os coeficientes da transformada são então codificados. Nas aplicações de baixa taxa de bit (abaixo de 1 ou 2 bits/pixel) como vídeo-conferência, as técnicas de codificação por transformada usando quantização escalar funciona melhor que a codificação por forma de onda utilizando o mesmo tipo de quantização. Porém, eles são computacionalmente mais caros.

A codificação por transformada tenta reduzir a correlação que existe entre as intensidades de pixel de imagem mais completamente que a codificação por forma de onda. Quando a correlação é reduzida, a informação redundante não tem que ser codificada repetidamente. Esta técnica também explora a observação que para imagens típicas uma grande quantidade de energia está concentrada em uma pequena fração dos coeficientes da transformada. Isto é chamado de propriedade de compactação de energia. Devido a esta propriedade, é possível codificar somente uma fração dos coeficientes sem afetar seriamente a imagem. Isto permite também codificar imagens em taxas de bits menores que 1bit/pixel com um sacrifício relativamente pequeno na qualidade e clareza da imagem.

Um diagrama esquemático de um codificador de imagem por transformada é mostrada na figura 2.5. No transmissor, a imagem é transformada e os coeficientes da

transformada são quantizados. Os quantizados são então codificados. No receptor, as palavras-códgo são decodificadas e o resultado dos coeficientes quantizados

são transformados inversamente para obter a imagem reconstruída .

Figura 2.5 Codificador de Imagem por transformada

Em sistemas de codificação por transformada, pixels são agrupados dentro de blocos. Um bloco de pixel é transformado dentro de outro domínio para produzir um conjunto de coeficientes que então são codificados e transmitidos.

As transformadas utilizadas para codificação de imagem são transformações lineares que podem ser expressas como

Transformação Quantização

Atribuição de Palvras-código

21,nnf

21,kkT f 21,ˆ kkT fTransmissor

Transformada Inversa

Decodificador 21,ˆ nnf

Receptor

21,ˆ kkT f

Page 9: Ak Codificacao Dct2

onde é uma sequência de N1 x N2 pontos, são os coeficientes da transformada

com N1 x N2 pontos e e são chamados de função base. Das

equações das transformadas nota-se que é uma combinação linear das funções base e que os coeficientes da transformada são as amplitudes das funções base na combinação linear.

2.2.1 Transformada Discreta do Cosseno

A transformada discreta do cosseno (DCT) é a transformada mais largamente usada na classe dos sistemas de codificação de imagem.

A seguir ilustra-se como calcular a DCT. Pode-se entender este cálculo como sendo uma multiplicação por uma dada matriz (a matriz DCT), ou ainda o uso de uma dada fórmula (a fórmula da DCT). Ambas as maneiras são equivalentes. A discussão iniciará pelo uso da fórmula, depois discute-se a abordagem matricial, e depois será mostrada a equivalência entre as duas notações.

Ao invés de se iniciar a discussão pela transformação de um bloco de pixels, usar-se-á um vetor. Entendendo-se o caso unidimensional, fica bem mais fácil entender o bidimensional.

Par da Transformada Discreta do Cosseno

Por exemplo, supondo que se deseja calcular a DCT do vetor A=[3 –4 2 1]. Neste caso, N=4 e k=4 representando a coluna e a linha respectivamente, percebe-se que para uma matriz de ordem 4x4, por exemplo, a matriz DCT não muda, quer dizer, a matriz é sempre a mesma contanto que não mude a ordem. Verifica-se este fato a partir da equação , a expressão

é igual a “um” para a primeira linha k=0, assim t(k) depende apenas do valor

de c(k), sendo que para k=0, o valor c(0)=1/2 é constante e consequentemente o valor t(0) também se torna constante e o mesmo é feito para as outras linhas, sendo que o valor de c(k) muda dependendo do valor de N (coluna), como visto na equação 3.2. Assim, a matriz DCT de ordem 4x4 é dada por:

[ 0.5000 0.5000 0.5000 0.5000DCT4 = 0.6533 0.2706 -0.2706 -0.6533

0.5000 -0.5000 -0.5000 0.5000 0.2706 -0.6533 0.6533 -0.2706 ]

Page 10: Ak Codificacao Dct2

Exemplo 2.1 para DCT 1-D utilizando o Matlab:

Calcule a DCT do vetor A=[3 –4 2 1]

Caminho 1:» A=[3 -4 2 1]» Y=dct(A)

Y = 1.0000 -0.3170 3.0000 4.4609

Caminho 2:

» A=[3 -4 2 1]» funcaobase=dctmtx(4)

funcaobase =

0.5000 0.5000 0.5000 0.5000 0.6533 0.2706 -0.2706 -0.6533 0.5000 -0.5000 -0.5000 0.5000 0.2706 -0.6533 0.6533 -0.2706

» DCT=funcaobase*A'

DCT =

1.0000 -0.3170 3.0000 4.4609

4

Para calcular a DCT inversa no caminho 1 usa-se a função IDCT

» y=IDCT(Y)

y =

3.0000 -4.0000 2.0000 1.0000

E no caminho 2, multiplica-se a matriz funcaobase inversa pelo vetor DCT, que permite reconstruir o vetor A

» funcaobase'*DCT

ans =

3.0000 -4.0000 2.0000 1.0000

Page 11: Ak Codificacao Dct2

Ao se usar DCT em imagens, ou seja, DCT 2-D, não se costuma calcular uma única DCT para a imagem toda, pois isto exigiria um número muito grande de cálculos. A alternativa adotada é segmentar a imagem em blocos e calcular a DCT para cada bloco. Tipicamente usa-se blocos de 8x8.

Exemplo 5.2 para DCT 2-D no matlab:

Calcule a DCT de uma matriz 8x8 da figura lena512 mostrada no anexo

Caminho 1:

» load lena512» x=xx(11:18,11:18)

x = 157 157 159 154 158 154 155 158 158 158 156 155 157 158 155 159 160 157 156 153 156 171 156 155 154 158 156 155 154 160 159 155 151 160 157 156 156 155 155 159 158 159 155 156 154 171 157 155 153 155 158 157 155 157 153 156 159 158 154 157 155 156 155 153

» y=dct2(x,[8 8])

y = 1.0e+003 *

Columns 1 through 8

1.2535 -0.0006 0.0002 0.0050 -0.0065 -0.0043 0.0051 -0.0059 0.0026 -0.0011 0.0025 0.0002 0.0007 -0.0022 0.0015 0.0038 -0.0021 0.0045 0.0009 -0.0020 0.0061 0.0010 -0.0008 0.0041 0.0003 -0.0011 -0.0007 -0.0048 0.0005 -0.0020 -0.0004 0.0007 -0.0037 0.0020 0.0009 -0.0069 0.0023 0.0002 -0.0069 0.0045 -0.0013 -0.0010 -0.0019 -0.0002 -0.0020 0.0019 0.0021 0.0013 0.0047 0.0000 0.0004 0.0101 -0.0042 0.0010 0.0044 -0.0039 -0.0015 0.0002 -0.0013 -0.0036 0.0018 -0.0025 0.0009 0.0021

Caminho 2:

» funcaobase=dctmtx(8)

funcaobase =

Columns 1 through 8 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.3536 0.4904 0.4157 0.2778 0.0975 -0.0975 -0.2778 -0.4157 -0.4904 0.4619 0.1913 -0.1913 -0.4619 -0.4619 -0.1913 0.1913 0.4619 0.4157 -0.0975 -0.4904 -0.2778 0.2778 0.4904 0.0975 -0.4157 0.3536 -0.3536 -0.3536 0.3536 0.3536 -0.3536 -0.3536 0.3536 0.2778 -0.4904 0.0975 0.4157 -0.4157 -0.0975 0.4904 -0.2778 0.1913 -0.4619 0.4619 -0.1913 -0.1913 0.4619 -0.4619 0.1913

Page 12: Ak Codificacao Dct2

0.0975 -0.2778 0.4157 -0.4904 0.4904 -0.4157 0.2778 -0.0975

» DCT=funcaobase*x*funcaobase'

DCT =

1.0e+003 *

Columns 1 through 8 1.2535 -0.0006 0.0002 0.0050 -0.0065 -0.0043 0.0051 -0.0059 0.0026 -0.0011 0.0025 0.0002 0.0007 -0.0022 0.0015 0.0038 -0.0021 0.0045 0.0009 -0.0020 0.0061 0.0010 -0.0008 0.0041 0.0003 -0.0011 -0.0007 -0.0048 0.0005 -0.0020 -0.0004 0.0007 -0.0037 0.0020 0.0009 -0.0069 0.0022 0.0002 -0.0069 0.0045 -0.0013 -0.0010 -0.0019 -0.0002 -0.0020 0.0019 0.0021 0.0013 0.0047 0.0000 0.0004 0.0101 -0.0042 0.0010 0.0044 -0.0039 -0.0015 0.0002 -0.0013 -0.0036 0.0018 -0.0025 0.0009 0.0021

Verifica-se que pelos dois caminhos utilizados encontra-se a mesma matriz de DCT. O primeiro valor da matriz DCT é chamado de valor médio ou valor DC, os outros coeficientes são chamados de valores AC.

Page 13: Ak Codificacao Dct2

Apêndice 2 – Conceitos do JPEG, um ALGORITMO DE COMPRESSÃO DE IMAGEM

O principal obstáculo para muitas aplicações de imagens digitais, como por exemplo, na aquisição, armazenamento de imagem, impressão e exibição, é a grande quantidade de dados necessários para representar uma imagem diretamente. Uma versão digitalizada de uma simples imagem colorida em uma resolução normal de TV contém na ordem de um milhão de bytes. Então uma imagem necessita ser comprimida para armazenamento e transmissão. A taxa atual de compressão pode variar de 100:1 até 2:1 dependendo da aplicação e complexidade do codificador e decodificador.

Para aplicações de armazenamento ou transmissão nos canais limitados por largura de banda que são difundidas no mercado hoje, um método padrão de compressão de imagem é necessário para capacitar a operação entre diferentes equipamentos desenvolvido por diferentes fabricantes.

JPEG tem sido recentemente reconhecido como a mais popular e eficiente modelo de codificação para imagens paradas tanto monocromática como colorida. Em uma taxa de bit moderada ( menor que 1 bpp ), JPEG fornece uma solução satisfatória na maioria dos problemas práticos. Isto pode ser executado por um dos quatro principais modos de processamento: sequencial, progressivo, menor-perda e hierárquico.

5.1 Modo Sequencial baseado na DCT

O modo sequencial de operação baseado na DCT pode ser feito para um sistema de linha base e um sistema extended. Na figura 5.1 é ilustrado as 5 possíveis combinações do modo sequencial.

Sistema de Linha BaseA descrição do sistema de linha base será descrito em um exemplo. O diagrama de blocos

apresentado na figura 5.2 mostra todas as funções deste sistema. O codificação é baseado nos seguintes passos: Processo de DCT básico Quantização Método de DPCM para a compenente DC e scan zigzag para as componentes AC Código de Hufman

Figura 5.1 Possíveis combinações no modo de operação de sequencial DCT

Precisão de amostragem de 8 bits

Precisão de amostrage

m de 12 bits

Sistema de Linha base

Sistema Extented

Código de Huffman

Código Aritmético

Page 14: Ak Codificacao Dct2

Figura 5.2 JPEG – Codificação e decodificação do sistema linha base (Q: quantização ; DQ: quantização inversa).

Exemplo de codificação Baseline

Passo 1 – é selecionado uma matriz 8x8 da figura lena512 ( um bloco que está contido no chapéu )

Nota-se que não há muita variação dos números pois o bloco selecionado no chapéu não muita variação do tons branco e preto.

Passo 2 – Em seguida é feita a DCT-2D desta matriz

O valor do coeficiente DC,619, é oito vezes o valor médio da matriz original

Passo 3 – Neste passo, é feita a versão quantizada do bloco transformado utilizando a matriz de quantização luminância (tabela II em anexo), resultando em,

Existem agora poucos coeficientes não-nulos.

DCT-2D

(8 x 8)

Codificador de

comprimento variaável

IDCT-2D

(8 x 8) DQ

Q

DPCM

DPCM

Scan zigzag

Scan zigzag

DC

AC

AC

DC

Decodificador de comprimento

variaável

Imagem

original

Imagem

reconstruídal

Linha de

transmissão

codificador

decodificador

Off set

Page 15: Ak Codificacao Dct2

Passo 4: A matriz bidimensional é rearranjada para um vetor baseado no método padrão de scan zig-zag

onde EOB (final do bloco ) representam os números 0 (zero)

Passo 5: Utilizando o código de Huffman para fazer a atribuição de palavra-código tem-se:

onde o código 1010 representa EOB

Um total de 35 bits são necessários para transmitir este bloco. Além disso a taxa de bit na transmissão é 0,55 bit/pel quando usa-se uma precisão de amostragem de 8 bits para a imagem original e a razão de compressão é de 15:1.

A reconstrução do bloco obtido pela decodificação da atribuição de palavavra-código de comprimento variável, quantização inversa e a dct inversa é dado por:

O bloco de erro é dado por:

Tabela I - Matriz de quantização de Luminância Quv

16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 37 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 10172 92 95 98 112 100 103 99

Tabela II - Matriz de quantização Cromática Quv

17 18 24 47 99 99 99 9918 21 26 66 99 99 99 9924 26 56 99 99 99 99 9947 66 99 99 99 99 99 9999 99 99 99 99 99 99 9999 99 99 99 99 99 99 9999 99 99 99 99 99 99 9999 99 99 99 99 99 99 99