Você está na página 1de 311

Ismael Seidel

Investigao de Padres de Subamostragem em


Mtrica de Similaridade de Imagem
Florianpolis, Santa Catarina
2011.2
Ismael Seidel
Investigao de Padres de Subamostragem em
Mtrica de Similaridade de Imagem
Trabalho de Concluso de Curso apresentado
como parte dos requisitos para obteno do grau
de Bacharel em Cincias da Computao.
Orientador:
Prof. Dr. Jos Lus Almada Gntzel
UNIVERSIDADE FEDERAL DE SANTA CATARINA
CENTRO TECNOLGICO
DEPARTAMENTO DE INFORMTICA E ESTATSTICA
Florianpolis, Santa Catarina
2011.2
Trabalho de concluso de curso sob o ttulo Investigao de Padres de Subamostragem
em Mtrica de Similaridade de Imagem, defendido por Ismael Seidel e aprovado em 10 de
novembro de 2011, em Florianpolis, Santa Catarina, pela banca examinadora constituda pelos
professores:
Prof. Dr. Jos Lus Almada Gntzel
Universidade Federal de Santa Catarina
Orientador
Prof. Dr. Djones Vincius Lettnin
Universidade Federal de Santa Catarina
Membro da Banca
Vinicius dos Santos Livramento
Universidade Federal de Santa Catarina
Membro da Banca
Agradecimentos
Sempre h muito o que agradecer. Comeo, no pra ser padro, mas pelo fato de que acre-
dito Nele, agradecendo Deus. Agradeo meus pais, que tanto zeram por mim durante toda
minha vida. Que cuidaram de mim, mas ao mesmo tempo me deixaram aprender a caminhar.
Por conarem em mim e em minhas decises, por exemplo na escolha de um curso, de uma
universidade. Bom, aparentemente deu certo! Ento deixo por escrito meu muito obrigado aos
melhores pais do mundo! Agradeo tambm a meus familiares, aqueles que deixei de ter tanto
contato, que deixei de comparecer nas festas... Foi o necessrio para estar aqui, e sei que todos
sempre me apoiaram com bastante fora.
Tambm aos meus amigos, companheiros de ap., amigos da GGs k, pessoal do ECL ou
tudo junto. Muitos dos quais meus revisores, pra evitar alguns erros neste texto. Cabe aqui citar
alguns nomes, n minha grande fri Nicole Pillati?! Tambm a grande Rafa! Tuto, Rangel e
Marclo, que moram comigo, que bagunam o ap comigo... Tuto alm de dividir ap tambm
deu umas dicas legais no TCC. Ao pessoal incrvel que estudou comigo no terceiro, grandes
amigos da GGs k ento (que ainda no foram citados): Khero, Mio, Neil, Vane, Nero... Ao
distante Coelho... Todos temos uma grande amizade, alguns com mais ligao, alguns com
menos. Mas ainda nos vemos, nem que seja em uma frequncia no to alta...
Cabe agradecer aos professores, desde as primeiras sries at neste ltimo semestre (assim
espero!) de graduao... Tambm com uma breve citao alguns, no por desmerecimento aos
demais, mas sim por terem sido fatores que ajudaram a traar alguns caminhos. Ao professor
Luciano Alves, que me conseguiu a oportunidade de estudar no CCSJ. Ao professor Adriano
Coelho pelo apoio e orientao enquanto l. Ao professor Gntzel, que me props ser membro
do, antes, LAPS. Este me trouxe mais perto da rea de imagem e vdeo digital. Agradeo
tambm pela orientao, das bolsas de iniciao cientca e TCC. Agradeo tambm ao CNPq
pelas bolsas.
Agradeo aos demais membros da banca, prof. Djones e Vinicius. Obrigado por terem
aceito participar da banca, corrigir o texto e tambm pela j feita avaliao do comeo deste
trabalho na disciplina de Projetos I. Agradeo tambm aos demais membros do Laboratrio de
Computao Embarcada, pelas conversas, bolinhos, pelo ambiente de trabalho... Agradeo ao
Bruno pelas longas discusses sobre o padro e as demais conversas sobre udio/imagem/vdeo.
Now youre SAD SAD SAD
SAD SAD SAD
SAD SAD SAD
But youre gonna be ne
The Rolling Stones
Sumrio
Lista de Figuras
Lista de Tabelas
Lista de Acrnimos p. 17
Resumo p. 20
Abstract p. 21
1 Introduo p. 22
1.1 Justicativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
1.1.1 Compresso de Vdeo . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.2.1 Objetivos gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.2.2 Objetivos especcos . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.3 Escopo deste Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.4 Organizao deste Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 26
2 Conceitos de Compresso de Vdeo Digital p. 27
2.1 Conceitos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 27
2.1.1 Captura da Imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
2.1.2 Converso do Espao de Cor . . . . . . . . . . . . . . . . . . . . . . p. 29
2.1.3 Subamostragem Croma . . . . . . . . . . . . . . . . . . . . . . . . . p. 30
2.1.4 Transformada Discreta dos Cossenos . . . . . . . . . . . . . . . . . p. 31
2.1.5 Quantizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 31
2.1.6 Estimao de Movimento . . . . . . . . . . . . . . . . . . . . . . . p. 31
2.1.7 Codicao Aritmtica . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
2.2 Padres de Compresso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
2.2.1 H.264/AVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 33
2.3 Conceitos no H.264/AVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.1 Aritmtica Inteira . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.2 DCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.3 Novidades na Estimao de Movimento . . . . . . . . . . . . . . . . p. 35
2.3.4 Predio Intra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 37
3 Mtricas de Similaridade p. 39
3.1 Mtricas Objetivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 39
3.2 Mtricas Subjetivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 41
4 Contribuio s Mtricas de Similaridade p. 42
4.1 SAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 43
4.2 DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 44
4.3 Amostragem na SAD - Pel Decimation . . . . . . . . . . . . . . . . . . . . . p. 45
4.3.1 Diagonal Principal - (Main Diagonal SAD) . . . . . . . . . . . . . . p. 46
4.3.2 Ncleo - (Kernell SAD) . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
4.3.3 Bordas - (Border SAD) . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
4.3.4 Cruzado - (Cross SAD) . . . . . . . . . . . . . . . . . . . . . . . . . p. 47
4.3.5 Tabuleiro - (Checker SAD) . . . . . . . . . . . . . . . . . . . . . . . p. 47
4.4 Blocos de outros tamanhos . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 48
5 O Software de Referncia do H.264 p. 50
5.1 Ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 50
5.1.1 Anlise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 50
5.2 Arquivo de congurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 52
6 Resultados Experimentais p. 53
6.1 Imagens Estticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 53
6.2 Vdeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 62
6.3 Conluso Sobre os Resultados Experimentais . . . . . . . . . . . . . . . . . p. 71
7 Estimativa de custos de Hardware p. 72
7.1 SAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 73
7.2 Pel Decimation 2:1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 76
7.3 Pel Decimation 4:1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 76
7.4 Border . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 76
7.5 Comparao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 77
7.6 Blocos de outros tamanhos . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 79
7.7 DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 80
8 Concluses e trabalhos futuros p. 81
Referncias Bibliogrcas p. 83
Anexo A -- Resultados da avaliao em software das mtricas em estudo p. 86
A.1 Imagens de Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 86
A.2 Resumo dos Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.3 SSIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 93
A.4 PSNR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 101
A.5 Resduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 109
Anexo B -- Cdigo fonte do teste em software p. 117
B.1 Aplicao Java - Imagens Estticas . . . . . . . . . . . . . . . . . . . . . . . p. 117
B.1.1 collector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 117
B.1.2 constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 123
B.1.3 generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 124
B.1.4 graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 136
B.1.5 image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 153
B.1.6 javaImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 170
B.1.7 logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 173
B.1.8 metrics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 191
B.1.9 metrics.SAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 196
B.1.10 metrictests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 205
B.1.11 quality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 217
B.1.12 reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 219
B.2 Macro para o software ImageJ - Avaliao do SSIM . . . . . . . . . . . . . p. 222
B.3 Vericao da implementao na JM . . . . . . . . . . . . . . . . . . . . . . p. 222
B.3.1 validacaojm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 222
B.4 Leitura das estatsticas e Gerao de Grcos sobre a JM . . . . . . . . . . . p. 226
B.4.1 graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 226
B.4.2 jmstatsparser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 250
B.4.3 searchMethods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 256
B.4.4 testSample . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 259
B.5 Modicaes na JM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 261
B.5.1 Soma das Diferenas Absolutas - Sum of Absolute Differences - (SAD) p. 261
B.5.2 Direct Current (DC) . . . . . . . . . . . . . . . . . . . . . . . . . . p. 261
B.5.3 Border . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 262
B.5.4 Checker Even . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 263
B.5.5 Checker Odd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 264
B.5.6 Cross . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 265
B.5.7 Kernell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 267
B.6 Arquivo de congurao utilizado . . . . . . . . . . . . . . . . . . . . . . . p. 268
Anexo C -- Artigo obrigatrio p. 301
Lista de Figuras
1.1 Matriz de pixels de diversos padres de imagens. Mostrando as dimenses em altura e
largura. Fonte:(POYNTON, 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
2.1 Criao e uso de tcnicas de compresso de vdeo ao longo do tempo. Adaptado de: (READER,
2002) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
2.2 Exemplo de captura de imagem para o formato Vermelho, Verde e Azul - Red, Green and
Blue - (RGB). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 29
2.3 Converso do espao de cor RGB para o espao Y - luma CB e CR blue-difference e
red-difference dos componentes de cor (YCbCr). . . . . . . . . . . . . . . . . . . . p. 29
2.4 Componentes do formato YCbCr. . . . . . . . . . . . . . . . . . . . . . . . . . . p. 30
2.5 Exemplo de subamostragem 4:4:4, 4:2:2 e 4:2:2 reconstrudo por interpolao. . . . . . . p. 30
2.6 Exemplo de Estimao de Movimento - Motion Estimation - (ME). . . . . . . . . . . . . p. 32
2.7 Padres de codicao de vdeo ao longo do tempo. Adaptado de:(SULLIVAN, 2005) . . . p. 33
2.8 Efeito da Transformada Discreta dos Cossenos - Discrete Cosine Transform - (DCT) sobre
um bloco 4x4 de pixels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 35
2.9 Predio de movimento com uso de vetores que apontam para fora do quadro. . . . . . . . p. 35
2.10 Simplicao da ME com preciso de 1/4 de pixel. . . . . . . . . . . . . . . . . . . . p. 36
2.11 Representao de mltiplas referncias de um quadro no padro H.264/AVC. . . . . . . . p. 36
2.12 Uso da predio com peso em uma cena com fade out. . . . . . . . . . . . . . . . . p. 37
2.13 Exemplo da predio de vetores de movimento. . . . . . . . . . . . . . . . . . . . . p. 37
2.14 Incio da predio intra 4x4. Adaptado de:(MANOEL, 2007) . . . . . . . . . . . . . . p. 37
2.15 Bloco original e os nove possveis candidatos intra 4x4. Adaptado de:(MANOEL, 2007) . . p. 38
2.16 Quatro possveis direes da predio intra 16x16. . . . . . . . . . . . . . . . . . . . p. 38
4.1 Exemplo de blocos utilizados durante a ME. . . . . . . . . . . . . . . . . . . . . . . p. 42
4.2 Padro de amostragem 2:1 comumente utilizado para pel decimation em um bloco 8x8.
Fonte: (PORTO, 2006) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 46
4.3 Os pixels utilizados no clculo das mtricas esto marcados. . . . . . . . . . . . . . . . p. 46
4.4 Exemplo de aplicao da mtrica Main Diagonal sobre um bloco 8x8, coletando apenas os
elementos da diagonal principal. . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 49
4.5 Exemplo de aplicao da mtrica Main Diagonal sobre um bloco 8x8, obtendo a diagonal
principal de cada sub-bloco 4x4. . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 49
6.1 Primeira imagem de teste, teste 4 . . . . . . . . . . . . . . . . . . . . . . . . . . p. 54
6.2 Resultados sobre o teste 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 55
6.3 ndice de Similaridade Estrutural - Structural Similarity Index - (SSIM) de cada uma das
mtricas em estudo para o teste 4. . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
6.4 Relao Sinal-Rudo de Pico - Peak signal-to-noise ratio - (PSNR) de cada uma das mtricas
em estudo para o teste 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
6.5 Resduo de cada uma das mtricas em estudo para o teste 4. . . . . . . . . . . . . . . p. 57
6.6 Resduos sobre o teste 4. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 58
6.7 Segunda imagem de teste, teste 11 (Lena). . . . . . . . . . . . . . . . . . . . . . . p. 58
6.8 SSIM de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . . p. 59
6.9 PSNR de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . . p. 60
6.10 Resduo de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . p. 60
6.11 Segunda imagem de teste, teste 10 (Baboon). . . . . . . . . . . . . . . . . . . . . p. 60
6.12 SSIM de cada uma das mtricas em estudo para o teste 10, Baboon. . . . . . . . . . . p. 61
6.13 PSNR de cada uma das mtricas em estudo para o teste 10, Baboon. . . . . . . . . . . p. 62
6.14 Resduo de cada uma das mtricas em estudo para o teste 10, Baboon. . . . . . . . . . p. 62
6.15 Vdeos de teste utilizados para avaliao de qualidade em vdeo das mtricas de similaridade
estudadas. Fonte: (XIPH.ORG, 2011) . . . . . . . . . . . . . . . . . . . . . . . . . p. 63
6.16 As duas imagens possuem o mesmo PSNR, mas o rudo est distribudo em regies diferen-
tes. Fonte: (WINKLER, 2005). . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 65
6.17 Resultados da sequncia de teste Foreman para as mtricas utilizadas no codicador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
6.18 Resultados da sequncia de teste Soccer para as mtricas utilizadas no codicador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
6.19 Resultados da sequncia de teste Sunower para as mtricas utilizadas no codicador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
6.20 Resultados da sequncia de teste Ducks Take Off para as mtricas utilizadas no codicador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
6.21 Resultados da sequncia de teste In to the Tree para as mtricas utilizadas no codicador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 69
6.22 Resultados da sequncia de teste Park Joy para as mtricas utilizadas no codicador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 69
6.23 Resultados da sequncia de teste Big Buck Bunny para as mtricas utilizadas no codicador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 70
6.24 Resultados da sequncia de teste Riverbed para as mtricas utilizadas no codicador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 71
7.1 Esquema geral bloco responsvel pelas subtraes e primeira soma da SAD, chamado de
bloco EP. Cada um destes blocos processa dois pixels por vez. . . . . . . . . . . . . . p. 74
7.2 Projeto de um bloco operativo totalmente paralelo para a SAD. . . . . . . . . . . . . . p. 74
7.3 Possvel mapeamento do bloco candidato e referncia (A e B) para as entradas do clculo da
SAD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 75
7.4 Comparativo dos atrasos estimados para as mtricas com os somadores Carry-Lookahead
Adder (CLA) e Carry-Ripple Adder (CRA). . . . . . . . . . . . . . . . . . . . . . p. 77
7.5 Comparativo do consumo de potncia para as mtricas com os somadores CLA e CRA. . . p. 77
7.6 Comparativo dos custos de rea para as mtricas com os somadores CLA e CRA. . . . . . p. 78
7.7 Comparativo do Produto Atraso-Potncia - Power-Delay Product - (PDP) para as propostas.
Valores estimados a partir de (MONTEIRO, 2011). . . . . . . . . . . . . . . . . . . p. 79
A.1 Imagens utilizadas para efetuar os testes de imagem esttica em software. . . . . . . . . . p. 86
A.2 SSIM de cada uma das mtricas em estudo para o teste 0. . . . . . . . . . . . . . . . p. 93
A.3 SSIM de cada uma das mtricas em estudo para o teste 1. . . . . . . . . . . . . . . . p. 93
A.4 SSIM de cada uma das mtricas em estudo para o teste 2. . . . . . . . . . . . . . . . p. 94
A.5 SSIM de cada uma das mtricas em estudo para o teste 3. . . . . . . . . . . . . . . . p. 94
A.6 SSIM de cada uma das mtricas em estudo para o teste 4. . . . . . . . . . . . . . . . p. 95
A.7 SSIM de cada uma das mtricas em estudo para o teste 5. . . . . . . . . . . . . . . . p. 95
A.8 SSIM de cada uma das mtricas em estudo para o teste 6. . . . . . . . . . . . . . . . p. 96
A.9 SSIM de cada uma das mtricas em estudo para o teste 7. . . . . . . . . . . . . . . . p. 96
A.10 SSIM de cada uma das mtricas em estudo para o teste 8. . . . . . . . . . . . . . . . p. 97
A.11 SSIM de cada uma das mtricas em estudo para o teste 9. . . . . . . . . . . . . . . . p. 97
A.12 SSIM de cada uma das mtricas em estudo para o teste 10. . . . . . . . . . . . . . . p. 98
A.13 SSIM de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . . p. 98
A.14 SSIM de cada uma das mtricas em estudo para o teste 12. . . . . . . . . . . . . . . p. 99
A.15 SSIM de cada uma das mtricas em estudo para o teste 13. . . . . . . . . . . . . . . p. 99
A.16 SSIM de cada uma das mtricas em estudo para o teste 14. . . . . . . . . . . . . . . p. 100
A.17 PSNR de cada uma das mtricas em estudo para o teste 0. . . . . . . . . . . . . . . p. 101
A.18 PSNR de cada uma das mtricas em estudo para o teste 1. . . . . . . . . . . . . . . p. 101
A.19 PSNR de cada uma das mtricas em estudo para o teste 2. . . . . . . . . . . . . . . p. 102
A.20 PSNR de cada uma das mtricas em estudo para o teste 3. . . . . . . . . . . . . . . p. 102
A.21 PSNR de cada uma das mtricas em estudo para o teste 4. . . . . . . . . . . . . . . p. 103
A.22 PSNR de cada uma das mtricas em estudo para o teste 5. . . . . . . . . . . . . . . p. 103
A.23 PSNR de cada uma das mtricas em estudo para o teste 6. . . . . . . . . . . . . . . p. 104
A.24 PSNR de cada uma das mtricas em estudo para o teste 7. . . . . . . . . . . . . . . p. 104
A.25 PSNR de cada uma das mtricas em estudo para o teste 8. . . . . . . . . . . . . . . p. 105
A.26 PSNR de cada uma das mtricas em estudo para o teste 9. . . . . . . . . . . . . . . p. 105
A.27 PSNR de cada uma das mtricas em estudo para o teste 10. . . . . . . . . . . . . . . p. 106
A.28 PSNR de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . . p. 106
A.29 PSNR de cada uma das mtricas em estudo para o teste 12. . . . . . . . . . . . . . . p. 107
A.30 PSNR de cada uma das mtricas em estudo para o teste 13. . . . . . . . . . . . . . . p. 107
A.31 PSNR de cada uma das mtricas em estudo para o teste 14. . . . . . . . . . . . . . . p. 108
A.32 Resduo de cada uma das mtricas em estudo para o teste 0. . . . . . . . . . . . . . . p. 109
A.33 Resduo de cada uma das mtricas em estudo para o teste 1. . . . . . . . . . . . . . . p. 109
A.34 Resduo de cada uma das mtricas em estudo para o teste 2. . . . . . . . . . . . . . . p. 110
A.35 Resduo de cada uma das mtricas em estudo para o teste 3. . . . . . . . . . . . . . . p. 110
A.36 Resduo de cada uma das mtricas em estudo para o teste 4. . . . . . . . . . . . . . . p. 111
A.37 Resduo de cada uma das mtricas em estudo para o teste 5. . . . . . . . . . . . . . . p. 111
A.38 Resduo de cada uma das mtricas em estudo para o teste 6. . . . . . . . . . . . . . . p. 112
A.39 Resduo de cada uma das mtricas em estudo para o teste 7. . . . . . . . . . . . . . . p. 112
A.40 Resduo de cada uma das mtricas em estudo para o teste 8. . . . . . . . . . . . . . . p. 113
A.41 Resduo de cada uma das mtricas em estudo para o teste 9. . . . . . . . . . . . . . . p. 113
A.42 Resduo de cada uma das mtricas em estudo para o teste 10. . . . . . . . . . . . . . p. 114
A.43 Resduo de cada uma das mtricas em estudo para o teste 11. . . . . . . . . . . . . . p. 114
A.44 Resduo de cada uma das mtricas em estudo para o teste 12. . . . . . . . . . . . . . p. 115
A.45 Resduo de cada uma das mtricas em estudo para o teste 13. . . . . . . . . . . . . . p. 115
A.46 Resduo de cada uma das mtricas em estudo para o teste 14. . . . . . . . . . . . . . p. 116
Lista de Tabelas
1.1 Tabela comvalores de taxa de bits e espao ocupado para alguns padres usados emBlu-rays.
Adaptado de: (BENNETT, 2011) . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 24
5.1 Tabela com resultados da anlise dinmica da Joint Model (JM)(JVT, 2011) para a sequncia
Foreman. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 51
6.1 Tabela de resultados para a Figura 6.1. . . . . . . . . . . . . . . . . . . . . . . . . p. 54
6.2 Tabela de resultados para a Figura 6.7 (Lena). . . . . . . . . . . . . . . . . . . . . . p. 59
6.3 Tabela de resultados para a Figura 6.11 (Baboon). . . . . . . . . . . . . . . . . . . . p. 61
7.1 Tabela comparativa das mtricas estudadas, estimadas com somadores CLA e CRA. Valores
estimados a partir de (MONTEIRO, 2011). . . . . . . . . . . . . . . . . . . . . . . p. 78
A.1 Tabela de resultados para a gura A.1 (a). . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.2 Tabela de resultados para a gura A.1 (b). . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.3 Tabela de resultados para a gura A.1 (c). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.4 Tabela de resultados para a gura A.1 (d). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.5 Tabela de resultados para a gura A.1 (e). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.6 Tabela de resultados para a gura A.1 (f). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.7 Tabela de resultados para a gura A.1 (g). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.8 Tabela de resultados para a gura A.1 (h). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.9 Tabela de resultados para a gura A.1 (i). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.10 Tabela de resultados para a gura A.1 (j). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.11 Tabela de resultados para a gura A.1 (k). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.12 Tabela de resultados para a gura A.1 (l). . . . . . . . . . . . . . . . . . . . . . . . p. 91
A.13 Tabela de resultados para a gura A.1 (m). . . . . . . . . . . . . . . . . . . . . . . p. 91
A.14 Tabela de resultados para a gura A.1 (n). . . . . . . . . . . . . . . . . . . . . . . . p. 91
A.15 Tabela de resultados para a gura A.1 (o). . . . . . . . . . . . . . . . . . . . . . . . p. 92
Lista de Acrnimos
3 CCD Three-CCD
A1CSA Add-One Carry-Select Adder
A1CSAH Hierarchical Add-One Carry-Select Adder
AVCHD Advanced Video Codec High Denition
B Bipredito
CCD Charge-Coupled Device
CLA Carry-Lookahead Adder
CRA Carry-Ripple Adder
CSA Carry-Select Adder
DC Direct Current
DCT Transformada Discreta dos Cossenos - Discrete Cosine Transform -
DVD Disco de Vdeo Digital - Digital Video Disc -
FFT Transformada Rpida de Fourier - Fast Fourier Transform -
FR Taxa de Quadros - Frame Rate -
GCC GNU Compiler Collection
GNU GNUs Not Unix!
GPL General Public License
HD-DVD High Denition Digital Video Disc
HD Alta Denio - High Denition -
HVS Sistema Visual Humano - Human Visual System -
18
ITU-T International Telecommunication Union Telecommunication Standardization Sector
JM Joint Model
JVT Joint Video Team
ME Estimao de Movimento - Motion Estimation -
MPEG-2 Moving Pictures Expert Group - 2
MPEG Moving Picture Experts Group
MV Vetor de Movimento - Motion Vector -
NTSC National Television System Committee
P Predito
PDP Produto Atraso-Potncia - Power-Delay Product -
PMV Vetor de Movimento Predito - Predicted Motion Vector -
PSNR Relao Sinal-Rudo de Pico - Peak signal-to-noise ratio -
RD Taxa-Distoro - Rate-Distortion -
RDO Otimizao Taxa-Distoro - Rate-Distortion Otimization -
RGB Vermelho, Verde e Azul - Red, Green and Blue -
SAD Soma das Diferenas Absolutas - Sum of Absolute Differences -
SATD Soma das Diferenas Transformadas Absolutas - Sum of Absolute Transformed Differ-
ences -
SBTVD Sistema Brasileiro de Televiso Digital
SL Camada Simples - Single Layer -
SSD Soma das Diferenas Quadrticas - Sum of Squared Differences -
SSIM ndice de Similaridade Estrutural - Structural Similarity Index -
TSMC Taiwan Semiconductor Manufacturing Company Limited
VECG Visual Coding Experts Group
VBS Tamanho de Bloco Varivel - Variable Block Size -
19
VLSI Very-large-scale Integration
YCbCr Y - luma CB e CR blue-difference e red-difference dos componentes de cor
20
Resumo
Neste trabalho foram investigados padres de subamostragem de pixels como entrada de
mtricas de custo durante a fase de estimao de movimento em um codicador de vdeo digi-
tal. A subamostragem de pixels (pel decimation) largamente utilizada e propicia implemen-
taes em hardware ecientes e com alto desempenho. Inicialmente foram propostos padres
de amostragem e o erro gerado pelas mtricas consideradas foram avaliado utilizando-se o soft-
ware de referncia do padro H.264/AVC, bem como uma implementao inicial sobre ima-
gens estticas para uma pr-avaliao. Sero analisadas algumas arquiteturas Very-large-scale
Integration (VLSI) para uma mtrica comumente utilizada na literatura, e foram estimados os
resultados da subamostragem em tais arquiteturas. Assim possvel ter uma viso geral de
como fazer tal amostragem, suas vantagens sobre as demais em termos de custo (rea), desem-
penho (atraso crtico) e ecincia energtica (produto atraso-potncia), bem como em relao
s diferenas da qualidade da predio.
21
Abstract
This work investigated some pixel subsampling patterns as input for cost metrics during the
motion estimation algorithm in a digital video encoder. The pel decimation (pixel subsampling)
is widely used and provides efcient hardware implementations and high performance. Initially
are proposed some sampling patterns and the error generated by such metrics were evaluated
using the reference software of the H.264/AVC standard, as well as an initial implementation of
still images into a pre-assessment. Some VLSI architectures were analyzed for a metric com-
monly used in literature and the results were estimated for subsampling in such architectures.
So it is possible to have an overview of how to sampling, its advantages over the others in
terms of cost (area), performance (critical delay) and efciency (power-delay product), as well
as differences in relation of the prediction quality.
22
1 Introduo
A compresso de imagens estticas e de vdeo exige alto desempenho, principalmente em
aplicaes em que a compresso deve ocorrer em tempo real (uma transmisso ao vivo, por
exemplo). Alm disso, cada vez mais frequente o uso de compresso de imagens em equipa-
mentos portteis operados a bateria (cmeras, telefones celulares, smartphones, etc). Nestes
casos, o processo de compresso deve ocorrer com mxima ecincia energtica, a m de pro-
longar a carga e a vida til das baterias.
Baseando-se principalmente na reduo de informao redundante, segundo Richardson
(2003), a compresso de vdeo digital (imagem dinmica) traz pelo menos dois importantes
benefcios. O primeiro deles tornar possvel o uso de vdeo digital para armazenamento e
transmisso em meios que no suportariam vdeo no comprimido (raw). O segundo possi-
bilitar o uso mais eciente dos recursos de armazenamento e transmisso.
Este trabalho investiga padres de amostragem para o algoritmo de pel decimation (KUHN,
1999), como forma de acelerar a etapa de codicao conhecida como Estimao de Movimento
- Motion Estimation - (ME), que um passo fundamental nos compressores de vdeo. Para
tanto sero estudadas as principais mtricas de similaridade com especial ateno Soma das
Diferenas Absolutas - Sum of Absolute Differences - (SAD), por ser esta a mais utilizada. Alm
disso, uma nova mtrica proposta e foi batizada de Direct Current (DC).
A busca por novos padres de amostragem a serem usados no clculo de similaridade tem
por objetivo reduzir o custo do clculo sem comprometer a qualidade da compresso. A re-
duo do custo do clculo conduz a implementaes em hardware com menor custo, maior
desempenho e menor consumo de energia.
Este trabalho se concentra em dois aspectos:
Anlise da qualidade da predio com o uso das mtricas estudadas, as quais foram im-
plementadas apenas em software. Esta avaliao usa inicialmente imagens estticas, pas-
sando ento a sua avaliao para vdeos no padro H.264/AVC (ITU-T, 2009), com sua
incluso no software de referncia do padro, a Joint Model (JM) (JVT, 2011).
23
Anlise de arquiteturas Very-large-scale Integration (VLSI) para tais mtricas (e padres)
em termos de custo (rea), desempenho (atraso crtico) e ecincia energtica (produto
atraso-potncia).
1.1 Justicativa
1.1.1 Compresso de Vdeo
H muito, na cultura popular, se comenta que uma imagem vale por mil palavras. Um
vdeo nada mais do que uma sequncia de imagens rapidamente apresentadas, gerando assim
a iluso de movimento. Desde o incio do cinema como forma de arte e como tecnologia, nos
anos 1890s
1
, a ideia de imagem dinmica atrai a ateno de empreendedores, artistas, cien-
tistas e polticos (Nowell-Smith, 1999). No s o cinema exerce essa atrao, mas tambm o
vdeo nos mais diversos tipos de mdia e formas de transmisso (TV, Disco de Vdeo Digital -
Digital Video Disc - (DVD), Blu-Ray, Celulares, Internet, etc). No princpio as cmeras eram
analgicas, com vrios padres denindo seus formatos de gravao. Posteriormente, com uma
resoluo maior que a do formato analgico, surge o vdeo digital, facilitando a manipulao
dos dados (por exemplo a edio e a transmisso) (MANZATO, 2004).
Figura 1.1: Matriz de pixels de diversos padres de imagens. Mostrando as dimenses em altura e largura.
Fonte:(POYNTON, 2003)
Representar vdeo em forma digital requer uma grande quantidade de bits (RICHARDSON,
2002). Usando frmulas matemticas simples, pode-se vericar a diculdade de transmisso e
1
No princpio do cinema, muitas pessoas acreditavam que as imagens que estavam assistindo fossem reais.
Em 1896, de acordo com um comentarista, o lme Rough Sea at Dover : "presented the breaking waves on the
seashore. Wave after wave came tumbling on the sand, and as they struck, broke into tiny oods just like the real
thing. Some of the people in the front row seemed to be afraid they were going to get wet, and looked about to see
where they could run to, in case the waves came too close". (MATHEWS; MUSSER; ART, 2005)
24
armazenamento de vdeo digital em sua forma descomprimida. Em um vdeo, h o conceito
de taxa de quadros (frame rate), que o nmero de quadros exibidos em um segundo de vdeo
(essa alternncia de quadros o que causa a impresso de movimento, e segundo (VIJAYAKU-
MAR, 2008), so necessrios pelo menos 24 quadros por segundo para que o olho humano
tenha a sensao de movimento). Levando-se a Taxa de Quadros - Frame Rate - (FR) em con-
siderao, admitindo que um pixel em uma imagem colorida ocupe x bits, e tomando por
base uma imagem com w pixels horizontais e h pixels verticais (a Figura 1.1 mostra vrios
padres de imagens e suas dimenses), tm-se que
bitrate = x wh f r (1.1)
Este valor chamado de taxa de bit (bitrate). Considerando a Equao 1.1, para um lme em
DVD com w*h = 720x480
2
, x = 24 bits/pixel, fr = 29.97 quadros/segundo, so necessrios
2472048029.97 = 248583168bits/s = 29.63MiB/s.
Mesmo no parecendo um valor muito alto, ao se considerar um lme de 90 minutos como
exemplo, temos 29, 63MiB/s 90min 60s = 160002MiB = 156, 25GiB. Sendo que a capaci-
dade de um DVD Camada Simples - Single Layer - (SL) de 4.7Gb (TAYLOR; JOHNSON;
CRAWFORD, 2006), percebe-se logo que h algum bom algoritmo de compresso que torna
possvel o uso de umDVDcomessa capacidade. Almdisso, h de ser considerado que tambm
sero armazenados no DVD as faixas de udio para cada idioma, legendas, menus, extras, etc.
Ao se analisar, por exemplo, um vdeo em Alta Denio - High Denition - (HD) e full-HD,
como mostrado na Tabela 1.1, nota-se claramente a necessidade de uma grande compresso.
Anal, poucos usurios poderiam armazenar um lme com, por exemplo, 750 GiB.
Tabela 1.1: Tabela com valores de taxa de bits e espao ocupado para alguns padres usados em Blu-rays.
Adaptado de: (BENNETT, 2011)
Tipo
Tamanho do
Quadro (pix-
els)
Taxa de
Quadros
Taxa de Bits Tamanho de
arquivo para
90 minutos de
vdeo
HD 720 24p 1280x720 24/s progressivo 0,53 Gbps 333,71 GiB
HD 720 50p 1280x720 50/s progressivo 1,11 Gbps 695,23 GiB
HD 1080 24p 1920x1080 24/s progressivo 1,19 Gbps 750,85 GiB
No caso do DVD o padro Moving Pictures Expert Group - 2 (MPEG-2) usado para a
codicao do vdeo. J para as necessidades atuais, como o Sistema Brasileiro de Televiso
Digital (SBTVD), Blu-ray, High Denition Digital Video Disc (HD-DVD), Advanced Video
2
Considerando linhas visveis para o padro National Television System Committee (NTSC), embora este
padro tenha no total 525 linhas. H uma certa variao para os tamanhos. (TAYLOR, 2011)
25
Codec High Denition (AVCHD), foi adotado o padro H.264/AVC(ITU-T, 2009), que melhora
a compresso em at 50% em relao ao MPEG-2. Mesmo sendo o estado da arte em ecincia,
emalguns casos ainda invivel seu uso devido ao custo de processamento e ao limite da largura
de banda disponvel para algumas aplicaes (MORAES, 2010).
1.2 Objetivos
1.2.1 Objetivos gerais
O objetivo deste trabalho analisar mtricas e padres de amostragem para o clculo de
similaridade entre blocos, buscando-se identicar a existncia de um padro de amostra que
no resulte em grandes degradaes na estimao de movimento (ME).
1.2.2 Objetivos especcos
Avaliar padres de amostragem para o algoritmo conhecido na literatura por pel deci-
mation (KUHN, 1999), em imagens estticas e dinmicas (vdeo), com foco no padro
H.264/AVC.
Fazer estimativa em termos de atraso crtico, potncia, rea e ecincia energtica com
vistas sintese de arquiteturas VLSI apropriadas para os clculos propostos.
1.3 Escopo deste Trabalho
Os padres de amostragem deste trabalho foram primeiramente implementados em lin-
guagem Java, de modo a permitir sua avaliao com imagens estticas. Posteriormente, o soft-
ware de referncia (JVT, 2011) foi modicado a mde permitir a avaliao dos mesmos padres
de amostragem quando aplicados a vdeos. Finalmente, foram feitas estimativas em termos de
atraso crtico, potncia, rea e ecincia energtica para uma arquitetura VLSI capaz de re-
alizar esses clculos. Tais estimativas se basearam nos resultados no Trabalho de Concluso de
Curso feito por Monteiro (2011), o qual utilizou as ferramentas disponveis no Laboratrio de
Computao Embarcada - Embedded Computing Lab. (LCE) do Departamento de Informtica
e Estatstica (INE), na Universidade Federal de Santa Catarina (UFSC).
26
1.4 Organizao deste Trabalho
Este trabalho est organizado em 8 captulos e 3 anexos. O Captulo 1 justica o trabalho,
demonstrando por que necessrio comprimir vdeo. Tambm mostra o escopo do trabalho e
os objetivos gerais e especcos. O Captulo 2 apresenta conceitos de codicao/compresso
de vdeo digital, bem como o padro de codicao estado da arte, o H.264/AVC. O Captulo
3 revisa as mtricas de similaridade utilizadas na codicao. O Captulo 4 aprofunda um
pouco mais as mtricas a serem estudadas, assim como prope padres de amostragem para o
algoritmo de pel decimation com possvel bom desempenho. No Captulo 5 h uma descrio
do software de referncia do padro H.264/AVC (JM) (JVT, 2011), e uma breve avaliao do
impacto da estimao de movimento no tempo de execuo de um codicador de vdeo. No
Captulo 6 so apresentados e discutidos os resultados dos testes implementados em software.
O Captulo 7 mostra algumas possveis arquiteturas VLSI para implementao das mtricas de
custo, e faz estimativas de custo dos padres de amostragem propostos. Finalmente o Captulo
8 apresenta as concluses deste trabalho, assim como os trabalhos futuros.
27
2 Conceitos de Compresso de Vdeo
Digital
Neste Captulo esto descritos os conceitos bsicos de compresso de vdeo digital, usados
na maioria dos padres de codicao de vdeo. Tambm so comentados os padres mais
utilizados, dando nfase ao padro H.264/AVC. Os conceitos de codicao de vdeo, bem
como as novidades do H.264/AVC so explicadas de forma simples, tendo por base o texto de
Richardson (2003) e a recomendao do padro pela ITU-T (2009).
2.1 Conceitos Bsicos
Um vdeo nada mais do que uma sequncia de amostras espaciais e temporais capturadas
eletricamente por uma cmera. Estas amostras so organizadas e armazenadas em matrizes
de tamanho denido, sendo que cada elemento de uma matriz corresponde a uma informao
especca da amostra. Estas matrizes, arranjadas em sequncia, conforme foram capturadas,
formam o vdeo. Cada uma dessas matrizes pode ser entendida como uma imagem. Assim, um
vdeo uma sequncia de imagens amostradas rapidamente
1
.
A compresso acontece ao se eliminar informaes redundantes dessa sequncia de ma-
trizes. As redundncias em um vdeo podem ser classicadas em quatro tipos:
1. Entrpica: Relativa repetio estatstica dos smbolos amostrados (bits por exemplo);
2. Frequencial: Relativa ao conjunto de frequncias de cada quadro as quais o Sistema Vi-
sual Humano - Human Visual System - (HVS) no muito sensvel;
3. Temporal: Relativa repetio de informao no decorrer do tempo;
4. Espacial: Relativa repetio da informao dentro de um mesmo quadro (por exemplo,
uma textura).
1
Segundo Vijayakumar (2008), pelo menos 24 quadros por segundo.
28
A Figura 2.1 enumera algumas tcnicas usadas na compresso de vdeo, dispostas na forma
de linha do tempo. interessante notar o quanto a rea antiga e que muitos dos conceitos usa-
dos h vrias dcadas so vlidos at hoje, como por exemplo, o uso da Transformada Discreta
dos Cossenos (Transformada Discreta dos Cossenos - Discrete Cosine Transform - (DCT)),
quadros de referncia preditos (quadros-P), bi-preditos (quadros-B), etc. Estes e outros con-
ceitos sero melhor detalhados nas prximas subsees.
Figura 2.1: Criao e uso de tcnicas de compresso de vdeo ao longo do tempo. Adaptado de: (READER,
2002)
2.1.1 Captura da Imagem
A imagem capturada pela cmera usando-se, por exemplo, um Charge-Coupled De-
vice (CCD), o qual armazena cargas dos ftons capturados durante um perodo de tempo (ex-
posio). O CCD um componente eletrnico feito de material semicondutor, como o Silcio, e
manufaturado para ser sensvel incidncia da luz sobre sua superfcie (JUNIOR; KANAAN;
GOMES, 2002). Ele composto por uma matriz, onde cada elemento responsvel por cap-
turar a informao de um pixel da imagem nal. Quanto maior o tamanho da matriz, maior o
tamanho da imagem, e quanto menor o tamanho de cada pixel, maior a resoluo da imagem.
Em suma, o CCD tem o seguinte funcionamento: quando um fton incide sobre um dos elemen-
tos da matriz este elemento libera um eltron. Cada elemento tem um capacitor que acumula
a carga gerada pela incidncia de luz. Ao nal do tempo de exposio, a carga acumulada em
cada elemento medida, fornecendo assim a informao referente luz que incidiu sobre cada
elemento.
Costuma-se usar sobre o CCD um ltro de Bayer, comumente GRGB, permitindo a pas-
sagem de duas componentes verdes para uma componente vermelha e uma componente azul.
Apesar de reetir a sensibilidade do olho humano (BROWN, 2004), o uso do ltro de Bayer
causa diminuio da resoluo, uma vez que cada pixel do ltro deixa passar luz apenas de um
29
dos canais Vermelho, Verde e Azul - Red, Green and Blue - (RGB). Uma alternativa ao uso
do ltro de Bayer o uso de Three-CCD (3 CCD), um CCD por canal (WOOTTON, 2005).
Diversos modelos de cmeras prossionais possuem um CCD para cada componente.
Figura 2.2: Exemplo de captura de imagem para o formato RGB.
No caso de apenas um CCD, cada um dos canais separado em uma matriz prpria (a
Figura 2.2 resume a ideia da captura da imagem e a separao das matrizes R, G e B) , sendo
que cada um dos pixels de cada canal representado digitalmente por 3 bytes, totalizando assim
24 bits por ponto RGB. Existem outras formas de representao digital de imagens coloridas,
com menos ou mais bits por canal, entretanto o mais conhecido e utilizado o RGB 24 bits.
2.1.2 Converso do Espao de Cor
Outro passo do processo de codicao de imagens/vdeos digitais a converso do espao
de cor. O padro RGB combina as 3 cores para formar outras cores. Usando RGB com 24 bits,
temos 16.777.216 diferentes cores que podem ser exibidas, que no levam em considerao as
redundncias na percepo humana. Outros espaos de cor podem ser mais adequados para a
representao da imagem. Atualmente, o espao de cor mais utilizado durante o processo de
codicao o Y - luma CB e CR blue-difference e red-difference dos componentes de
cor (YCbCr). A Figura 2.3 mostra a representao espacial dos dois espaos de cor, RGB e
YCbCr. Durante o processo de codicao, a imagem em formato RGB convertida para o
formato YCbCr.
Figura 2.3: Converso do espao de cor RGB para o espao YCbCr.
30
No formato YCbCr, o canal Y representa a luminosidade, ou seja, a intensidade de luz no
ponto. O canal Cb representa a diferena da luminosidade com o canal azul do RGB e o canal
Cr representa a diferena da luminosidade com o canal vermelho. O YCbCr no um espao de
cor absoluto, mas sim uma forma de codicar RGB. A Figura 2.4 mostra as trs componentes
do formato YCbCr. Este espao de cor adotado no padro H.264/AVC por conter menos cor-
relao entre suas componentes e possibilitar a operao denominada subamostragem croma,
descrita na prxima Seo.
Figura 2.4: Componentes do formato YCbCr.
2.1.3 Subamostragem Croma
O Sistema Visual Humano (HVS) mais sensvel luminosidade do que s cores. Dessa
forma, possvel utilizar resolues menores nas matrizes de crominncia (Cb e Cr), com pouco
prejuzo para a qualidade subjetiva da imagem. De acordo com a subamostragem efetuada,
linhas horizontais ou verticais so eliminadas das matrizes de crominncia e, quando deco-
dicadas, as amostras mantidas sero interpoladas para a gerao de matrizes com a mesma
resoluo. Alguns exemplos de subamostragem comumente utilizadas em codicao de vdeo
so 4:4:4, no qual no h subamostragem; 4:2:2, no qual a resoluo das matrizes de crominn-
cia so reduzidas metade na horizontal ou vertical; e 4:2:0, na qual as matrizes de crominncia
so reduzidas metade tanto na horizontal quanto na vertical.
Figura 2.5: Exemplo de subamostragem 4:4:4, 4:2:2 e 4:2:2 reconstrudo por interpolao.
31
2.1.4 Transformada Discreta dos Cossenos
Pode-se dizer que a DCT (AHMED; NATARAJAN; RAO, 1974) uma simplicao da
Transformada Rpida de Fourier - Fast Fourier Transform - (FFT), sendo computacionalmente
mais simples e mais efetiva para compresso multimdia. A transformada ocorre depois da
estimao de movimento, sobre o resduo a ser mantido (ver Subseo 2.1.6). A frmula da
DCT bidimensional a seguinte:
G
i j
=
1

2n
C
i
C
j
n1

x=0
n1

y=0
p
xy
cos
_
(2y +1) j
2n
_
cos
_
(2x +1)i
2n
_
, para 0 i, j n1
Onde
C
f
=
_
_
_
1

2
, f = 0
1, f > 0
Existem vrias otimizaes comumente aplicadas para melhorar o desempenho no clculo
da DCT como, por exemplo, a reduo dos quadros em blocos, pr-clculo de cossenos, etc.
2.1.5 Quantizao
Durante o uxo de compresso de vdeo, a quantizao a grande responsvel pela perda na
qualidade e tambm compresso. Resumidamente, o passo de quantizao consiste em dividir a
matriz de pixels por uma matriz chamada matriz de quantizao. A quantizao ocorre sobre os
coecientes transformados pela DCT, gerando ento uma matriz de coecientes quantizados.
Quanto maiores os coecientes da matriz de quantizao, maior a compresso e tambm maior a
perda. As perdas ocorrem nesse passo principalmente em razo das diferentes implementaes
de ponto utuante e por erros de arredondamento.
2.1.6 Estimao de Movimento
A estimao de movimento (ME) um dos grandes responsveis pela alta taxa de com-
presso em vdeos, sendo por isso um dos passos mais importantes na codicao. A ideia e o
funcionamento so bastante simples, mas a deteco de movimento pode ser bastante complexa.
A ME ocorre buscando em blocos candidatos o melhor casamento, usando alguma mtrica de
similaridade. O bloco com o melhor casamento (escolhido), ou seja, com a maior semelhana
(similaridade) com o bloco atual (a ser codicado) ento apontado por um Vetor de Movi-
mento - Motion Vector - (MV), que um vetor bidimensional. Como se pode observar na Figura
32
2.6, o quadro passado, com a nuvem mais ao alto, usado como referncia para o quadro atual
(mais direita). A seta vermelha representa o MV, cujo valor armazenado a coordenada, no
caso (2,C). O resduo
2
mostrado, na Figura 2.6, sob a coordenada do MV.
Figura 2.6: Exemplo de ME.
A ME visa eliminar a redundncia temporal, guardando apenas o MV e o resduo por bloco,
ao invs de armazenar completamente a informao de cada bloco. Durante o processo de
codicao, a estimao de movimento ocorre antes do passo da transformada e quantizao,
de forma que apenas o resduo transformado e quantizado.
2.1.7 Codicao Aritmtica
A codicao aritmtica o passo nal da codicao de vdeo e responsvel por reduzir
a redundncia entrpica. Aps a reduo dos outros tipos de redundncias presentes em um
vdeo, algoritmos bastante conhecidos, como a codicao de Huffmann (SALOMON, 2007),
so aplicados para diminuir a repetio de smbolos. Este tipo de compresso no traz perdas
nos dados, portanto no inuencia a qualidade nal do vdeo.
2.2 Padres de Compresso
Como o desao da compresso de vdeo acompanha o crescimento da digitalizao e dis-
tribuio de contedos pela internet, TV digital e outros meios, importante buscar solues
que garantam os requisitos de desempenho, qualidade, disponibilidade e manuteno dessas
aplicaes (MORAES, 2010).
2
Resduo: diferena entre a referncia e o bloco a ser codicado. Ao reconstruir o bloco, esse resduo somado
ao bloco de referncia, obtendo assim uma boa aproximao do bloco que foi codicado, exceto pelo erro causado
pela quantizao desse resduo.
33
Diversos so os padres de codicao de vdeo at hoje criados. Estes padres so regu-
lamentados pela International Telecommunication Union Telecommunication Standardization
Sector (ITU-T). Na Figura 2.7 so amostrados alguns dos padres de codicao de vdeo cria-
dos ao longo do tempo. Estes padres so listados a partir da dcada de 1980, e ao compar-los
com os da Figura 2.1, onde diversas tcnicas de compresso ao longo do tempo esto ano-
tadas, se perceber que os padres listados na Figura 2.7 j contavam com muitas das tcnicas
de compresso at hoje utilizadas, como a codicao de entropia (Codicao de Huffmann
(SALOMON, 2007)), a transformada discreta dos cossenos (DCT) e a estimao de movimento
(ME).
Figura 2.7: Padres de codicao de vdeo ao longo do tempo. Adaptado de:(SULLIVAN, 2005)
2.2.1 H.264/AVC
De forma a abranger o estado da arte em compresso de vdeo, foi estudado mais a fundo o
padro de compresso de vdeo H.264/AVC(Advanced Video Coding) que foi desenvolvido pela
ITU-T Visual Coding Experts Group (VECG) em conjunto com a ISO/IEC Moving Picture Ex-
perts Group (MPEG), os quais formaram uma parceria conhecida por Joint Video Team (JVT).
O H.264 usado em HD-DVD, Blu-ray, alm de ser o formato de vdeo adotado no Brasil
para TV digital. atualmente o estado da arte em compresso de vdeo, devido a seu aumento
em taxa de compresso, em comparao com padres anteriores. , portanto, alvo de muitos
estudos, de forma que muito importante projetar hardware para codicao/decodicao de
vdeo nesse padro, visando melhorar seu desempenho para que sejam capazes de cumprir suas
tarefas com baixo custo energtico e, em muitas aplicaes, em tempo real.
34
2.3 Conceitos no H.264/AVC
O padro H.264/AVC teve ganhos de at 50% em ecincia sobre seu predecessor, o
MPEG-2 (MORAES, 2010). E segundo Manoel (2007):
No h uma caracterstica que se destaque isoladamente todas as novas ca-
ractersticas trazem pequenas melhorias que, conjuntamente, provm um grande
impacto na taxa-distoro do H.264 relativamente a seus antecessores
Nas prximas subsees sero abordadas algumas dessas novas melhorias acima citadas.
2.3.1 Aritmtica Inteira
De acordo com Manoel (2007), anteriormente ao padro H.264 era necessrio utilizar
operaes com palavras de no mnimo 32-bits, alm de uma aritmtica de ponto utuante. O
H.264 especica as transformadas utilizando apenas operaes simples de adio, subtrao e
deslocamento, necessitando apenas de uma aritmtica de 16-bits de ponto xo. Isso reduz a
complexidade do hardware necessrio para computar a transformada e a carga computacional,
bem como permite alocar o processamento para outras etapas, por exemplo, predio ou decod-
icao.
2.3.2 DCT
A DCT do H.264 simplicada para uma operao de multiplicao de matrizes (matriz
da transformada - T), com inversa exata. A matriz de coecientes DCT C para a matriz de
amostras A descrita como:
C = TAT
T
Exemplo de matriz de transformada (T) 4x4:
T =
_

_
1 1 1 1
2 1 1 2
1 1 1 1
1 2 2 1
_

_
AFigura 2.8 demonstra o efeito da DCT ( direita) sobre a matriz de amostra A( esquerda).
35
Figura 2.8: Efeito da DCT sobre um bloco 4x4 de pixels.
2.3.3 Novidades na Estimao de Movimento
Esta Subseo mostra, com auxlio de guras, algumas das novidades no processo de esti-
mao de movimento do padro H.264/AVC. Vale a pena relembrar que a ME um dos passos
da codicao responsvel pelo maior ganho em compresso. Alm disso, durante a ME so
utilizadas as mtricas de similaridade para obter o casamento entre blocos similares.
No padro H.264/AVC existe a possibilidade de um vetor de movimento (MV) apontar para
fora do quadro. Essa modicao consiste em gerar novos candidatos para a ME, estendendo as
bordas de um bloco (localizado na borda do quadro) assim como mostrado na Figura 2.9. Dessa
forma, ao se estender a borda, um novo bloco criado a partir da borda, similar ao processo da
Predio Intra (Subseo 2.3.4). Com este novo bloco como candidato, um MV pode apontar
para este candidato, ou seja, apontar para fora do quadro.
Figura 2.9: Predio de movimento com uso de vetores que apontam para fora do quadro.
Outra proposta do padro a preciso de 1/4 de pixel na ME. Isso signica mais can-
didatos na busca, mas, em compensao, movimentos mais sutis podem ser capturados na ME,
reduzindo possivelmente o resduo. Assim, para os blocos candidatos so gerados novos blocos
atravs de interpolao, com preciso de primeiramente 1/2 pixel e estes so novamente inter-
polados para preciso de 1/4 de pixel. A Figura 2.10 mostra de maneira simplicada um MV
apontando para uma posio de 1/4 de pixel.
36
Figura 2.10: Simplicao da ME com preciso de 1/4 de pixel.
Mais uma novidade que, ao invs de manter apenas uma referncia xa para blocos do
tipo Predito (P) e duas referncias para os do tipo Bipredito (B) (como em padres anteriores), o
H.264/AVC utiliza uma lista de referncias passadas (lista 0) e uma lista com referncias futuras
(lista 1). Dessa forma, um bloco pode apontar para qualquer uma das referncias de qualquer
das duas listas. As listas 0 e 1, bem como um quadro apontando para mltiplas referncias,
podem ser vistas na Figura 2.11. O tamanho das listas vai requerer um maior ou menor tamanho
no buffer de codicao/decodicao.
Figura 2.11: Representao de mltiplas referncias de um quadro no padro H.264/AVC.
A grande maioria dos lmes faz transies suaves entre suas cenas. Normalmente, essa
suavidade atingida utilizando-se de tcnicas de fade in, fade out e cross-fade
3
. O
H.264/AVC otimiza a compresso deste tipo de tcnica, pois implementa a chamada predio
com peso. Neste tipo de predio, aps detectar que existe uma mudana gradativa na cena,
utiliza os blocos j codicados aplicando a eles um peso, ou seja, multiplica-os por um fator,
dessa forma diminuindo o resduo para estes blocos. A Figura 2.12 mostra simplicadamente
uma predio com peso em uma cena com fade-out.
3
Fade in/Fade out: Recursos de edio de vdeo que permite transies suaves entre as cenas. Fade in nor-
malmente refere-se a ir do escuro para a luz, enquanto fade out implica escurecer a cena ou transicionar para o
preto.Adaptado de (JACK; TSATSULIN, 2002).
Cross-fade: Diminuir a intensidade de um sinal de vdeo e aumentar de outro, em um movimento simultneo.
Adaptado de (JACK; TSATSULIN, 2002).
37
Figura 2.12: Uso da predio com peso em uma cena com fade out.
H tambm predio de vetores de movimento, usando os vetores de movimento de blocos
vizinhos. Calcula-se a partir dos vetores vizinhos de um bloco um vetor mdio, chamado de
Vetor de Movimento Predito - Predicted Motion Vector - (PMV). Ento, para o bloco o qual se
est armazenando o vetor calculado o resduo do vetor, que a subtrao do PMV pelo vetor
de movimento do bloco atual. A Figura 2.13 mostra um exemplo deste tipo de predio.
Figura 2.13: Exemplo da predio de vetores de movimento.
2.3.4 Predio Intra
Figura 2.14: Incio da predio intra 4x4. Adaptado de:(MANOEL, 2007)
O padro H.264/AVC tambm prev a possibilidade de predies intra-quadro, explorando
assim a redundncia espacial (MANOEL, 2007). So nove modos intra 4x4 e quatro modos
38
intra 16x16, mostrados nas Figuras 2.15 e 2.16. A Figura 2.14 mostra um quadro do vdeo
a ser codicado, do qual se tem um macrobloco e se buscar para um bloco 4x4, a melhor
combinao intra para este bloco. A Figura 2.15 mostra essa busca. O melhor casamento, dado
por uma mtrica de similaridade, neste caso a SAD, o candidato 7.
Figura 2.15: Bloco original e os nove possveis candidatos intra 4x4. Adaptado de:(MANOEL, 2007)
A predio intra-quadro pode ser explicada da seguinte forma: dado um bloco original e
suas bordas (dos seus vizinhos esquerdo, superior esquerdo, superior e superior direito para
blocos 4x4 e vizinhos esquerdo e superior para blocos 16x16), o codicador gera amostras a
partir destas bordas, e atravs de alguma mtrica de similaridade, o bloco mais parecido poder
ser substitudo pelo predito e seu resduo. A Figura 2.15 mostra os nove modos (direes) da
predio intra 4x4 e a Figura 2.16 mostra os quatro modos (direes) da predio intra 16x16.
Figura 2.16: Quatro possveis direes da predio intra 16x16.
39
3 Mtricas de Similaridade
As mtricas de similaridade, tambm chamadas de mtricas de distoro, podem ser, a
grosso modo, classicadas em duas abordagens (MORAES, 2010):
mtricas baseadas em modelos matemticos usados em processamento de sinais;
mtricas psicovisuais que usam caractersticas do HVS.
As primeiras so modelos puramente matemticos derivados da teoria de sinais e no con-
sideram caractersticas do HVS. Entretanto, por questes de desempenho so as mais usadas. J
as mtricas psicovisuais exploram modelos do HVS. As poucas existentes sofrem de baixo de-
sempenho e exploram apenas um pequeno conjunto de caractersticas. Um exemplo o ndice
de Similaridade Estrutural - Structural Similarity Index - (SSIM), que explora a capacidade do
olho humano de identicar estruturas. Por sofrerem de baixo desempenho (alta complexidade
computacional para seu clculo), alm de no explorar por completo o HVS, no so muito
usadas nem mesmo muito aceitas (WU; RAO, 2005). Exemplos de mtricas de similaridade
comumente utilizadas so a SAD, a Soma das Diferenas Quadrticas - Sum of Squared Differ-
ences - (SSD) e a Soma das Diferenas Transformadas Absolutas - Sumof Absolute Transformed
Differences - (SATD). objetivamente e avaliadas de forma automtica por um programa de com-
putador. So modelos matemticos e incluem mtricas da teoria de sinais e tambm mtricas
psicovisuais. Assim h uma grande confuso nessas duas formas de classicao. As mtricas
subjetivas tem por objetivo aproximar a opinio de um usurio, e podem incluir o esforo de
avaliadores.
3.1 Mtricas Objetivas
As mtricas de distoro objetivas mais usadas so apresentadas a seguir:
SAD - Soma das Diferenas Absolutas: Mtrica de distoro constituda pela soma do
valor absoluto das diferenas entre cada amostra original e a amostra correspondente, aps o
40
processo de reconstruo. Devido sua baixa complexidade computacional adequada para
implementao direta em hardware (MANOEL, 2007) .
SAD =
M

i=0
N

j=0
|Ori
i, j
Dec
i, j
|
SSD - Soma das Diferenas Quadrticas: Corresponde soma do quadrado das diferenas
entre cada amostra original e a amostra aps o processo de reconstruo. Sua caracterstica
principal evidenciar os erros signicativos (MANOEL, 2007).
SSD =
M

i=0
N

j=0
(Ori
i, j
Dec
i, j
)
2
SATD - Soma das Diferenas Transformadas Absolutas: Baseada na SAD, mas usa a trans-
formada Hadamard (H) em uma partio 4x4 de diferenas antes de efetuar a soma absoluta dos
coecientes. Apresenta maior custo que a SAD, com melhor qualidade por operar no domnio
das frequncias (MANOEL, 2007) .
Hadamard H =
_

_
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
_

_
SATD =
1
2
3

i=0
3

j=0
|H(Ori
i, j
Dec
i, j
)H
T
|
MSE - Erro Quadrtico Mdio: Corresponde mdia do quadrado das diferenas entre
cada amostra original e a amostra correspondente, aps o processo de codicao/decodicao
(MANOEL, 2007) calculada em um bloco com tamanho M por N.
MSE =
SSD
MxN
PSNR - Razo Sinal-Rudo de Pico: Mtrica de distoro objetiva de vdeo mais ampla-
mente usada. Seu valor dado em decibis para amostras de n bits (MANOEL, 2007) .
PSNR = 10log
10
(2
n
1)
2
MSE
SSIM - ndice de Similaridade Estrutural: Valor mximo 1, que corresponde duas imagens
X e Y, exatamente iguais, estruturalmente (WANG et al., 2004) .
41
SSIM(x, y) =
(2
x

y
+c
1
)(2
xy
+c
2
)
(
2
x
+
2
y
+c
1
)(
2
x
+
2
y
+c
2
)
Sendo:

x
a mdia de x;

y
a mdia de y;

2
x
a varincia de x;

2
y
a varincia de y;

xy
a covarincia de x e y;
c
1
= (k
1
L)
2
, c
2
= (k
2
L)
2
variveis para estabilizar a diviso por denominador fraco;
L a gama dinmica do pixel, 2
#bits pixel
1);
k
1
= 0.01 e k
2
= 0.03 por padro.
3.2 Mtricas Subjetivas
Mtricas Subjetivas esto relacionadas percepo do observador do vdeo, para uma se-
quncia de um vdeo em particular. Testes de qualidade subjetivos so bastante complexos para
ser executados em termos de tempo e recursos humanos.
42
4 Contribuio s Mtricas de
Similaridade
O objetivo deste trabalho analisar mtricas de similaridade e padres de amostragem,
buscando identicar se existe um padro de amostra que no resulte em grandes degradaes na
ME. Por este motivo, e tambm buscando implementaes VLSI com alto desempenho e baixo
consumo energtico, as mtricas escolhidas para serem estudadas foram as com implementao
simples e com baixo nmero de operaes aritmticas. ainda proposta uma mtrica com
tendncia a ter bom desempenho, no encontrada na literatura. Estas mtricas sero avaliadas
em relao qualidade da predio em comparao com mtricas conhecidas.
(a) Bloco original (b) Bloco candidato
(referncia)
(c) Mdulo do res-
duo entre original e
referncia
Figura 4.1: Exemplo de blocos utilizados durante a ME.
Para ilustrar as mtricas, ser utilizado o exemplo da predio intra, descrita na Seo
2.3.4, sendo que a Figura 4.1 mostra o bloco original, ou seja, aquele para o qual se busca
uma boa predio, e o bloco de referncia, que um possvel candidato como referncia ao
bloco original. No exemplo, o quadro de referncia o modo intra 7 (down-left) para blocos
4x4. Nesta mesma imagem tambm mostrado o mdulo do resduo entre o bloco referncia e
o original
1
. No exemplo considerado um bloco luma
2
4x4, portanto representados com 255
variaes de cinza (entre 0 e 254), sendo 0 totalmente preto e 254 totalmente branco. Os valores
1
Como a SADutiliza a soma das diferenas absolutas, o mdulo do resduo corresponde s diferenas absolutas.
Portanto, ao se somarem todos os pixels deste bloco, tm-se o valor numrico correspondente SAD entre o bloco
original e a referncia. Assim, o uso do bloco com o mdulo do resduo facilita na apresentao das mtricas a
serem estudadas, principalmente por serem quase todas baseadas na SAD.
2
Bloco luma o bloco equivalente ao elemento Y do YCbCr.
43
de cada pixel da matriz so mostrados na Figura 4.1 de forma a facilitar a interpretao.
Uma forma menos visual de representar os trs blocos em forma de matriz, como apre-
sentado nas matrizes na Equao 4.1. As matrizes A, B e C correspondem, respectivamente aos
blocos original, candidato e mdulo do resduo.
A =
_

_
189 142 126 138
150 126 132 145
149 142 142 144
157 141 142 143
_

_
, B =
_

_
177 153 127 102
153 127 127 127
153 127 102 127
127 127 127 127
_

_
,C =
_

_
12 12 1 36
3 1 5 18
4 15 40 17
30 14 15 16
_

_
(4.1)
4.1 SAD
Por ser a mtrica mais simples da literatura, a SAD foi escolhida como base dos experi-
mentos, e tambm como comparao em relao qualidade para as outras mtricas. Alm de
ser a mais simples, tambm uma das mtricas mais utilizadas. Como visto no Captulo 3, a
SAD calculada de acordo com a Equao 4.2, na qual os ndices i e j so a localizao de cada
pixel na matriz de pixel original e de referncia (Ori e Ref , respectivamente). Como pode
ser observado na Equao 4.2, so utilizados todos os pixels das matrizes dos dois blocos. De
forma a comparar com as demais mtricas, a Figura 4.3 mostra em destaque os pixels utilizados
no clculo da SAD em cada bloco.
SAD =
M

i=0
N

j=0
|Ori
i, j
Re f
i, j
| (4.2)
Desta forma, o valor da SAD para o exemplo da Figura 4.1 obtido somando-se os mdulos
dos resduos entre o bloco original e o bloco candidato. No caso, o valor da SAD igual a 238
(12 + 12 + 1 + 36 + 3 + 1 + 5 + 18 + 4 + 15 + 40 + 17 + 30 + 14 + 15 + 16). Vendo dessa forma
a SAD aparenta ser mais simples do que realmente . Vale lembrar que cada valor ali somado
derivou primeiramente de uma subtrao e uma extrao de mdulo.
Existem trabalhos correlatos, com propostas de arquiteturas para o clculo da SAD assim
como sua sntese para Standard-Cells, com foco tambm em alta performance e baixa dissi-
pao de potncia. Tais propostas sero abordadas no Captulo 7.
44
4.2 DC
Durante estudos sobre a DCT e o padro H.264/AVC, bem como a prpria DCT do H.264
(ITU-T, 2009), percebeu-se que existe uma alta relao entre o bloco remontado de pela inversa
da DCT com o coeciente DC da transformada. Observou-se assim que existe uma alta cor-
relao entre o coeciente DC e o bloco. Surgiu ento a idia de usar o coeciente DC como
parte de uma mtrica de similaridade simplicada, a qual foi chamada de DC. A mtrica DC
ento o mdulo da diferena entre o coeciente DC da DCT do bloco candidato e do bloco
original. Isso signica medir o quo diferentes so os coecientes DCs das DCTs dos blocos.
A SAD toma pixel a pixel do bloco e calcula a diferena, somando o mdulo das diferenas
pixel a pixel, gerando assim um coeciente de semelhana entre as imagens. Quanto menor a
SAD, mais semelhantes as imagens. J, observando a forma como o coeciente DC calculado
no H.264/AVC (ITU-T, 2009), percebe-se que so feitas apenas as somas dos pixels do bloco,
o que tende a ser mais simples do que a SAD. Assim, como existe uma alta correlao entre
o bloco com seu coeciente DC, o casamento de blocos durante a ME pode aproveitar essa
correlao para tornar-se mais rpido.
Seu clculo descrito na Equao 4.3, sendo que os ndices i e j so a localizao de cada
pixel na matriz de pixel original e de referncia (Ori e Ref , respectivamente). Assim
como a SAD, esta mtrica utiliza todos os pixels do bloco para o clculo da similaridade, sendo
representados em destaque na Figura 4.3.
DC =|(
M

i=0
N

j=0
Ori
i, j
) (
M

i=0
N

j=0
Re f
i, j
)| (4.3)
Seguindo com o exemplo do comeo do captulo, basta somar os valores de cada uma das
matrizes de pixel (na Equao 4.1 as matrizes A e B) e ento fazer a diferena entre estas
somas, tirando por m o mdulo. Soma de A igual a 189 +142 +126 +138 +150 +126 +
132 +145 +149 +142 +142 +144 +157 +141 +142 +143 = 2308, a soma de B igual a
177+153+127+102+153+127+127+127+153+127+102+127+127+127+127+
127 = 2110. E por m |2308 2110| = 198, ou seja para o exemplo representado na Figura
4.3, DC = 198.
45
4.3 Amostragem na SAD - Pel Decimation
Como j mencionado na Seo 4.1, a SAD considerada na literatura como a mtrica mais
simples, e largamente empregada durante o processo da ME. Meios de acelerar a ME so
bastante explorados na literatura. Lee et al. (2004) arma que dentre os algoritmos de busca de
vetores de movimento, o que provm os melhores resultados a busca completa (full-search).
Este tipo de busca utilizando, por exemplo, como mtrica de similaridade a SAD, faz o clculo
da mesma para todos os possveis blocos candidatos, buscando por m o menor valor dentre
eles. Este processo bastante custoso, pois num ciclo para a codicao de vdeo, pode ser
necessrio o clculo da mtrica de similaridade umelevado nmero de vezes
3
. Para resolver este
problema, outros algoritmos de busca foram propostos, que tm por base a diminuio da rea
de busca. Ou seja, diminuem-se os possveis candidatos. Dessa forma, a complexidade diminui,
mas os resultados alcanados no so to precisos como a busca exaustiva. Para diminuir o
impacto, uma proposta utilizar o algoritmo full-search fazendo uma amostragem dos pontos a
serem levados em considerao no clculo da mtrica de similaridade.
Tal proposta, citada em (KUHN, 1999) e explorada por Porto (2006), chamada de Pel
decimation (ou Pel subsampling). De acordo com Kuhn (1999), para o pel decimation, os
pixels so tomados uniformemente sobre a rea de busca, fazendo uma amostragem destes.
Esta tcnica, por possuir alta regularidade, alm de diminuir a complexidade do clculo de
similaridade, bastante utilizada em implementaes VLSI. Devido ao fato de no se ter mais a
correlao completa de cada pixel no bloco, espera-se uma diminuio da qualidade na predio
e, como consequncia, na qualidade visual da mesma.
A amostragem dos pixels costuma ser feita nas propores 2:1 ou 4:1, sendo que a primeira
costuma obter resultados com pouca perda (qualidade e taxa) e a segunda deve ser usada com
cuidado, pois as perdas costumam ser maiores. Tende-se a utilizar como forma de amostragem
o padro mostrado na Figura 4.2, mas a escolha do padro de amostragem no est denida no
algoritmo. Tal escolha pode inuenciar positiva ou negativamente a qualidade nal da codi-
cao. Dessa forma, pode-se fazer um estudo do quanto a ausncia do clculo de parte da SAD
inuencia na predio e principalmente, quais padres de amostragem tem menores perdas.
Nas prximas subsees sero descritos alguns algoritmos simplicados de clculo parcial
da SAD (padres de amostragem para o mtodo de pel decimation). Para cada padro foi
estipulado um nome para facilitar a organizao deste trabalho e tambm dos testes e resultados.
A Figura 4.3 mostra em destaque os pixels utilizados no clculo de cada um dos padres, no
3
Como pode ser visto na Seo 5.1.1, o nmero de chamadas da SAD bastante elevado, ainda mais ao se
considerar a resoluo do vdeo e o pequeno nmero de quadros utilizados no teste.
46
Figura 4.2: Padro de amostragem 2:1 comumente utilizado para pel decimation em um bloco 8x8. Fonte:
(PORTO, 2006)
caso de blocos 4x4, com seus ndices marcados. Pode ser observado que padres, como por
exemplo do tabuleiro
4
, utilizam apenas 50% dos pixels do bloco (amostragem 2:1), dessa forma,
fazendo aproximadamente 50% menos operaes durante seu clculo, se comparado com uma
SAD completa. Isso, como j mencionado, trar consequncias, principalmente em termos de
qualidade e resduo, o que ser avaliado primeiramente com testes em software, cuja descrio
e resultados sero mostrados no Captulo 6.
(a) SADe DC (b) Diagonal
Principal
- (Main
Diagonal)
(c) Ncleo -
(Kernell)
(d) Bordas -
(Border)
(e) Cruzado -
(Cross)
(f) Tabuleiro
Par - (Even
Checker)
(g) Tabuleiro
mpar - (Odd
Checker)
Figura 4.3: Os pixels utilizados no clculo das mtricas esto marcados.
4.3.1 Diagonal Principal - (Main Diagonal SAD)
Esta uma mtrica bastante simples e calcula a SAD usando apenas a diagonal principal das
matrizes original e candidata, ou seja, apenas 25% dos pixels do bloco 4x4. Os pixels utilizados
podem ser vistos na Figura 4.3 (b). A Equao 4.4 mostra seu clculo.
Main Diagonal =
M

i=0
N

j=0
|Ori
i, j
Re f
i, j
|, quando i = j (4.4)
4
Tal padro o comumente adotado na tcnica de pel decimation, como visto na Figura 4.2, para o caso de uma
amostragem 2:1 em um bloco 8x8.
47
No caso do exemplo utilizado at agora, o valor da mtrica Main Diagonal 69, ou seja, os
elementos da diagonal principal somados (12+1+40+16). Novamente, importante lembrar
que ao utilizar a matriz com o mdulo dos resduos, a operao aparenta ser bem mais simples,
como j comentado sobre a SAD.
4.3.2 Ncleo - (Kernell SAD)
Faz o clculo da SAD apenas do ncleo
5
da matriz, ou seja a parte mais central. No caso
dos blocos 4x4, os quatro elementos mais centrais da matriz equivalem ao ncleo e os demais
elementos so pertencentes s bordas. Assim, utilizando tambm apenas quatro pixels do bloco,
o que equivale a 25% destes. Para o exemplo, o valor de Kernell 1+5+15+40 = 61.
4.3.3 Bordas - (Border SAD)
Utiliza os pixels nas bordas das matrizes, efetuando a SAD sobre os mesmos. Utiliza 75%
dos pixels do bloco. Este padro de amostragem foge do comumente utilizado na tcnica de pel
decimation, a qual normalmente utiliza propores 2:1 ou 4:1 (ou ainda menores). Como este
padro inclui mais informao sobre o bloco, pode vir a ser mais preciso e ainda economizar
aproximadamente 1/4 de operaes. Considerando o exemplo, o valor de Border 12 +11 +
1+36+18+17+16+15+14+30+4+3 = 177.
4.3.4 Cruzado - (Cross SAD)
Utiliza tanto a diagonal principal quanto a diagonal secundria da matriz de pixel e sobre
estas efetua o clculo da SAD. possvel notar que utiliza, no caso de blocos 4x4, os pixels do
ncleo do bloco, e dos 4 cantos. Dessa forma, usa 50% dos pixels do bloco, equivalente ento
proporo 2:1 do pel decimation. O valor calculado para o exemplo Cross = 12+36+1+
5+15+40+30+16 = 155.
4.3.5 Tabuleiro - (Checker SAD)
Utiliza 50% dos pixels do bloco, alternando entre eles, como num jogo de tabuleiro (por
exemplo xadrez). o padro utilizado no algoritmo de pel decimation, portanto pode servir de
base para comparaes. Neste caso a proporo 2:1 e as perdas so pouco signicativas em
5
Esta nomenclatura no deriva da lgebra linear. apenas utilizada neste trabalho para identicar a regio
central da matriz de pixels.
48
termos de qualidade e taxa de bit. Por outro lado, h uma grande economia na complexidade da
computao da mtrica. A abordagem do tabuleiro est subdividida nos testes em dois grupos,
par e mpar (Checker Even e Checker Odd). Uma das possveis vantagens da utilizao destes
dois padres ao mesmo tempo uma organizao de memria onde um bloco de memria de
256 bits (4 linhas, 4 colunas e 8 bits por elemento) pode conter o necessrio para 2 blocos 4x4
de forma intuitiva e fcil gerncia.
Par - (Even) Comea na posio 0 do bloco, utilizando os valores das posies pares nas
linhas pares e os valores das posies mpares nas linhas mpares. o padro adotado no
pel decimation na maioria das implementaes. Para o exemplo, o valor de Checker Even
12+1+1+18+4+40+14+16 = 106.
mpar - (Odd) Comea na posio 1 do bloco, utilizando os valores das posies mpares
nas linhas pares e os valores das posies pares nas linhas mpares. o complemento do padro
adotado no pel decimation na maioria das implementaes. Para o exemplo, o valor de Checker
Odd 11+36+3+5+15+17+30+15 = 132.
4.4 Blocos de outros tamanhos
At aqui, os padres de amostragem foram apresentados para blocos 4x4. Os mesmos po-
dem ser estendidos para blocos com outros tamanhos, como possvel de acordo com o padro
H.264/AVC (ITU-T, 2009). Por exemplo, a mtrica Main Diagonal SAD pode ser calculada
exatamente em seu sentido para um bloco 8x8, por exemplo, utilizado apenas os valores da di-
agonal principal. Assim como na diagonal principal, pode-se utilizar a mesma implementao
usada em 4x4, por exemplo, utilizando 2 clculos de Main Diagonal SAD em setores espec-
cos do bloco maior, como ilustrado na Figura 4.4. A mesma ideia pode ser aplicada para as
mtricas com tabuleiro.
Tal mtodo no se aplica ao clculo de SAD apenas do centro (ncleo) e bordas, necessi-
tando assim de implementaes especcas de acordo com o tamanho. Podem ser utilizadas
implementaes genricas, mas sero mais custosas pois necessria uma lgica maior para a
separao dos valores de pixels a serem utilizados no clculo. Apesar de economizarem muito
mais em recursos, tais abordagens quase certamente iro causar uma grande diminuio na
qualidade (testes passveis de serem implementados como trabalhos futuros).
A sada ento considerar a soma dos resultados parciais para blocos 4x4, uma vez que
49
Figura 4.4: Exemplo de aplicao da mtrica Main Diagonal sobre um bloco 8x8, coletando apenas os elementos
da diagonal principal.
as outras possibilidades de subdivises de blocos previstos no padro so todos mltiplos de
blocos 4x4. Isto bastante adotado, inclusive no software de referncia (JVT, 2011). Para essa
soluo, a Figura 4.5 mostra tambm um exemplo de seu uso.
Figura 4.5: Exemplo de aplicao da mtrica Main Diagonal sobre um bloco 8x8, obtendo a diagonal principal
de cada sub-bloco 4x4.
50
5 O Software de Referncia do H.264
A primeira implementao do padro H.264/AVC chamada Joint Model (JM) (JVT,
2011). Esta implementao de referncia nasceu de verses do Test Model Long-Term desen-
volvido pelo MPEG em Agosto de 1999 (MORAES, 2010). Trocou de nome para JM quando
o VECG uniu esforos com o MPEG criando o JVT. Assim, a JM (JVT, 2011) um software
de referncia projetado pelo JVT, escrito em linguagem C. Neste software esto contidas todas
as funcionalidades citadas na Seo 2.3.
Para as primeiras anlises, estre trabalho utilizou a verso 17.2 do software de referencia
(JVT, 2011). Porm durante o desenvolvimento do presente trabalho, uma nova atualizao da
JM foi divulgada. Dessa forma, os estudos foram conduzidos utilizando-se a verso 18.0 da JM
(JVT, 2011).
5.1 Ambiente
Para as implementaes em software das mtricas estudadas, foi congurado o ambiente de
desenvolvimento Eclipse (2011) para gerenciar todo o projeto da JM (JVT, 2011). Criou-se um
projeto separado para cada verso de teste (uma verso para cada mtrica proposta), e manteve-
se uma verso original para comparaes. Para facilitar o uso dos arquivos de congurao da
JM, as mtricas originais de cada verso de teste foram substitudas pelas mtricas propostas.
5.1.1 Anlise
No mbito de melhor compreender a complexidade envolvida durante a estimao de movi-
mento, foi usado uma ferramenta de anlise dinmica (proler tool), bastante usada que o
Gprof (2007). O propsito da anlise dinmica vericar os recursos utilizados por cada parte
do cdigo, podendo assim otimizar tempo de execuo e memria das partes crticas na exe-
cuo. O Gprof (2007) um projeto GNUs Not Unix! (GNU), sob licena General Public
License (GPL), e pode ser usada em conjunto com o GNU Compiler Collection (GCC).
51
Para us-lo, primeiro se compila o programa a ser analisado com a ag -pg, liga-se (linkage)
tambmcom-pg. Ento o programa deve ser executado, gerando durante a execuo umarquivo
gmon.out. Aps gerado, o Gprof usado passando como parmetro o programa a ser analisado
e como segundo parmetro o arquivo gerado. O resultado pode ser redirecionado para um
arquivo. Por exemplo:
$gcc -pg -o program.exe le01.c le02.c ...
$./program.exe
$gprof program.exe gmon.out > out-le
O resultado de uma anlise dinmica da JM, congurada para utilizar apenas a SAD como
mtrica de similaridade na estimao de movimento, fazendo teste exaustivo (full-search)
apresentado na Tabela 5.1. A congurao da mquina usada para executar os experimentos
foi um Intel R Core
TM
2 Duo CPU T6500 @ 2.10GHz com 4GB de memria RAM, rodando
Ubuntu Linux 10.10 x86_64 2.6.35-28-generic.
Para tal teste o vdeo utilizado foi a sequncia Foreman, a qual tambm ser utilizada
nos experimentos com vdeo, detalhados no Captulo 6. O nico parmetro modicado no
arquivo de congurao da JM (JVT, 2011) foi o mtodo de busca, que passou do padro
(fast fullsearch) para o fullsearch, que a busca exaustiva. Os demais parmetros utilizados
so os que vm como exemplo junto com o download da JM. A saber, as informaes mais
importantes cabem resoluo do arquivo, 176x144, o nmero de quadros a serem codicados,
cinco quadros, e a taxa de quadros, 30fps. Os valores da Tabela 5.1 esto de acordo com tais
conguraes.
Tabela 5.1: Tabela com resultados da anlise dinmica da JM(JVT, 2011) para a sequncia Foreman.
%
tempo
segundos
(cumula-
tivo)
segundos chamadas funo
96.63 174.89 174.89 132255585 computeSAD
1.23 177.12 2.23 40095 FullPelBlockMotionSearch
1.17 179.23 2.11 18768006 computeSADWP
0.48 180.10 0.87 1423426 computeBiPredSAD2
0.24 180.53 0.43 1428991 computeBiPredSAD1
Os resultados da anlise dinmica mostram que o clculo das mtricas de similaridade para
a estimao de movimento so fator de grande impacto na execuo da codicao de vdeo.
Muito disso se deve ao fato do uso do teste exaustivo, portanto mais experimentos devem ser
feitos para uma melhor anlise do impacto das mtricas de similaridade.
52
5.2 Arquivo de congurao
No software de referncia do H.264/AVC (JVT, 2011) um arquivo de congurao uti-
lizado para a congurao das suas diversas opes. Por exemplo, para a congurao da
mtrica de distoro a ser a ser utilizada, o seguinte trecho do arquivo de congurao deve ser
editado:
MEDistortionFPel = 0 # Select error metric for Full-Pel ME (0: SAD, 1: SSE, 2: Hadamard SAD)
MEDistortionHPel = 0 # Select error metric for Half-Pel ME (0: SAD, 1: SSE, 2: Hadamard SAD)
MEDistortionQPel = 0 # Select error metric for Quarter-Pel ME (0: SAD, 1: SSE, 2: Hadamard SAD)
Ou seja, colocando o valor em 0 para cada um dos parmetros, selecionado como mtrica
de distoro a SAD. O primeiro parmetro indica a mtrica a ser utilizada para a ME de pixel
inteiro, e os seguintes so, respectivamente, de meio e quarto de pixel, como mostrado na Seo
2.3.3.
53
6 Resultados Experimentais
Com objetivo de avaliar primariamente o desempenho das mtricas estudadas (descritas no
Captulo 4) e, principalmente, de avaliar a qualidade do uso de tais mtricas, so propostas
duas formas de avaliao. A primeira delas uma avaliao simples para imagens estticas,
utilizando apenas nove candidatos por bloco (4x4), mantendo assim um maior controle sobre a
execuo da avaliao, e podendo demonstrar com as prprias imagens resultantes da escolha
de cada mtrica a qualidade nal obtida. J para uma melhor adaptao ao contexto de com-
presso de vdeo, tambm foi efetuada uma avaliao das mtricas, quando utilizadas no padro
H.264/AVC (Subseo 2.2.1 e Seo 2.3). Neste Captulo sero descritos os resultados de tais
avaliaes das mtricas estudadas em software.
6.1 Imagens Estticas
Devido simplicidade de implementao de testes em software com imagens estticas,
foi desenvolvida usando a linguagem Java uma aplicao para avaliar a qualidade de imagens
usando as mtricas em estudo. Uma vez que no h outras otimizaes do codicador de vdeo,
como por exemplo a Otimizao Taxa-Distoro - Rate-Distortion Otimization - (RDO), a dis-
toro gerada deve-se apenas escolha do bloco pela mtrica avaliada.
Cada imagem analisada dividida em blocos e para cada um destes so gerados, utilizando
os algoritmos de gerao de blocos intra 4x4 (ver Subseo 2.3.4) do software de referncia do
H.264/AVC (JVT, 2011), nove candidatos similares. Ento, aplica-se cada uma das mtricas
em estudo para avaliar o melhor casamento entre o bloco em questo e os nove candidatos
gerados. O melhor candidato gerado ocupar o lugar do candidato em questo, formando uma
nova imagem. Essa nova imagem ser comparada com a sua original para cada mtrica de
similaridade em estudo, em termos de resduo, qualidade em SSIM e Relao Sinal-Rudo de
Pico - Peak signal-to-noise ratio - (PSNR).
Com o objetivo de no poluir o trabalho com excesso de grcos e tabelas, foram seleciona-
dos apenas trs testes, dentre os 15 demais, para que sejam comentados. Os demais resultados
54
Figura 6.1: Primeira imagem de teste, teste 4
podem ser observados no Anexo A. A escolha da primeira imagem foi feita dentre as imagens
com menor resoluo (256x256 pixels) utilizando sorteio
1
. A escolha das imagens seguintes
deveu-se ao fato das duas serem bastante utilizadas na literatura, e muito conhecidas na rea
de imagem digital (Lena e Baboon). Ambas as imagens possuem resoluo de 512x512 pixels.
Todos os testes operaram sobre a amostra de luminncia das imagens. O cdigo fonte de gera-
o das amostras, assim como a macro criada para testar a qualidade da imagem com a mtrica
SSIM esto tambm em anexo (B.1 e B.2, respectivamente).
As imagens (b) at (i) na Figura 6.2 mostram a imagem (a) remontada a partir das nove
amostras intra, de acordo com uma mtrica de distoro. Observa-se que visivelmente no
h muitas diferenas nas imagens (remontadas). A grande semelhana se encontra nas partes
menos complexas da imagem (a), no caso o cu. Para esta imagem as maiores diferenas se
encontram nos contornos da casa, onde mais perceptvel a diferena entre as escolhas de cada
mtrica. V-se claramente a perda ao se utilizarem amostras intra principalmente na parede da
casa, onde no mais possvel identicar os detalhes dos tijolos.
Tabela 6.1: Tabela de resultados para a Figura 6.1.
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 27.8605 0.9142 3.4039
DC 26.4248 0.8844 4.1988
MainDiagonal 26.6252 0.8854 3.8922
Kernell 26.4076 0.8759 3.9769
Border 27.821 0.9095 3.4603
Cross 27.6842 0.9092 3.5059
CheckerOdd 26.9779 0.8979 3.7477
CheckerEven 26.5879 0.9089 3.884
1
Primeiro nmero entre 1 e 8 (cada um representando uma das imagens de teste), sorteado em (RAN-
DOM.ORG, 2011).
55
(a) Original (Luma) (b) SAD (c) DC
(d) Main-Diagonal (e) Kernell-SAD (f) Border-SAD
(g) Cross-SAD (h) Kernell-SAD (i) Border-SAD
Figura 6.2: Resultados sobre o teste 4.
A Tabela 6.1 mostra os resultados de PSNR, SSIM e resduo(%) (Equao 6.1). Observa-se
que a melhor mtrica, em todos os requisitos foi a SAD
2
. Dessa, as que mais se aproximaram
foram a Border, Cross e Checker Even. interessante perceber que mesmo a Border utilizando
75% dos dados do bloco, os resultados de SSIM foram pouco diferentes entre estes trs padres
(sendo que os dois ltimos utilizam 50% dos dados). Uma maneira simples de visualizar estes
dados est nas Figuras 6.3, 6.4 e 6.5, nas quais so apresentados grcos onde cada uma das
mtricas est disposta lado a lado a m de serem comparadas com as demais para SSIM, PSNR
e resduo.
Na Figura 6.3 torna-se visvel o fato das mtricas Border, Cross e Checker Even terem re-
2
Ao se analisar apenas em software, sem contar a anlise de tempo. Parte da implementao em software
levou em considerao a anlise de tempo, mas a execuo dos testes sofreu pela utuao de uso do processador,
resultando em valores bastante variados, poluindo assim os resultados. Dessa forma optou-se por deixar de fora
deste trabalho tais resultados.
56
Figura 6.3: SSIM de cada uma das mtricas em estudo para o teste 4.
sultados similares entre si e prximos ao valor da SAD. Ainda, h uma boa diferena entre os
valores de Checker Even e Checker Odd, mostrando que, mesmo para padres bastante simi-
lares, pode-se deixar de lado partes importantes da imagem, no importando o padro usado, ao
se utilizar a tcnica de pel decimation.
Figura 6.4: PSNR de cada uma das mtricas em estudo para o teste 4.
J a Figura 6.4 mostra que, com resultados de PSNR, o padro Border chega muito prximo
SAD e para os padres Checker o resultado se inverte, ambos agora sendo menores que Cross.
O valor de PSNR entre Checker Even e Main Diagonal aproximadamente o mesmo, ainda que
o ltimo padro faa pel decimation 4:1 e o primeiro seja 2:1.
percentual_residuo =
M

i=0
N

j=0
|img_reconstruida
i, j
img_original
i, j
|
M

i=0
N

j=0
img_original
i, j
(6.1)
57
O resduo nos testes indica a quantidade de dados que restou da subtrao da imagem ori-
ginal com a imagem reconstruda. Seu percentual foi calculado de acordo com a Equao 6.1.
Intuitivamente, observa-se que h uma grande correlao entre os resultados de resduo e qua-
lidade (SSIM e PSNR) para a grande maioria dos casos
3
, de forma que quanto maior o resduo,
menor a qualidade. Deve-se notar que, tanto pela qualidade quanto pela taxa de compresso,
importante ter um valor baixo de resduo
4
.
Figura 6.5: Resduo de cada uma das mtricas em estudo para o teste 4.
A Figura 6.5 mostra o resduo das mtricas para o teste 4 e a Figura 6.6 mostra os resduos
de cada mtrica sobre o teste 4. Nesta ltima, deve-se notar que onde se concentra o resduo
a mtrica em questo teve um resultado no muito bom. Isso pode ser devido dois fatores:
baixo nmero de candidatos (nove para este teste) ou escolha de um candidato que no seja to
similar ao que se est tentando comparar, ou seja, para estes casos a inuncia da mtrica
bastante importante.
A prxima imagem de teste (teste 11) conhecida por Lena, Figura 6.7, e muito usada
na rea de imagem digital. Sua resoluo, 512x512, o dobro da imagem cujos resultados
foram apresentados at aqui. Dessa forma, os pontos tendem a carregar menos informao. A
Tabela 6.2 mostra os resultados precisos de cada mtrica para este teste. Novamente a SAD
obteve os melhores resultados, enquanto a DC obteve os piores. Pode-se notar tambm que os
resultados so prximos (em comportamento) com os resultados do teste 4. Tal fato ca mais
claro ao se analisar os grcos.
Na Figura 6.8 pode-se observar o comportamento da SSIM para a imagem Lena. Tais valo-
3
Mesmo no tendo apresentado at este ponto todos os resultados, os mesmos podem ser tambm observados
no Anexo A.
4
Nestes testes, uma vez que independem de vetores de movimento e outros valores que inuenciam no bitrate
nal em, por exemplo, um vdeo.
58
(a) Original
(Luma)
(b) Resduo SAD (c) Resduo DC
(d) Resduo Main-
Diagonal
(e) Resduo
Kernell-SAD
(f) Resduo
Border-SAD
(g) Resduo Cross-
SAD
(h) Resduo
Kernell-SAD
(i) Resduo
Border-SAD
Figura 6.6: Resduos sobre o teste 4.
Figura 6.7: Segunda imagem de teste, teste 11 (Lena).
res tm comportamento um pouco diferente do teste 4, sendo que dessa vez o pior resultado
no mais da Kernell, mas sim da DC. A diferena entre os padres Checker j no mais
to grande, sendo pouco perceptvel no grco. Novamente, com exceo da SAD, o melhor
resultado do padro Border. Tal comportamento observado tambm na Figura 6.9.
Os valores de PSNRtambm diferemum pouco dos resultados do teste 4, onde se percebe
uma diferena maior entre Kernell e Main Diagonal. Tambm as diferenas entre as quatro
ltimas colunas do grco da Figura 6.9 so menores que as diferenas presentes no grco da
Figura 6.4. Com a reduo da diferena entre grande parte das mtricas, destaca-se a diferena
da mtrica DC, a qual mesmo utilizando todos os dados do bloco obteve os pior resultado. Outro
fato a se notar nos grcos que h uma grande proximidade entre os valores das mtricas que
59
Tabela 6.2: Tabela de resultados para a Figura 6.7 (Lena).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 30.9636 0.9487 3.2018
DC 28.7178 0.9183 4.0542
MainDiagonal 29.3576 0.9234 3.6822
Kernell 29.3386 0.9256 3.6831
Border 30.827 0.945 3.2734
Cross 30.6909 0.9439 3.3119
CheckerOdd 30.4096 0.9425 3.4364
CheckerEven 30.3356 0.9427 3.4284
Figura 6.8: SSIM de cada uma das mtricas em estudo para o teste 11.
utilizam propores de amostragem iguais. Tal fato de causa conhecida, uma vez que ao se
amostrar menos valores a estimao ca menos precisa. Mas por outro lado, a forma como os
valores so utilizados tambm inui bastante, o que bem visvel ao se conhecer que a mtrica
DC est utilizando todos os valores do bloco e tem piores resultados.
Sobre os resultados do resduo da estimao (os quais podem ser observados na Figura
6.10), DC a mtrica de similaridade com maior resduo, e novamente os padres com resduo
mais prximos SAD so Border e Cross. Kernell e Main Diagonal, que utilizam apenas 25%
dos pixels dos blocos, resultando assim em estimaes com menores resduos do que DC, que
utiliza todo o bloco, reforando o comentrio em relao aos resultados de PSNR.
A Figura 6.11 mostra a imagem utilizada como teste 10. Tambm bastante utilizada
na rea de imagem digital, assim como a Lena, e comumente chamada de Baboon. Os
valores com maiores detalhes podem ser vistos na Tabela 6.3. Os resultados deste teste so
muito interessantes, uma vez que grande parte da imagem contm grande complexidade (bem
60
Figura 6.9: PSNR de cada uma das mtricas em estudo para o teste 11.
Figura 6.10: Resduo de cada uma das mtricas em estudo para o teste 11.
visvel na pelagem do babuno). Tal fato reete em um maior resduo e muito provavelmente
pior qualidade. Uma vez que a PSNR no prpria para comparaes entre imagens diferentes
(como comentado na Seo 6.2), pode-se apenas fazer uma anlise comparativa entre os testes
atravs do percentual de resduo de cada um destes e SSIM.
Figura 6.11: Segunda imagem de teste, teste 10 (Baboon).
Sendo assim, como a SSIM tambm pode ser utilizada para comparaes, percebe-se que
seus valores para o teste 10 (Figura 6.12) so menores que para os testes 4 e 11. Vale
lembrar que o valor de SSIM melhor conforme se aproxima de um, sendo que quando seu
61
Tabela 6.3: Tabela de resultados para a Figura 6.11 (Baboon).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 22.2561 0.7493 10.2071
DC 20.8129 0.6541 12.4235
MainDiagonal 21.258 0.6725 11.5001
Kernell 21.1087 0.6777 11.6051
Border 21.9714 0.7283 10.5474
Cross 21.9156 0.7278 10.6497
CheckerOdd 21.4676 0.7074 11.2673
CheckerEven 21.5207 0.708 11.1078
valor igual a um as imagens comparadas so a mesma. Portanto o teste 11 tem os melhores
valores de SSIM, sendo acima de 0.9. J os valores de SSIM para o teste 10 so entre
0.65 e 0.75, tendo portanto menor qualidade. Apesar das diferenas, os melhores resultados se
mantm, e os piores variam mais. Comportamentalmente se aproximam mais os resultados dos
testes 10 e 11, principalmente no que concerne s mtricas com pior aproveitamento.
Figura 6.12: SSIM de cada uma das mtricas em estudo para o teste 10, Baboon.
O comportamento de PSNR, conforme se observa na Figura 6.13, se assemelha bastante
aos dois testes anteriores, tendo uma variao um pouco maior do que o teste 11, e um pouco
menor do que no teste 4.
J o resduo do teste Baboon bastante maior que nos testes anteriores. Os dois primeiros
tinham resduo de 4% em ambos, e para o teste 10 tal valor subiu para prximo de 11%,
ou seja, aumentou quase trs vezes. Como j citado, isso se deve ao fato do aumento da com-
plexidade na imagem. A variao de resduo entre as mtricas tambm maior, mas o compor-
tamento continua similar, apenas com uma diferena comportamental entre os padres Checker
62
Figura 6.13: PSNR de cada uma das mtricas em estudo para o teste 10, Baboon.
entre os testes 10 e 4, ou 11 e 4.
Figura 6.14: Resduo de cada uma das mtricas em estudo para o teste 10, Baboon.
6.2 Vdeo
Para a avaliao de qualidade em vdeo foi usado o software de referncia do H.264/AVC
(JVT, 2011) (JM), modicado para utilizar as mtricas em estudo. So comparados os valores
de bitrate, qualidade em SSIM e PSNR. O software de referncia do H.264/AVC (JVT, 2011)
foi escolhido por ser comumente utilizado para prova de conceitos em diversos trabalhos na
literatura. A JM melhor descrita no Captulo 5, bem como o ambiente de desenvolvimento
usado para alteraes no cdigo da mesma. Embora tenha baixo desempenho, por ser referncia,
seu cdigo busca implementar risca o padro. Os fontes modicados do software de referncia
encontram-se no Anexo B.5.
63
Para os testes com vdeos, foram selecionados vdeos que correspondem um mix de re-
soluo e qualidade, tambm utilizados por Moraes (2010). Os vdeos utilizados foram obtidos
no repositrio da Xiph.org (2011), tendo sido selecionado um quadro por vdeo, os quais so
mostrados na Figura 6.15.
Figura 6.15: Vdeos de teste utilizados para avaliao de qualidade em vdeo das mtricas de similaridade
estudadas. Fonte: (XIPH.ORG, 2011)
Como visto na Seo 5.2 , o software de referncia congurado atravs de um arquivo.
Para os testes executados, optou-se por utilizar um arquivo de congurao para cada modo
de busca
5
, e todos eles com mtricas de distoro com SAD selecionada. Esta deciso se
deve ao fato de no criar muitas modicaes no cdigo, procurando escapar de referncias no
encontradas. Cada uma das mtricas ento uma modicao na funo computeSAD
6
. Assim,
no necessrio encontrar todos os pontos do cdigo onde a funo chamada, nem mesmo
modicar a inicializao do software de referncia para que este tenha o novo ponteiro de cada
funo para o clculo da distoro. Ento cada mtrica implementada em um novo ambiente,
e a escolha da mtrica em tempo de programao. Outras possibilidades poderiam ser em
tempo de compilao ou mesmo em tempo de execuo (usando o arquivo de congurao), e
est previsto como trabalho futuro (Captulo 8). As demais conguraes selecionadas podem
ser conferidas no Anexo B.6.
5
Modos de busca podem ser, de acordo com o arquivo de congurao: Full Search, Fast Full Search (default),
UMHexagon Search, Simplied UMHexagon Search e Enhanced Predictive Zonal Search (EPZS); sendo que para
os testes foi deixada de lado a busca Simplied UMHexagon Search.
6
Encontra-se no arquivo me_distortion.c.
64
Os testes de vdeo foram extensivos e a execuo destes ocorreu sob as seguintes
7
congu-
raes:
Dual Intel R Xeon R CPU E5620 12288 KB Cache @ 2.40GHz com 12GB de memria
RAM, rodando Linux 2.6.32-5-amd64 #1 SMP:
Kernell, Checker Even, Checker Odd, SAD, Cross, Diagonal;
Intel R Core
TM
i7-2600 CPU 8192 KB Cache @ 3.40GHz com 4GB de memria RAM,
rodando Linux 2.6.38-11-generic #50-Ubuntu SMP:
DC e Border;
Devido ao alto tempo de processamento de cada vdeo
8
, limitou-se 25 o nmero de
quadros a serem codicados por amostra. Dessa forma, cada cena de curta durao tem al-
gumas caractersticas a serem notadas:
Big Buck Bunny - Cena de fade-in e computao grca.
Ducks Take Off - Alta complexidade, com movimentao de gua no transparente (ondas
em uma lagoa).
Foreman - Baixa resoluo e pouco movimento.
In to Tree - Cena de zoom, com rvores (alta complexidade para manter a naturalidade
das folhas).
Park Joy - Alta movimentao, folhas e gua. Elementos prximos (troncos logo em
frente cmera) e elementos distantes (outras rvores).
Riverbed - Ondas em gua transparente, bastante complexo e texturas das pedras no fundo
do rio.
Soccer - Baixa resoluo, um pouco mais movimentado do que Foreman, mas com mais
elementos.
Sunower - Bastante detalhado, alguma movimentao, mas com pouca variao de ilu-
minao e cores.
7
Os testes foram feitos paralelamente em dois computadores para acelerar a obteno dos resultados, mas as
diferentes conguraes no inuenciam os resultados de qualidade.
8
Aproximadamente 30 minutos por quadro para um vdeo 1080p.
65
Os grcos foram gerados a partir dos dados coletados da sada de estatsticas do codi-
cador de referncia (JVT, 2011) do padro H.264/AVC. Os valores foram amostrados para as
mtricas de similaridade apresentadas, algoritmos de busca disponveis no codicador e vdeos
de teste. Cada um dos grcos apresenta para um vdeo os valores de custo em Kbytes (R) por
dB (D), contra os algoritmos de busca, para cada mtrica. Tal abordagem (R/D) foi adotada
para que haja uma noo de Taxa-Distoro - Rate-Distortion - (RD), e tambm por no existir
meios de controlar o codicador de referncia(JVT, 2011) para adotar determinada taxa.
Figura 6.16: As duas imagens possuem o mesmo PSNR, mas o rudo est distribudo em regies diferentes.
Fonte: (WINKLER, 2005).
A mtrica de distoro utilizada para a comparao foi a PSNR. Tal mtrica utilizada
comumente para medir a diferena entre os quadros fontes e os quadros codicados em uma
sequncia de vdeo. bastante conhecido o problema da PSNR quando se trata de correlacionar
tal erro (diferena) com a percepo visual humana. Tal fato pode ser observado nas duas
imagens da Figura 6.16, as quais tem o mesmo PSNR, mas a imagem direita de melhor
qualidade visual que a outra. Ao se comparar duas sequncias de vdeo diferentes, o PSNR
tem pouco valor. Por outro lado, duas medidas de PSNR para uma mesma sequncia demonstra
muito bem o potencial de dois codicadores
9
(LARBIER, 2011).
Os grcos das Figuras 6.17 at 6.24 demonstram os resultados alcanados com cada
mtrica em cada algoritmo de busca, para os vdeos tomados como exemplo.Um ponto bas-
tante interessante a ser notado na Figura 6.17 o fato da Border ter melhor resultado que a
SAD na fullsearch. O segundo melhor resultado foi o do Checker Odd, sendo que este foi tam-
bm o melhor no algoritmo fastfullsearch. Para este ltimo, os padres Checker Even e Border
e SAD tem resultados bastante prximos, e inclusive, melhores do que os demais resultados em
fullsearch. Os demais padres tem resultados piores do que a SAD, resultado j esperado. Entre
Kernell e Main Diagonal os melhores resultados foram do primeiro para todos os algoritmos de
busca.
9
No caso o codicador o mesmo, mas as mtricas so diferentes, sendo vlido utilizar o PSNR para compara-
o e demonstrao dos resultados.
66
Figura 6.17: Resultados da sequncia de teste Foreman para as mtricas utilizadas no codicador (JVT, 2011).
Figura 6.18: Resultados da sequncia de teste Soccer para as mtricas utilizadas no codicador (JVT, 2011).
67
No grco da Figura 6.18 o resultado foi mais prximo ao esperado, sendo que os melhores
resultados foram no algoritmo de fullsearch. Mas no algoritmo fastfullsearch, o melhor ganho
no foi da SAD como esperado, mas sim do padro Border. No algoritmo epzs o padro Cross
teve resultado melhor do que os padres Checker.
Figura 6.19: Resultados da sequncia de teste Sunower para as mtricas utilizadas no codicador (JVT,
2011).
Tambm no grco presente na Figura 6.19, os resultados foram de acordo com o esperado
em sua maioria. Principalmente no que concerne ao algoritmo fullsearch ter os melhores resul-
tados. V-se tambm que para o algoritmo fastfullsearch o comportamento do padro Border
deixou de ser melhor que a SAD (no caso do fullsearch) e, excetuando o padro Main Di-
agonal, teve os piores resultados. No algoritmo epzs, o resultado de Checker Odd foi muito
prximo ao da SAD, sendo os dois melhores resultados para este algoritmo de busca. No al-
goritmo umhexagonsearch o melhor resultado foi o da SAD, seguido por Cross e Border. J o
padro Checker Even, bastante prximo do resultado da SAD em fastfullsearch, teve os piores
resultados no umhexagonsearch.
Na Figura 6.20 os resultados do algoritmo epzs foram melhores que os de fullsearch e
fastfullsearch. Em um mesmo algoritmo, pode-se observar que os resultados pouco variaram,
embora algo que destoa dos demais grcos pode ser percebido: no algoritmo fullsearch a
mtrica DC obteve o melhor custo R sobre a distoro. Seguido por Kernell, o qual tambm
68
Figura 6.20: Resultados da sequncia de teste Ducks Take Off para as mtricas utilizadas no codicador (JVT,
2011).
teve bons resultados para o algoritmo uhmhexagonsearch. J neste ltimo algoritmo DC e
Border obtiveram os piores resultados.
Tambm no grco da Figura 6.21 os resultados de fullsearch no foram os melhores. Este
s foi melhor que o algoritmo umhexagonsearch. Neste, os resultados foram bastante parecidos
entre si, destacando o Border como melhor resultado e picos de taxa por dB para a DC e Main
Diagonal. Novamente, a mtrica DC teve os melhores resultados para o fullsearch, em conjunto
com Border, e nos demais algoritmos tambm teve bons resultados, sendo praticamente igual
ao resultado de Main Diagonal para fastfullsearch e muito prximo SAD no algoritmo epzs.
interessante notar tal comportamento da mtrica DC, uma vez que esta costuma apresentar
resultados inferiores s demais, como aconteceu no algoritmo umhexagonsearch.
Para a Figura 6.22, o comportamento esperado, tanto da SADquanto do algoritmo fullsearch
mantido. Ou seja, o resultado da SAD neste algoritmo foi o melhor. interessante notar quo
prximos foram os resultados de Main Diagonal, Kernell e DC nos algoritmos fullsearch e epzs.
Em todos os algoritmos os melhores resultados foram da mtrica SAD, seguidos pela mtrica
Border, a qual utiliza mais informao do bloco.
Na Figura 6.23, os resultados foram quase todos muito prximos, o que interessante para
69
Figura 6.21: Resultados da sequncia de teste In to the Tree para as mtricas utilizadas no codicador (JVT,
2011).
Figura 6.22: Resultados da sequncia de teste Park Joy para as mtricas utilizadas no codicador (JVT, 2011).
70
Figura 6.23: Resultados da sequncia de teste Big Buck Bunny para as mtricas utilizadas no codicador (JVT,
2011).
ser analisado. Uma vez que a cena codicada era um "fade-in", havia pouca diferena entre os
blocos em um mesmo quadro, e entre os quadros tambm a variao era pouca. Alm disso,
o padro H.264/AVC prev predio com peso, adequada exatamente para tais casos. E como
a cena no tinha muito movimento, a predio pde ser bastante localizada, existindo assim
pouca diferena no acerto dos padres. Tambm pelo fato de existir pouca informao (a maior
parte da cena era escura), mtricas como a Main Diagonal (que utiliza apenas 25% dos pixels
do bloco) tiveram preciso bastante prxima s demais.
No caso da Figura 6.24, tambm o resultado foi bem prximo do esperado, apenas no
algoritmo fullsearch o melhor resultado foi do padro Checker Odd. Fora estes caso, SAD
obteve os melhores resultados para cada algoritmo de busca. Tambm a diferena dos resultados
do algoritmo umhexagonsearch no mais to grande como nas demais Figuras.
Percebe-se, entre as Figuras 6.18 e 6.17, certa anidade entre as buscas fullsearch e umhexagon-
search. Tais arquivos de testes tem similaridade em relao resoluo (ambos de baixa reso-
luo). Muito possivelmente, a diferena perceptvel entre os algoritmos fastfullsearch e epzs
so devidos maior movimentao da cena para o arquivo de teste "Soccer".
71
Figura 6.24: Resultados da sequncia de teste Riverbed para as mtricas utilizadas no codicador (JVT, 2011).
6.3 Conluso Sobre os Resultados Experimentais
Resumidamente, a respeito dos resultados experimentais sobre imagem e vdeo, pode-se
armar que:
Para imagemesttica os padres de subamostragemcommelhores resultados foramCross
e Border;
O melhor padro de subamostragem a ser utilizado depende do contedo do vdeo e do
algoritmo de busca utilizado;
O padro de subamostragem usado atualmente (Checker) para pel decimation no sem-
pre o melhor;
At mesmo o uso do bloco completo no resulta necessariamente na melhor escolha;
Cenas com pouca informao no perdem qualidade com o uso de subamostragem.
72
7 Estimativa de custos de Hardware
Este Captulo destina-se uma rpida anlise sobre a literatura no que concerne s arquite-
turas para o clculo da SAD para a estimao de movimento, visando o padro H.264/AVC.
Tambm so estimados os custos de uma arquitetura totalmente paralela para o clculo das
mtricas emestudo, utilizando os resultados de sntese lgica apresentados por Monteiro (2011).
As arquiteturas existentes na literatura so vrias, e neste trabalho o foco a ecincia
energtica das mesmas. Em (CHEN et al., 2006) apresentada uma arquitetura de um co-
dicador H.264/AVC para resoluo 720p. Nesta proposta, apenas o clculo da SAD ocupa
aproximadamente 33% do total de portas (gate-count). Outro exemplo de implementao com
grande nmero de portas para o clculo da SAD apresentado por Liu et al. (2007), onde tal
nmero corresponde a cerca de 79% do total do codicador. V-se a a importncia de imple-
mentaes de mtricas de similaridade com baixo consumo energtico. Infelizmente, alguns
trabalhos com propostas diferenciadas para a SAD, como o proposto no artigo sobre o codi-
cador 720p (CHEN et al., 2006) e tambm em (VANNE et al., 2006) e (YUFEI; XIUBO; QIN,
2007) apenas otimizam quanto rea e atraso crtico, mas deixam de lado aspectos de potncia
e ecincia energtica.
Em (MONTEIRO, 2011), arquiteturas dos somadores Carry-Ripple Adder (CRA), Carry-
Lookahead Adder (CLA), Carry-Select Adder (CSA), Add-One Carry-Select Adder (A1CSA) e
Hierarchical Add-One Carry-Select Adder (A1CSAH) foram descritas em Verilog e ento sin-
tetizadas logicamente com a ferramenta Design Compiler
1
da Synopsys (2011). No processo
de sntese lgica foi utilizada a biblioteca de clulas 45nm da Taiwan Semiconductor Manu-
facturing Company Limited (TSMC). Os resultados para atraso crtico, potncia e rea foram
reportados pelo Design Compiler no modo chamado Topographical que, segundo os manuais
de seu desenvolvedor (SYNOPSYS, 2011), utiliza os dados da simulao eltrica das clulas
ao sintetizar e reportar os dados de um projeto, levando em conta informaes de roteamento e
posicionamento.
A partir de tais resultados, percebeu-se que, para dados de at 12 bits (mximo alcanvel
1
O qual uma ferramenta comercial amplamente utilizada no uxo Standard-Cells.
73
pela SAD), os somadores CRA e CLA so os com melhor trade-off de velocidade e potncia.
Dentre estes, o CLA possui menor atraso crtico. Por outro lado, o CRA tem menor consumo de
potncia. Nas prximas Sees so estimados os custos para cada uma das mtricas utilizando
os resultados de Monteiro (2011) considerando estes dois somadores. Como Monteiro (2011)
faz a sntese para estes somadores de 2 at 8 bits e como sero necessrios somadores de at 11
bits, os demais valores (de 9 at 11 bits) foram calculados atravs de uma regresso no-linear
dos dados existentes. Tal regresso foi obtida atravs do software LABFit (2011), o qual busca
o menor erro em sua base de aproximadamente 280 funes. Assim, para cada conjunto de
valores de rea, atraso e potncia, e para cada somador (CLA e CRA), foi buscada a melhor
funo de ajuste nos dados existentes. Destas funes foram calculados os demais valores,
buscando minimizar os erros da estimativa.
7.1 SAD
Prope-se aqui a utilizao de um bloco operativo (datapath) totalmente paralelo para o
clculo da SAD. Na Figura 7.1 h o projeto de um bloco bsico de soma de diferenas abso-
lutas, nominado EP
2
. Este processa paralelamente 2 pixels de cada bloco da imagem (bloco
original e bloco referncia). Na Figura 7.2 mostra-se um bloco operativo totalmente paralelo
para o clculo da SAD de blocos 4x4, sendo P
A
e P
B
as entradas de acordo com a Figura 7.3.
No mapeamento mostrado na Figura 7.3, cada pixel considerado ter 8 bits, uma vez que
considerado cada canal de cor separadamente, por exemplo, luma. Assim so necessrios 128
bits para cada bloco 4x4 de pixel. A abordagem com tal paralelismo mostrou ser bastante e-
ciente energeticamente por Walter, Diniz e Bampi (2011), no qual os melhores resultados so
da abordagem com 16 entradas e 1 estgio de pipeline apenas.
Para a realizao do bloco operativo de SAD da Figura 7.2, so necessrios 16 subtratores,
16 extratores de valor absoluto, e 15 somadores. O caminho crtico pode ser aproximado pela
passagem por um subtrator, um extrator de valor absoluto e quatro somadores. Transformando
tais fatos em funes do tamanho da entrada n
3
temos as seguintes Equaes aproximadas de
potncia e de atraso crtico:
potencia
SAD
(n) = n potencia
subtrator
+n potencia
abs
+(n1) potencia
somador
(7.1)
2
Elemento de Processamento.
3
Pixels de um bloco. E considerando n como potncia de 2. No caso de um bloco 4x4 so 16 entradas.
74
Figura 7.1: Esquema geral bloco responsvel pelas subtraes e primeira soma da SAD, chamado de bloco EP.
Cada um destes blocos processa dois pixels por vez.
Figura 7.2: Projeto de um bloco operativo totalmente paralelo para a SAD.
atraso
SAD
(n) = atraso
subtrator
+atraso
abs
+log
2
natraso
somador
(7.2)
Ao se levar em considerao que a cada nvel de soma h o crescimento das entradas dos
somadores do prximo nvel em um bit, a Equao 7.1 pode ser renada, conduzindo a Equao
7.3. Uma vez que s h resultados de sntese lgica para somadores, parte-se para uma apro-
ximao dos valores de consumo para os demais blocos necessrios, ou seja, subtrao e valor
75
Figura 7.3: Possvel mapeamento do bloco candidato e referncia (A e B) para as entradas do clculo da SAD.
absoluto. Aproxima-se aqui o subtrator ao somador, deixando de lado a potncia gerada pelo
nmero de inversores a serem agregados a cada bit de cada subtrator. O mesmo ser feito para o
extrator de valor absoluto. Dessa forma, os valores da potncia podem ser calculados de acordo
com a Equao simplicada 7.4.
potencia
SAD
(n) = n potencia
subtrator
+n potencia
abs
+
log
2
n1

i=0
(2
i
potencia
somador(7+log
2
ni)
))
(7.3)
potencia
SAD
(n) =
5n
2
potencia
somador(8)
+
log
2
n2

i=0
(2
i
potencia
somador(7+log
2
ni)
) +erro (7.4)
Tambm o atraso crtico deve levar em considerao o crescimento do nmero de bits na
cadeia de somas e a substituio dos valores de atraso dos subtratores e extratores de valor
absoluto por somadores. Logo a Equao 7.2 pode ser descrita nessa forma atravs da Equao
7.5.
atraso
SAD
(n) = 3atraso
somador(8))
+
log
2
n2

i=0
atraso
somador(9+i)
+erro (7.5)
A partir das equaes 7.4 e 7.5, e dos resultados descritos em (MONTEIRO, 2011), pode-
se estimar
4
o consumo e atraso para um bloco SAD totalmente paralelo, como o da Figura 7.2.
Assim, o atraso crtico estimado de 2045,37 ps e sua potncia total estimada de 1755,5
W para o somador CLA. Para o somador CRA os valores so de 2513,45 ps e de 1129,99
4
Sendo uma estimativa, deixou-se de lado a parcela erro das Equaes 7.4 e 7.5. Este erro na estimativa surge
ao se considerar que as implementaes de somadores, subtratores e extratores de mdulo tero, para um mesmo
nmero de bits, os mesmos valores de potncia e atraso. Tambm h certo erro da interpolao, uma vez que os
dados interpolados podem no ter na realidade a tendncia apresentada pelos dados que foram obtidos atravs de
simulao.
76
W.
7.2 Pel Decimation 2:1
Todos os padres que utilizam 50% de informaes do bloco so padres de amostragem
do algoritmo de pel decimation 2:1. Dentre as mtricas em estudo, as que fazem parte deste
conjunto so a Cross e Checker
5
. Uma vez que neste trabalho o estudo dos padres est dirigido
sobre a SAD, o projeto proposto na Seo 7.1 vlido como proposta de pel decimation 2:1,
apenas removendo 50% dos blocos EP e as somas subsequentes. Em um projeto incluindo
arquiteturas de bloco de controle e memrias, deveria ser considerado uma variao na emisso
de endereos ou no carregamento de memrias intermedirias.
Todavia, para esta abordagem mais simplista considerado apenas o bloco operativo e, ao
utilizar apenas esta quantidade da informao do bloco (de pixels), pode ser feita uma anlise
tambm da reduo do atraso crtico e consumo, podendo utilizar as equaes 7.5 e 7.4, sendo
n igual a 8. Assim, para o algoritmo pel decimation 2:1 e para o somador CLA , o atraso crtico
estimado do circuito totalmente paralelo de 1654,49 ps e sua potncia 845,9 W. J
utilizando para a estimativa o somador CRA, os valores de atraso e potncia so de 2087,02
ps e 549,14 W, respectivamente.
7.3 Pel Decimation 4:1
Assim como nos padres de pel decimation 2:1, os padres de pel decimation 4:1
6
tambm
podem utilizar da mesma arquitetura paralela da Figura 7.2. Utilizando apenas 25% da infor-
mao do bloco, pode-se estimar atraso e consumo tambm pelas equaes 7.5 e 7.4, sendo n
igual a 4. Portanto, a estimativa para atraso de 1288,90 ps e a estimativa de potncia de
396,95 W para CLA e de 1650,22 ps e 260,1 W para CRA.
7.4 Border
Um caso parte o Border, que utiliza 75% do bloco. Suas estimativas de potncia e atraso
so 1306,55 W e 2045,37 ps, respectivamente para o CLA e 840,95 W e 2513,45
ps, respectivamente para o CRA. O caminho crtico o mesmo da SAD completa, assim seu
5
Odd e Even.
6
a saber: Kernell e Main Diagonal.
77
atraso crtico o mesmo. J o nmero de somadores necessrios ser reduzido, reduzindo assim
tambm sua potncia.
7.5 Comparao
Figura 7.4: Comparativo dos atrasos estimados para as mtricas com os somadores CLA e CRA.
No grco presente na Figura 7.4 so comparados os valores de atraso crtico para cada
uma das quatro propostas: SAD completa, Border, Pel Decimation 2:1 e Pel Decimation 4:1.
As estimativas de potncia apresentadas primeiramente no grco da Figura 7.5 so as j apre-
sentadas nas Sees especcas de cada mtrica, assim como os valores de atraso crtico do
grco na Figura 7.4.
Figura 7.5: Comparativo do consumo de potncia para as mtricas com os somadores CLA e CRA.
78
Os valores de rea, apresentados primeiramente na forma de grco(Figura 7.6) foram
derivados atravs da Equao 7.4, substituindo os valores de consumo dos somadores pelos
respectivos valores de rea.
Figura 7.6: Comparativo dos custos de rea para as mtricas com os somadores CLA e CRA.
A Tabela 7.1 mostra os valores comparativos das estimativas de atraso crtico, potncia e
rea para cada uma das mtricas e cada um dos somadores utilizados para estimativa. Tambm
includo na tabela o valor do Produto Atraso-Potncia - Power-Delay Product - (PDP) para
uma estimativa de ecincia energtica das mtricas. Tal valor a multiplicao do atraso pelo
consumo de potncia do circuito, e assim como esta, varia conforme a atividade de chavea-
mento do circuito. Assim, seus valores esto de acordo com os experimentos realizados em
(MONTEIRO, 2011).
Tabela 7.1: Tabela comparativa das mtricas estudadas, estimadas com somadores CLA e CRA. Valores estima-
dos a partir de (MONTEIRO, 2011).
Mtrica Atraso Crtico (ps) Potncia (W) rea (m
2
) PDP (pJ)
CLA CRA CLA CRA CLA CRA CLA CRA
SAD 2045,37 2513,45 1755,5 1129,99 4074,40 1706,67 3,59 2,84
Border 2045,37 2513,45 1306,55 840,95 3031,41 1270,08 2,67 2,11
2:1 1654,49 2087,02 845,9 549,14 1970,84 829,08 1,4 1,15
4:1 1288,90 1650,22 396,95 260,1 927,86 392,49 0,51 0,43
Percebe-se na Tabela 7.1 que a verso de mtrica de custo feita com somadores CLA so
os mais rpidos, e que o decrscimo do uso de valores do bloco de pixels no muda muito tal
valor, assim como no caso do CRA. O atraso crtico da implementao com CRAs so 1,24x
79
vezes maior que o da implementao com CLAs. J no caso da potncia, o CRA obtm os
melhores resultados (tambm em rea e ecincia energtica). E o decrscimo do uso de pixels
do bloco resulta em grande reduo de potncia, tambm em ambas as implementaes com os
dois somadores. As implementaes com o CLA apresentam 1,54x mais potncia do que o
CRA e tem rea 2,37x maior que este.
Figura 7.7: Comparativo do PDP para as propostas. Valores estimados a partir de (MONTEIRO, 2011).
No grco da Figura 7.7 os valores de PDP so mostrados, de acordo com a Tabela 7.1.
As diferenas de PDP vo decrescendo entre as implementaes conforme diminui o padro de
amostragem. Sendo que a implementao com CRA 1,22x mais eciente energeticamente
que a implementaao com CLA. Percebe-se que o padro mais eciente o da pel decimation
4:1, como era esperado, anal utiliza apenas 25% da informao de cada bloco de pixel.
7.6 Blocos de outros tamanhos
No caso de blocos de outros tamanhos, pode ser utilizada a mesma ideia proposta na Seo
4.4. Ou seja, utilizar clculos parciais de alguma das mtricas, e depois somar os resultados.
Em questo de hardware ento, utilizariam alguns somadores a mais, com maiores larguras
de bits. H tambm na literatura propostas de aproveitar o clculo de SADs parciais para as
possibilidades de Tamanho de Bloco Varivel - Variable Block Size - (VBS), o que previsto
no padro H.264/AVC. Assim pode-se acelerar o processo da ME.
80
7.7 DC
A mtrica DC utiliza o mesmo nmero de coecientes da SAD, com a vantagem de extrair
mdulo apenas uma vez. Outra vantagem que cada um dos elementos da matriz sempre
somado um ao outro, no necessitando por exemplo utilizar complemento de dois na entrada de
um somador para obter a subtrao. Uma nova estratgia de ME pode ser denida a partir da
ideia de funo hash. Considerando a DC funo hash de cada bloco, cada qual ser mapeado
em um valor, o que pode ser feito poucas vezes no processo de ME, ao contrrio do modo usual,
que calcular a cada bloco (anal necessrio fazer isso, pois encontrada a diferena entre os
blocos). Fica claro que os resultados em termos de qualidade tendem a ser ruins uma vez que
utilizando, por exemplo, a DC, a posio de cada pixel deixada de lado, acumulando apenas
sua energia. Mas o processo pode se tornar mais rpido e mais eciente. Tal abordagem
(clculo de funo hash para cada bloco) faz parte dos trabalhos futuros.
81
8 Concluses e trabalhos futuros
Neste trabalho foram apresentados conceitos bsicos de codicao de vdeo digital, com
nfase em alguns aspectos do padro H.264/AVC. Foram apresentadas mtricas de similaridade,
para comparao de imagens. A mtrica SAD foi explorada atravs de amostragens (algoritmo
conhecido na literatura como pel decimation) e foram expostos padres para a amostragem de
pontos em um bloco de pixels da entrada desta.
Tais padres e tambm uma nova proposta de mtrica (DC) foram testadas para saber o
impacto das mesmas, principalmente em questo de qualidade, uma vez que grande parte delas
tm boas perspectivas de implementao em hardware. Tais perspectivas e alguns ganhos foram
descritos de forma aproximada com resultados de Monteiro (2011) para hardware.
A partir da compilao de resultados apresentados neste trabalho viu-se que a melhor forma
de fazer subamostragem (para o algoritmo de pel decimation) nos blocos 4x4 no necessaria-
mente a atualmente utilizada (Checker), sendo que modicaes nos padres de subamostragem
geram diferentes resultados, podendo ser melhores ou piores do que o utilizado, dependendo do
caso. Tornou-se claro tambm que h uma variao grande nos resultados, de acordo com a
complexidade do vdeo, o que abre a possibilidade de melhorias neste sentido. Infelizmente,
tais abordagens so bastante custosas, por exemplo, para a identicao prvia de parte da
complexidade para a busca se adequar ao contedo. Em um vdeo com pouca complexidade, no
caso a cena de fade-in do teste Big Buck Bunny, a qualidade no sofreu com o uso de menos
informao do bloco.
Analisando-se as estimativas em hardware, em conjunto com os resultados dos testes em
software, foi demonstrado que vale a pena fazer a subamostragem na maioria dos casos, e que
as perdas em qualidade so bastante pequenas. De acordo com o padro a ser utilizado e com
a complexidade do vdeo a ser codicado, os resultados podem ser inclusive melhores do que
com a SAD. Tambm pde ser notado que a SAD nem sempre retorna o melhor resultado, e
nem mesmo o algoritmo fullsearch o faz, sendo que dependendo o caso, como as mtricas nem
sempre reetem as melhores escolhas futuras de RD, algoritmos mais rpidos, com menor rea
de busca, atingem resultados melhores.
82
Tambm neste trabalho abriu-se um leque de trabalhos futuros, os quais podem ser explo-
rados, como por exemplo os seguintes:
Incluir as novas mtricas como possveis de serem selecionadas em tempo de execuo
(atravs do arquivo de congurao) no software de referncia do padro H.264/AVC
(JVT, 2011);
Testar padres de amostragem para o algoritmo de pel decimation em blocos com ta-
manhos diferentes de 4x4 (usando a denio exata do padro, diminuindo assim mais
ainda a complexidade do clculo). Com tal estudo pode-se determinar com mais clareza
o impacto da subamostragem nas entradas das mtricas de deciso;
Testar os mesmos padres apresentados neste trabalho utilizando outras mtricas diferen-
tes da SAD, como por exemplo a SSD;
Vericar a possibilidade de fazer ME utilizando funes hash para cada bloco, econo-
mizando em muito operaes aritmticas. Analisar o impacto da qualidade da predio e
o custo-benefcio de tal abordagem;
Implementar tal subamostragem e os variados padres no codicador x264 (MERRITT
et al., 2004), o qual muito mais rpido que o software de referncia (JVT, 2011), possi-
bilitando testes mais longos e permitindo uma anlise mais apurada de curvas de RD;
Implementao em hardware dos padres de pel decimation.
83
Referncias Bibliogrcas
AHMED, N.; NATARAJAN, T.; RAO, K. R. Discrete cosine transform. IEEE Transactions on
Computers, C-23, n. 1, p. 9093, jan 1974. ISSN 0018-9340.
BENNETT, H. Hughs News. 2011. Disponvel em: <http://www.hughsnews.ca/faqs-
/authoritative-blu-ray-disc-bd-faq/4-physical-logical-and-application-specications4.6>.
BROWN, M. Advanced Digital Photography. [S.l.]: Media Publishing, 2004. ISBN
9780958188852.
CHEN, T. et al. Analysis and architecture design of an HDTV720p 30 frames/s H.264/AVC
encoder. IEEE Transactions on Circuits and Systems for Video Technology, v. 16, n. 6, p. 673
688, jun 2006. ISSN 1051-8215.
ECLIPSE. Eclipse - The Eclipse Foundation open source community website. 2011. Disponvel
em: <http://www.eclipse.org/>.
GPROF. GNU Binutils. 2007. Disponvel em: <http://www.gnu.org/software/binutils/>.
ITU-T. H.264 Corrigendum 1. jan 2009.
JACK, K.; TSATSULIN, V. Dictionary of video and television technology. [S.l.]: Gulf
Professional Publishing, 2002. ISBN 9781878707994.
JUNIOR, R. C. F.; KANAAN, A.; GOMES, J. M. S. de M. As Ferramentas do Astrnomo:
O que medimos, como medimos e o que aprendemos. 2002. Disponvel em: <http://www-
.telescopiosnaescola.pro.br/ferramentas.pdf>.
JVT. JM JOINT VIDEO TEAM Reference Software. 2011. Disponvel em: <http://iphome.hhi-
.de/suehring/tml/>.
KUHN, P. M. Fast mpeg-4 motion estimation: Processor based and exible vlsi
implementations. The Journal of VLSI Signal Processing, Springer Netherlands, v. 23, p.
6792, 1999. ISSN 0922-5773. 10.1023/A:1008192719838. Disponvel em: <http://dx.doi-
.org/10.1023/A:1008192719838>.
LABFIT. LAB Fit Curve Fitting Software. 2011. Disponvel em: <http://zeus.df.ufcg.edu.br-
/labt/>.
LARBIER, P. Using 10-bit AVC/H.264 encoding with 4:2:2 for broadcast contribution.
In: . Las Vegas Convention Center, Las Vegas, Nevada USA: [s.n.], 2011. Disponvel em:
<http://extranet.ateme.com/download.php?le=1114>.
LEE, K. et al. QME: an efcient subsampling-based block matching algorithm for motion
estimation. In: Proceedings of the 2004 International Symposium on Circuits and Systems,
2004. ISCAS 04. [S.l.]: IEEE, 2004. v. 2, p. II 3058 Vol.2. ISBN 0-7803-8251-X.
84
LIU, Z. et al. 32-Parallel SAD tree hardwired engine for variable block size motion estimation
in HDTV1080P Real-Time encoding application. In: 2007 IEEE Workshop on Signal
Processing Systems. [S.l.]: IEEE, 2007. p. 675680. ISBN 978-1-4244-1222-8.
MANOEL, E. T. M. Codicao de Vdeo H.264 - Estudo de Codicao Mista de
Macroblocos. Dissertao (Monograa) UFSC, 2007.
MANZATO, M. G. Tcnicas e Padres de Codicao de Vdeo. Dissertao (Trabalho de
Concluso de Curso) UEL, 2004.
MATHEWS, N. M.; MUSSER, C.; ART, W. C. M. of. Moving pictures: American art and
early lm, 1880-1910. [S.l.]: Hudson Hills, 2005. ISBN 9781555952280.
MERRITT, L. et al. Projeto x264. 2004. Disponvel em: <http://developers.videolan.org/x264-
.html>.
MONTEIRO, J. L. Hierarchical Add-One Carry-Select Adder: Um Somador Select-Adder com
Cadeia de Carry Logartmica. Dissertao (Trabalho de Concluso de Curso) UFSC, 2011.
MORAES, B. G. de. Uma mtrica para Taxa de Distoro voltada codicao de vdeo
perceptiva. Dissertao (Trabalho de Concluso de Curso) UFSC, 2010.
Nowell-Smith, G. The Oxford History of World Cinema. [S.l.]: Oxford University Press, USA,
1999. ISBN 0198742428.
PORTO, M. S. Investigao de Algoritmos e Desenvolvimento Arquitetural para Estimao de
Movimento em Compresso de Vdeo Digital. Dissertao (Trabalho de Concluso de Curso)
UFPel, 2006.
POYNTON, C. A. Digital video and HDTV: algorithms and interfaces. [S.l.]: Morgan
Kaufmann, 2003. ISBN 9781558607927.
RANDOM.ORG. RANDOM - True Random Number Service. 2011. Disponvel em:
<http://www.random.org/>.
READER, C. Video Coding IPR Issues. 2002. Disponvel em: <http://www.avs.org.cn/avsdoc-
/2003-7-30/Cliff.pdf>.
RICHARDSON, I. E. G. Video codec design: developing image and video compression
systems. [S.l.]: John Wiley and Sons, 2002. ISBN 9780471485537.
RICHARDSON, I. E. G. H. 264 and MPEG-4 video compression: video coding for
next-generation multimedia. [S.l.]: John Wiley & Sons Inc, 2003.
SALOMON, D. Data compression: the complete reference. [S.l.]: Springer, 2007. ISBN
9781846286025.
SULLIVAN, G. J. Overview of international video coding standards (preceding h.264/avc). In:
. [S.l.]: Presented at Workshop on Video and Image Coding and Applications (VICA), 2005.
SYNOPSYS. Synopsyss Design Compiler User Guide, Version C-2009.06. 2011.
TAYLOR, J. DVD Frequently Asked Questions (and Answers). 2011. Disponvel em:
<http://www.dvddemystied.com/dvdfaq.html3.4.1>.
85
TAYLOR, J.; JOHNSON, M. R.; CRAWFORD, C. G. DVD demystied. [S.l.]: McGraw-Hill
Professional, 2006. ISBN 9780071423960.
THE USC SIPI Image Database. 1977. Disponvel em: <http://sipi.usc.edu/database/>.
VANNE, J. et al. A high-performance sum of absolute difference implementation for motion
estimation. IEEE Transactions on Circuits and Systems for Video Technology, v. 16, n. 7, p.
876883, jul 2006. ISSN 1051-8215.
VIJAYAKUMAR. A peek @ H.264. 2008. Material de curso com Dr. K. R. Rao, em maio
2009.
WALTER, F. L.; DINIZ, C. M.; BAMPI, S. Synthesis and comparison of low-power
high-throughput architectures for SAD calculation. In: 2011 IEEE Second Latin American
Symposium on Circuits and Systems (LASCAS). [S.l.]: IEEE, 2011. p. 14. ISBN
978-1-4244-9484-2.
WANG, Z. et al. Image quality assessment: From error visibility to structural similarity. IEEE
TRANSACTIONS ON IMAGE PROCESSING VOL. 13 NO. 4 APRIL 2004, p. 13, 2004.
WINKLER, S. Digital video quality: vision models and metrics. [S.l.]: John Wiley and Sons,
2005. ISBN 9780470024041.
WOOTTON, C. A practical guide to video and audio compression: from sprockets and rasters
to macroblocks. [S.l.]: Elsevier, 2005. ISBN 9780240806303.
WU, H.; RAO, K. Digital Video Image Quality and Perceptual Coding. [S.l.]: CRC Press,
2005. ISBN 9780824727772.
XIPH.ORG. Xiph.org Test Media Repository. 2011. Disponvel em: <http://media.xiph.org/>.
YUFEI, L.; XIUBO, F.; QIN, W. A High-Performance low cost SAD architecture for video
coding. IEEE Transactions on Consumer Electronics, v. 53, n. 2, p. 535541, may 2007. ISSN
0098-3063.
86
ANEXO A -- Resultados da avaliao em software
das mtricas em estudo
A.1 Imagens de Teste
(a) teste 0 (b) teste 1 (c) teste 2 (d) teste 3
(e) teste 4 (f) teste 5 (g) teste 6 (h) teste 7
(i) teste 8 (j) teste 9 (k) teste 10 (l) teste 11
(m) teste 12 (n) teste 13 (o) teste 14
Figura A.1: Imagens utilizadas para efetuar os testes de imagem esttica em software.
As imagens mostradas na Figura A.1 mostram as imagens utilizadas para os testes em
software de imagens estticas. As imagens so todas conhecidas da rea de imagem digital,
87
e foram obtidas em (THE. . . , 1977). Os resultados dos testes esto mostrados nas prximas
Sees deste Anexo.
A.2 Resumo dos Resultados
Nesta Seo se encontram as tabelas com os dados resumidos de todos os testes executados
com as imagens. Cada tabela apresenta valores de qualidade mensurada em PSNR e SSIM.
Tambm apresentado o percentual de resduo mantido em cada imagem aps a escolha dos
blocos substitutos, de acordo com a Equao 6.1.
Tabela A.1: Tabela de resultados para a gura A.1 (a).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 29.6374 0.9333 6.5673
DC 28.0218 0.9067 7.9779
MainDiagonal 27.9403 0.9081 7.6229
Kernell 28.2974 0.9112 7.4806
Border 29.5297 0.9295 6.7037
Cross 29.4095 0.9297 6.7587
CheckerOdd 29.0153 0.9262 7.0898
CheckerEven 28.8658 0.9264 7.0602
Tabela A.2: Tabela de resultados para a gura A.1 (b).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 29.8179 0.9197 9.0758
DC 28.1916 0.8816 11.458
MainDiagonal 28.6993 0.8924 10.3116
Kernell 28.6061 0.8921 10.3639
Border 29.6599 0.9143 9.2852
Cross 29.6443 0.9165 9.3105
CheckerOdd 29.3123 0.9106 9.7175
CheckerEven 29.1437 0.9091 9.7834
As tabelas A.5, A.11 e A.12 e seus respectivos grcos so melhor detalhados na seo 6.1.
88
Tabela A.3: Tabela de resultados para a gura A.1 (c).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 25.9346 0.9419 2.7013
DC 25.2289 0.9301 3.1716
MainDiagonal 25.2389 0.9243 3.059
Kernell 24.6569 0.9257 3.1042
Border 25.9038 0.9388 2.7464
Cross 25.6687 0.9391 2.7805
CheckerOdd 25.6549 0.9351 2.886
CheckerEven 25.7347 0.9361 2.892
Tabela A.4: Tabela de resultados para a gura A.1 (d).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 29.8793 0.9503 3.2254
DC 28.5775 0.932 3.8768
MainDiagonal 28.7619 0.9297 3.6638
Kernell 28.6799 0.9279 3.7002
Border 29.8248 0.9482 3.279
Cross 29.7468 0.9478 3.3069
CheckerOdd 29.6777 0.9473 3.3936
CheckerEven 29.5746 0.9458 3.4026
Tabela A.5: Tabela de resultados para a gura A.1 (e).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 27.8605 0.9142 3.4039
DC 26.4248 0.8844 4.1988
MainDiagonal 26.6252 0.8854 3.8922
Kernell 26.4076 0.8759 3.9769
Border 27.821 0.9095 3.4603
Cross 27.6842 0.9092 3.5059
CheckerOdd 26.9779 0.8979 3.7477
CheckerEven 26.5879 0.9089 3.884
89
Tabela A.6: Tabela de resultados para a gura A.1 (f).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 23.0371 0.8602 7.5205
DC 21.6946 0.8116 9.1872
MainDiagonal 21.8248 0.8094 8.7522
Kernell 21.9159 0.8174 8.5708
Border 22.7932 0.8503 7.7467
Cross 22.8138 0.8509 7.7622
CheckerOdd 22.2733 0.8439 8.2937
CheckerEven 22.2818 0.8378 8.2152
Tabela A.7: Tabela de resultados para a gura A.1 (g).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 31.7212 0.9765 1.2386
DC 29.9786 0.9669 1.5811
MainDiagonal 29.2453 0.9518 1.5359
Kernell 29.8232 0.9581 1.457
Border 31.6205 0.975 1.2668
Cross 31.5463 0.9755 1.2696
CheckerOdd 31.1504 0.9743 1.3509
CheckerEven 30.9301 0.9746 1.3488
Tabela A.8: Tabela de resultados para a gura A.1 (h).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 29.5236 0.9665 1.9582
DC 27.6729 0.9505 2.5219
MainDiagonal 27.7108 0.9409 2.3449
Kernell 28.1715 0.951 2.234
Border 29.4405 0.9647 1.9999
Cross 29.3841 0.9655 1.9993
CheckerOdd 28.9478 0.9632 2.1247
CheckerEven 28.7926 0.9631 2.134
90
Tabela A.9: Tabela de resultados para a gura A.1 (i).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 33.6557 0.9494 2.439
DC 31.9527 0.9329 2.9915
MainDiagonal 32.0076 0.9307 2.8224
Kernell 31.6298 0.9291 2.87
Border 33.5965 0.946 2.4926
Cross 33.4586 0.9454 2.528
CheckerOdd 32.7458 0.9427 2.6904
CheckerEven 32.8228 0.9414 2.6567
Tabela A.10: Tabela de resultados para a gura A.1 (j).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 30.1047 0.9458 1.7867
DC 28.9223 0.9159 2.2363
MainDiagonal 28.9494 0.9196 2.0541
Kernell 28.513 0.9159 2.1004
Border 29.6806 0.9415 1.8572
Cross 29.9309 0.9393 1.8615
CheckerOdd 29.3838 0.9384 1.9623
CheckerEven 29.4124 0.9357 1.9204
Tabela A.11: Tabela de resultados para a gura A.1 (k).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 22.2561 0.7493 10.2071
DC 20.8129 0.6541 12.4235
MainDiagonal 21.258 0.6725 11.5001
Kernell 21.1087 0.6777 11.6051
Border 21.9714 0.7283 10.5474
Cross 21.9156 0.7278 10.6497
CheckerOdd 21.4676 0.7074 11.2673
CheckerEven 21.5207 0.708 11.1078
91
Tabela A.12: Tabela de resultados para a gura A.1 (l).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 30.9636 0.9487 3.2018
DC 28.7178 0.9183 4.0542
MainDiagonal 29.3576 0.9234 3.6822
Kernell 29.3386 0.9256 3.6831
Border 30.827 0.945 3.2734
Cross 30.6909 0.9439 3.3119
CheckerOdd 30.4096 0.9425 3.4364
CheckerEven 30.3356 0.9427 3.4284
Tabela A.13: Tabela de resultados para a gura A.1 (m).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 27.3933 0.9249 2.8335
DC 25.768 0.9 3.5252
MainDiagonal 26.0666 0.9001 3.3076
Kernell 26.1656 0.9022 3.2458
Border 27.2754 0.9199 2.9058
Cross 27.0978 0.9234 2.9331
CheckerOdd 26.0818 0.9187 3.2046
CheckerEven 26.8697 0.9151 3.0302
Tabela A.14: Tabela de resultados para a gura A.1 (n).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 25.8147 0.894 5.8942
DC 24.3686 0.8569 7.1074
MainDiagonal 24.4203 0.8483 6.8502
Kernell 24.6289 0.8559 6.7008
Border 25.6435 0.8863 6.044
Cross 25.5823 0.8857 6.0905
CheckerOdd 25.2207 0.8783 6.3465
CheckerEven 25.119 0.8818 6.3638
92
Tabela A.15: Tabela de resultados para a gura A.1 (o).
Mtrica PSNR (dB) SSIM Resduo (%)
SAD 29.767 0.9417 3.705
DC 28.2932 0.9202 4.4677
MainDiagonal 27.9888 0.9105 4.3259
Kernell 27.8089 0.9108 4.3182
Border 29.6723 0.9382 3.7811
Cross 29.5209 0.9355 3.837
CheckerOdd 28.9373 0.9317 4.0223
CheckerEven 28.9298 0.934 4.0278
93
A.3 SSIM
Os grcos nesta seo correspondem aos valores amostrados de SSIM para cada imagem
de teste, apresentados na seo anterior.
Figura A.2: SSIM de cada uma das mtricas em estudo para o teste 0.
Figura A.3: SSIM de cada uma das mtricas em estudo para o teste 1.
94
Figura A.4: SSIM de cada uma das mtricas em estudo para o teste 2.
Figura A.5: SSIM de cada uma das mtricas em estudo para o teste 3.
95
Figura A.6: SSIM de cada uma das mtricas em estudo para o teste 4.
Figura A.7: SSIM de cada uma das mtricas em estudo para o teste 5.
96
Figura A.8: SSIM de cada uma das mtricas em estudo para o teste 6.
Figura A.9: SSIM de cada uma das mtricas em estudo para o teste 7.
97
Figura A.10: SSIM de cada uma das mtricas em estudo para o teste 8.
Figura A.11: SSIM de cada uma das mtricas em estudo para o teste 9.
98
Figura A.12: SSIM de cada uma das mtricas em estudo para o teste 10.
Figura A.13: SSIM de cada uma das mtricas em estudo para o teste 11.
99
Figura A.14: SSIM de cada uma das mtricas em estudo para o teste 12.
Figura A.15: SSIM de cada uma das mtricas em estudo para o teste 13.
100
Figura A.16: SSIM de cada uma das mtricas em estudo para o teste 14.
101
A.4 PSNR
Os grcos nesta seo correspondem aos valores amostrados de PSNR para cada imagem
de teste, apresentados na seo anterior.
Figura A.17: PSNR de cada uma das mtricas em estudo para o teste 0.
Figura A.18: PSNR de cada uma das mtricas em estudo para o teste 1.
102
Figura A.19: PSNR de cada uma das mtricas em estudo para o teste 2.
Figura A.20: PSNR de cada uma das mtricas em estudo para o teste 3.
103
Figura A.21: PSNR de cada uma das mtricas em estudo para o teste 4.
Figura A.22: PSNR de cada uma das mtricas em estudo para o teste 5.
104
Figura A.23: PSNR de cada uma das mtricas em estudo para o teste 6.
Figura A.24: PSNR de cada uma das mtricas em estudo para o teste 7.
105
Figura A.25: PSNR de cada uma das mtricas em estudo para o teste 8.
Figura A.26: PSNR de cada uma das mtricas em estudo para o teste 9.
106
Figura A.27: PSNR de cada uma das mtricas em estudo para o teste 10.
Figura A.28: PSNR de cada uma das mtricas em estudo para o teste 11.
107
Figura A.29: PSNR de cada uma das mtricas em estudo para o teste 12.
Figura A.30: PSNR de cada uma das mtricas em estudo para o teste 13.
108
Figura A.31: PSNR de cada uma das mtricas em estudo para o teste 14.
109
A.5 Resduo
Os grcos nesta seo correspondem aos valores amostrados de resduo para cada imagem
de teste, de acordo com a equao 6.1.
Figura A.32: Resduo de cada uma das mtricas em estudo para o teste 0.
Figura A.33: Resduo de cada uma das mtricas em estudo para o teste 1.
110
Figura A.34: Resduo de cada uma das mtricas em estudo para o teste 2.
Figura A.35: Resduo de cada uma das mtricas em estudo para o teste 3.
111
Figura A.36: Resduo de cada uma das mtricas em estudo para o teste 4.
Figura A.37: Resduo de cada uma das mtricas em estudo para o teste 5.
112
Figura A.38: Resduo de cada uma das mtricas em estudo para o teste 6.
Figura A.39: Resduo de cada uma das mtricas em estudo para o teste 7.
113
Figura A.40: Resduo de cada uma das mtricas em estudo para o teste 8.
Figura A.41: Resduo de cada uma das mtricas em estudo para o teste 9.
114
Figura A.42: Resduo de cada uma das mtricas em estudo para o teste 10.
Figura A.43: Resduo de cada uma das mtricas em estudo para o teste 11.
115
Figura A.44: Resduo de cada uma das mtricas em estudo para o teste 12.
Figura A.45: Resduo de cada uma das mtricas em estudo para o teste 13.
116
Figura A.46: Resduo de cada uma das mtricas em estudo para o teste 14.
117
ANEXO B -- Cdigo fonte do teste em software
B.1 Aplicao Java - Imagens Estticas
Devido grande quantidade de cdigo, a organizao do mesmo se dar por pacotes, e
dentro de cada pacote as classes. A classe com o mtodo main (MetricTests.java) encontra-
se no pacote metrictests.
B.1.1 collector
DataCollector (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package Collector;
7 import logger.Logger;
import reader.DataFileReader;
9
/**
11 *
* @author Isma
13 */
public class DataCollector {
15
protected DataFileReader reader = new DataFileReader();
17 protected Logger writer;
19 double MaxCollected = Double.MIN_VALUE;
118
double MinCollected = Double.MAX_VALUE;
21
public DataCollector(String outputFileName) {
23 writer = new Logger(outputFileName , false);
}
25
protected void verifyMaxAndMin(double value){
27 if(value > MaxCollected)
MaxCollected = value;
29 if(value < MinCollected)
MinCollected = value;
31 }
33 }
GeneralCollector (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package Collector;
7 import java.util.List;
import metrics.Metric;
9
/**
11 *
* @author Isma
13 */
public class GeneralCollector extends DataCollector {
15
int numberOfTest;
17 List <Metric > metrics;
String dataName = "";
19
119
public GeneralCollector(String outputFileName , String
dataName , List <Metric > metrics , int numberOfTest) {
21 super(outputFileName);
this.metrics = metrics;
23 this.numberOfTest = numberOfTest;
this.dataName = dataName;
25 }
27 public double getMaxCollected() {
return MaxCollected;
29 }
31 public double getMinCollected() {
return MinCollected;
33 }
35 public void generateOutput() {
37 String line = "#";
for (Metric metric : metrics) {
39 line += metric.getName() + "\t";
}
41 writer.write(line + "\n\n");
line = "";
43 double tempValue = 0.0;
for (Metric metric : metrics) {
45 tempValue = reader.getDouble("teste_" +
numberOfTest + "_" + metric.getName() + "_"+
dataName+".txt", 5);
verifyMaxAndMin(tempValue);
47 line += String.valueOf(tempValue) + "\t";
}
49 writer.write(line + "\n");
}
51
120
53
}
SSIMCollector (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package Collector;
6
import java.util.List;
8 import metrics.Metric;
10 /**
*
12 * @author Isma
*/
14 public class SSIMCollector extends DataCollector {
16 int numberOfTest;
List <Metric > metrics;
18
public SSIMCollector(String outputFileName , List <Metric >
metrics , int numberOfTest) {
20 super(outputFileName);
this.metrics = metrics;
22 this.numberOfTest = numberOfTest;
}
24
public double getMaxCollected() {
26 return MaxCollected;
}
28
public double getMinCollected() {
30 return MinCollected;
}
121
32
public void generateOutput() {
34
String line = "#";
36 for (Metric metric : metrics) {
line += metric.getName() + "\t";
38 }
writer.write(line + "\n\n");
40 line = "";
double tempValue = 0.0;
42 for (Metric metric : metrics) {
tempValue = reader.getDouble("teste_" +
numberOfTest + "_" + metric.getName() + "_SSIM.
txt", 5);
44 verifyMaxAndMin(tempValue);
line += String.valueOf(tempValue) + "\t";
46 }
writer.write(line + "\n");
48 }
}
TimeCollector (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package Collector;
7 import java.util.List;
import logger.TimeLogger;
9 import metrics.Metric;
11 /**
*
13 * @author Isma
*/
122
15 public class TimeCollector extends DataCollector{
17 int numberOfTest;
List <Metric > metrics;
19
public TimeCollector(String outputFileName , List <Metric >
metrics , int numberOfTest){
21 super(outputFileName);
this.metrics = metrics;
23 this.numberOfTest = numberOfTest;
}
25
public double getMaxCollected() {
27 return MaxCollected;
}
29
public double getMinCollected() {
31 return MinCollected;
}
33
public void generateOutput(){
35
Metric first = metrics.get(0);
37 double[] temp = reader.getAllDoubles("teste_"+
numberOfTest+"_"+first.getName()+"_time.txt", 4);
int numberOfLines = temp.length;
39
String line = "#";
41 for (Metric metric : metrics) {
line+=metric.getName()+"\t";
43 }
writer.write(line+"\n\n");
45
double[] values;
47 double MSValue = 0.0;
for (int i = 0; i < numberOfLines; i++) {
123
49 line = "";
for (Metric metric : metrics) {
51 values = reader.getAllDoubles("teste_"+
numberOfTest+"_"+metric.getName()+"_time.txt
", 4);
MSValue = TimeLogger.NSToMS(values[i]);
53 verifyMaxAndMin(MSValue);
line+=String.valueOf(MSValue)+"\t";
55 }
writer.write(line+"\n");
57 }
59
61 }
//teste_0_DC_time.txt
63 }
B.1.2 constants
NumericalConstants (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package constants;
7 /**
*
9 * @author Isma
*/
11 public class NumericalConstants {
13 public static final int resultsPrecision = 4;
15 }
124
Paths (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package constants;
7 /**
*
9 * @author Isma
*/
11 public class Paths {
13 public static final String imageJLocation = "";
public static final String imageJPluginFolderAt = "";
15 public static final String gnuplotLocation = "C:\\Users\\
Isma\\Downloads\\gp45 -20110325-win -mingw -test";
17 }
B.1.3 generator
IntraModes (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package generator;
7 import image.Block;
import image.ImageType;
9 import metrics.Metric;
import metrics.MetricType;
11
/**
13 *
* @author Isma
125
15 */
public class IntraModes {
17
ImageType type = ImageType.RGB;
19
public IntraModes(ImageType type) {
21 this.type = type;
}
23
// X A B C D E F G H
25 // I a b c d
// J e f g h
27 // K i j k l
// L m n o p
29 //A = blocoSup.getPixelArray()[12];
//B = blocoSup.getPixelArray()[13];
31 //C = blocoSup.getPixelArray()[14];
//D = blocoSup.getPixelArray()[15];
33 //E = blocoSupDir.getPixelArray()[12];
//F = blocoSupDir.getPixelArray()[13];
35 //G = blocoSupDir.getPixelArray()[14];
//H = blocoSupDir.getPixelArray()[15];
37 //I = blocoEsq.getPixelArray()[3];
//J = blocoEsq.getPixelArray()[7];
39 //K = blocoEsq.getPixelArray()[11];
//L = blocoEsq.getPixelArray()[15];
41 private int mediaArray(Block bloco) {
int sum = 0;
43 for (int i = 0; i < bloco.getPixelArray().length; i++)
{
sum += bloco.getPixelArray()[i].getValue();
45 }
return sum / bloco.getPixelArray().length;
47 }
49 //vertical
126
public Block mode0(Block blocoSup) {
51 int[] intra = new int[16];
for (int i = 0; i < 4; i++) {
53 intra[i + 12] = intra[i + 8] = intra[i + 4] = intra
[i] = blocoSup.getPixelArray()[12 + i].getValue
();
}
55
return new Block(intra , type);
57 }
59 //horizontal
public Block mode1(Block blocoEsq) {
61 int[] intra = new int[16];
for (int i = 0; i < 4; i++) {
63 intra[i] = blocoEsq.getPixelArray()[3].getValue();
intra[i + 4] = blocoEsq.getPixelArray()[7].getValue
();
65 intra[i + 8] = blocoEsq.getPixelArray()[11].
getValue();
intra[i + 12] = blocoEsq.getPixelArray()[15].
getValue();
67 }
return new Block(intra , type);
69 }
71 //DC
public Block mode2(Block blocoEsq , Block blocoSup) {
73 int[] intra = new int[16];
int mean = (mediaArray(blocoEsq) + mediaArray(blocoSup)
) / 2;
75 for (int i = 0; i < 4; i++) {
intra[i] = intra[i + 4] = intra[i + 8] = intra[i +
12] = mean;
77 }
return new Block(intra , type);
127
79 }
81 //diagonal down left
public Block mode3(Block blocoSup , Block blocoSupDir) {
83 int[][] result = new int[4][4];
result [0][0] = (blocoSup.getPixelArray()[12]. getValue()
+ blocoSup.getPixelArray()[14]. getValue() + ((
blocoSup.getPixelArray()[13]. getValue()) << 1) + 2)
>> 2;
85 result [0][1] =
result [1][0] = (blocoSup.getPixelArray()[13].
getValue() + blocoSup.getPixelArray()[15].
getValue() + ((blocoSup.getPixelArray()[14].
getValue()) << 1) + 2) >> 2;
87 result [0][2] =
result [1][1] =
89 result [2][0] = (blocoSup.getPixelArray()[14].
getValue() + blocoSupDir.getPixelArray()
[12]. getValue() + ((blocoSup.getPixelArray()
[15]. getValue()) << 1) + 2) >> 2;
result [0][3] =
91 result [1][2] =
result [2][1] =
93 result [3][0] = (blocoSup.getPixelArray()[15].
getValue() + blocoSupDir.getPixelArray()
[13]. getValue() + ((blocoSupDir.
getPixelArray()[12]. getValue()) << 1) + 2)
>> 2;
result [1][3] =
95 result [2][2] =
result [3][1] = (blocoSupDir.getPixelArray()
[12]. getValue() + blocoSupDir.getPixelArray
()[14]. getValue() + ((blocoSupDir.
getPixelArray()[13]. getValue()) << 1) + 2)
>> 2;
97 result [2][3] =
128
result [3][2] = (blocoSupDir.getPixelArray()
[13]. getValue() + blocoSupDir.getPixelArray
()[15]. getValue() + ((blocoSupDir.
getPixelArray()[14]. getValue()) << 1) + 2)
>> 2;
99 result [3][3] = (blocoSupDir.getPixelArray()[14].
getValue() + 3 * (blocoSupDir.getPixelArray()[15].
getValue()) + 2) >> 2;
return new Block(result , type);
101 }
103 //Diagonal Down Right
public Block mode4(Block blocoSupEsq , Block blocoEsq , Block
blocoSup) {
105 int[][] result = new int[4][4];
result [3][0] = (blocoEsq.getPixelArray()[15]. getValue()
+ 2 * blocoEsq.getPixelArray()[11]. getValue() +
blocoEsq.getPixelArray()[7].getValue() + 2) >> 2;
107 result [2][0] =
result [3][1] = (blocoEsq.getPixelArray()[11].
getValue() + 2 * blocoEsq.getPixelArray()
[7].getValue() + blocoEsq.getPixelArray()
[3].getValue() + 2) >> 2;
109 result [1][0] =
result [2][1] =
111 result [3][2] = (blocoEsq.getPixelArray()[7].
getValue() + 2 * blocoEsq.getPixelArray()
[3].getValue() + blocoSupEsq.getPixelArray()
[15]. getValue() + 2) >> 2;
result [0][0] =
113 result [1][1] =
result [2][2] =
115 result [3][3] = (blocoEsq.getPixelArray()[3].
getValue() + 2 * blocoSupEsq.getPixelArray()
[15]. getValue() + blocoSup.getPixelArray()
[12]. getValue() + 2) >> 2;
129
result [0][1] =
117 result [1][2] =
result [2][3] = (blocoSupEsq.getPixelArray()
[15]. getValue() + 2 * blocoSup.getPixelArray
()[12]. getValue() + blocoSup.getPixelArray()
[13]. getValue() + 2) >> 2;
119 result [0][2] =
result [1][3] = (blocoSup.getPixelArray()[12].
getValue() + 2 * blocoSup.getPixelArray()
[13]. getValue() + blocoSup.getPixelArray()
[14]. getValue() + 2) >> 2;
121 result [0][3] = (blocoSup.getPixelArray()[13]. getValue()
+ 2 * blocoSup.getPixelArray()[14]. getValue() +
blocoSup.getPixelArray()[15]. getValue() + 2) >> 2;
return new Block(result , type);
123 }
125 //Vertical Right
public Block mode5(Block blocoSupEsq , Block blocoEsq , Block
blocoSup) {
127 int[][] result = new int[4][4];
result [0][0] =
129 result [2][1] = (blocoSupEsq.getPixelArray()
[15]. getValue() + blocoSup.getPixelArray()
[12]. getValue() + 1) >> 1;
result [0][1] =
131 result [2][2] = (blocoSup.getPixelArray()[12].
getValue() + blocoSup.getPixelArray()[13].
getValue() + 1) >> 1;
result [0][2] =
133 result [2][3] = (blocoSup.getPixelArray()[13].
getValue() + blocoSup.getPixelArray()[14].
getValue() + 1) >> 1;
result [0][3] = (blocoSup.getPixelArray()[14]. getValue()
+ blocoSup.getPixelArray()[15]. getValue() + 1) >>
1;
130
135 result [1][0] =
result [3][1] = (blocoEsq.getPixelArray()[3].
getValue() + 2 * blocoSupEsq.getPixelArray()
[15]. getValue() + blocoSup.getPixelArray()
[12]. getValue() + 2) >> 2;
137 result [1][1] =
result [3][2] = (blocoSupEsq.getPixelArray()
[15]. getValue() + 2 * blocoSup.getPixelArray
()[12]. getValue() + blocoSup.getPixelArray()
[13]. getValue() + 2) >> 2;
139 result [1][2] =
result [3][3] = (blocoSup.getPixelArray()[12].
getValue() + 2 * blocoSup.getPixelArray()
[13]. getValue() + blocoSup.getPixelArray()
[14]. getValue() + 2) >> 2;
141 result [1][3] = (blocoSup.getPixelArray()[13]. getValue()
+ 2 * blocoSup.getPixelArray()[14]. getValue() +
blocoSup.getPixelArray()[15]. getValue() + 2) >> 2;
result [2][0] = (blocoSupEsq.getPixelArray()[15].
getValue() + 2 * blocoEsq.getPixelArray()[3].
getValue() + blocoEsq.getPixelArray()[7].getValue()
+ 2) >> 2;
143 result [3][0] = (blocoEsq.getPixelArray()[3].getValue()
+ 2 * blocoEsq.getPixelArray()[7].getValue() +
blocoEsq.getPixelArray()[11]. getValue() + 2) >> 2;
return new Block(result , type);
145 }
147 //Horizontal Down
public Block mode6(Block blocoSupEsq , Block blocoEsq , Block
blocoSup) {
149 int[][] result = new int[4][4];
result [0][0] =
151 result [1][2] = (blocoSupEsq.getPixelArray()
[15]. getValue() + blocoEsq.getPixelArray()
[3].getValue() + 1) >> 1;
131
result [0][1] =
153 result [1][3] = (blocoEsq.getPixelArray()[3].
getValue() + 2 * blocoSupEsq.getPixelArray()
[15]. getValue() + blocoSup.getPixelArray()
[12]. getValue() + 2) >> 2;
result [0][2] = (blocoSupEsq.getPixelArray()[15].
getValue() + 2 * blocoSup.getPixelArray()[12].
getValue() + blocoSup.getPixelArray()[13]. getValue()
+ 2) >> 2;
155 result [0][3] = (blocoSup.getPixelArray()[12]. getValue()
+ 2 * blocoSup.getPixelArray()[13]. getValue() +
blocoSup.getPixelArray()[14]. getValue() + 2) >> 2;
result [1][0] =
157 result [2][2] = (blocoEsq.getPixelArray()[3].
getValue() + blocoEsq.getPixelArray()[7].
getValue() + 1) >> 1;
result [1][1] =
159 result [2][3] = (blocoSupEsq.getPixelArray()
[15]. getValue() + 2 * blocoEsq.getPixelArray
()[3].getValue() + blocoEsq.getPixelArray()
[7].getValue() + 2) >> 2;
result [2][0] =
161 result [3][2] = (blocoEsq.getPixelArray()[7].
getValue() + blocoEsq.getPixelArray()[11].
getValue() + 1) >> 1;
result [2][1] =
163 result [3][3] = (blocoEsq.getPixelArray()[3].
getValue() + 2 * blocoEsq.getPixelArray()
[7].getValue() + blocoEsq.getPixelArray()
[11]. getValue() + 2) >> 2;
result [3][0] = (blocoEsq.getPixelArray()[11]. getValue()
+ blocoEsq.getPixelArray()[15]. getValue() + 1) >>
1;
165 result [3][1] = (blocoEsq.getPixelArray()[7].getValue()
+ 2 * blocoEsq.getPixelArray()[11]. getValue() +
blocoEsq.getPixelArray()[15]. getValue() + 2) >> 2;
132
return new Block(result , type);
167 }
169 //Vertical Left
public Block mode7(Block blocoSup , Block blocoSupDir) {
171 int[][] result = new int[4][4];
result [0][0] = (blocoSup.getPixelArray()[12]. getValue()
+ blocoSup.getPixelArray()[13]. getValue() + 1) >>
1;
173 result [0][1] =
result [2][0] = (blocoSup.getPixelArray()[13].
getValue() + blocoSup.getPixelArray()[14].
getValue() + 1) >> 1;
175 result [0][2] =
result [2][1] = (blocoSup.getPixelArray()[14].
getValue() + blocoSup.getPixelArray()[15].
getValue() + 1) >> 1;
177 result [0][3] =
result [2][2] = (blocoSup.getPixelArray()[15].
getValue() + blocoSupDir.getPixelArray()
[12]. getValue() + 1) >> 1;
179 result [2][3] = (blocoSupDir.getPixelArray()[12].
getValue() + blocoSupDir.getPixelArray()[13].
getValue() + 1) >> 1;
result [1][0] = (blocoSup.getPixelArray()[12]. getValue()
+ ((blocoSup.getPixelArray()[13]. getValue()) << 1)
+ blocoSup.getPixelArray()[14]. getValue() + 2) >> 2;
181 result [1][1] =
result [3][0] = (blocoSup.getPixelArray()[13].
getValue() + ((blocoSup.getPixelArray()[14].
getValue()) << 1) + blocoSup.getPixelArray()
[15]. getValue() + 2) >> 2;
183 result [1][2] =
result [3][1] = (blocoSup.getPixelArray()[14].
getValue() + ((blocoSup.getPixelArray()[15].
getValue()) << 1) + blocoSupDir.
133
getPixelArray()[12]. getValue() + 2) >> 2;
185 result [1][3] =
result [3][2] = (blocoSup.getPixelArray()[15].
getValue() + ((blocoSupDir.getPixelArray()
[12]. getValue()) << 1) + blocoSupDir.
getPixelArray()[13]. getValue() + 2) >> 2;
187 result [3][3] = (blocoSupDir.getPixelArray()[12].
getValue() + ((blocoSupDir.getPixelArray()[13].
getValue()) << 1) + blocoSupDir.getPixelArray()[14].
getValue() + 2) >> 2;
return new Block(result , type);
189 }
191 //Horizontal Up
public Block mode8(Block blocoEsq) {
193 int[][] result = new int[4][4];
result [0][0] = (blocoEsq.getPixelArray()[3].getValue()
+ blocoEsq.getPixelArray()[7].getValue() + 1) >> 1;
195 result [0][1] = (blocoEsq.getPixelArray()[3].getValue()
+ 2 * blocoEsq.getPixelArray()[7].getValue() +
blocoEsq.getPixelArray()[11]. getValue() + 2) >> 2;
result [0][2] =
197 result [1][0] = (blocoEsq.getPixelArray()[7].
getValue() + blocoEsq.getPixelArray()[11].
getValue() + 1) >> 1;
result [0][3] =
199 result [1][1] = (blocoEsq.getPixelArray()[7].
getValue() + 2 * blocoEsq.getPixelArray()
[11]. getValue() + blocoEsq.getPixelArray()
[15]. getValue() + 2) >> 2;
result [1][2] =
201 result [2][0] = (blocoEsq.getPixelArray()[11].
getValue() + blocoEsq.getPixelArray()[15].
getValue() + 1) >> 1;
result [1][3] =
134
203 result [2][1] = (blocoEsq.getPixelArray()[11].
getValue() + 2 * blocoEsq.getPixelArray()
[15]. getValue() + blocoEsq.getPixelArray()
[15]. getValue() + 2) >> 2;
result [3][0] =
205 result [2][2] =
result [2][3] =
207 result [3][1] =
result [3][2] =
209 result [3][3] = blocoEsq.getPixelArray()[15].
getValue();
return new Block(result , type);
211 }
213 public Block bestMatchWithMetric(Metric metric , Block
reference , Block blocoEsq , Block blocoSupEsq , Block
blocoSup , Block blocoSupDir) {
int tempValue;
215 int bestValue;
Block bestMatch = null, tempMatch;
217 if (metric.getType() == MetricType.LESS) {
bestValue = Integer.MAX_VALUE;
219 for (int i = 0; i < 9; i++) {
tempMatch = this.intra(blocoEsq , blocoSupEsq ,
blocoSup , blocoSupDir , (byte) i);
221 tempValue = metric.calculate(reference ,
tempMatch);
if (tempValue < bestValue) {
223 bestValue = tempValue;
bestMatch = tempMatch;
225 }
}
227 return bestMatch;
}
229 bestValue = Integer.MIN_VALUE;
for (int i = 0; i < 9; i++) {
135
231 tempMatch = this.intra(blocoEsq , blocoSupEsq ,
blocoSup , blocoSupDir , (byte) i);
tempValue = metric.calculate(reference , tempMatch);
233 if (tempValue > bestValue) {
bestValue = tempValue;
235 bestMatch = tempMatch;
}
237 }
return bestMatch;
239 }
241 public Block intra(Block blocoEsq , Block blocoSupEsq , Block
blocoSup , Block blocoSupDir , byte mode) {
switch (mode) {
243 case 0:
return mode0(blocoSupDir);
245 case 1:
return mode1(blocoEsq);
247 case 2:
return mode2(blocoEsq , blocoSupDir);
249 case 3:
return mode3(blocoSup , blocoSupDir);
251 case 4:
return mode4(blocoSupEsq , blocoEsq , blocoSupDir
);
253 case 5:
return mode5(blocoSupEsq , blocoEsq , blocoSupDir
);
255 case 6:
return mode6(blocoSupEsq , blocoEsq , blocoSupDir
);
257 case 7:
return mode7(blocoSup , blocoSupDir);
259 case 8:
return mode8(blocoEsq);
261 default:
136
return null;
263 }
}
265 }
B.1.4 graphics
BoxPlotter (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 import java.util.List;
import logger.Logger;
9
/**
11 *
* @author Isma
13 */
public abstract class BoxPlotter extends GNUPlotPNGPrinter {
15
17 private int minimumY = 45, maximumY = 70;
19 public void setMinimumY(int minimumY) {
this.minimumY = minimumY;
21 }
23 public void setMaximumY(int maximumY) {
this.maximumY = maximumY;
25 }
27 public abstract String getXTics();
137
29 public abstract String getLocations();
31 public abstract void updateDataSet();
33 @Override
protected void writeGNUPlotMacro() {
35 updateDataSet();
Logger writer = new Logger(macroName , false);
37 writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
writer.write("set output \" + outputName + "\\n");
39 writer.write("set border 2 front linetype -1 linewidth
1.000\n");
writer.write("set boxwidth 0.5 absolute\n");
41 writer.write("set style fill solid 0.25 border lt -1\
n");
//writer.write("unset key\n");
43 writer.write("set pointsize 0.5\n");
writer.write("set style data boxplot\n");
45 writer.write("set xtics border in scale 0,0 nomirror
norotate offset character 0, 0, 0\n");
writer.write("set xtics norangelimit\n");
47 writer.write("set noxtics\n");
//writer.write("set xtics ("+getXTics()+")\n");
49 //set xtics ("SAD" 1.00000, "DC" 2.00000, "Cross -SAD"
3.00000)
writer.write("set ytics border in scale 1,0.5 nomirror
norotate offset character 0, 0, 0\n");
51 writer.write("set yrange [ "+minimumY+" : "+maximumY+"
] noreverse nowriteback\n");
writer.write("set title \"" + title + "\"\n");
53 //writer.write("set xlabel \"" + xLabel + "\"\n");
writer.write("set ylabel \"" + yLabel + "\"\n");
55 //plot silver.dat using (1):2, using (2):(5*$3),
using (3):(2*$3)
138
writer.write("plot \"" + dataSet + "\""+getLocations())
;
57 }
// set terminal png size 800,600
59 //set output boxplot1.png
//set border 2 front linetype -1 linewidth 1.000
61 //set boxwidth 0.5 absolute
//set style fill solid 0.25 border lt -1
63 //unset key
//set pointsize 0.5
65 //set style data boxplot
//set xtics border in scale 0,0 nomirror norotate offset
character 0, 0, 0
67 //set xtics norangelimit
//set xtics ("SAD" 1.00000, "DC" 2.00000, "Cross -SAD"
3.00000)
69 //set ytics border in scale 1,0.5 nomirror norotate offset
character 0, 0, 0
//set yrange [ 0.00000 : 100.000 ] noreverse nowriteback
71 //plot silver.dat using (1):2, using (2):(5*$3), using
(3):(2*$3)
}
GNUPlotPNGPrinter (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package graphics;
6
import constants.Paths;
8 import logger.Logger;
10 /**
*
12 * @author Isma
139
*/
14 public class GNUPlotPNGPrinter {
16 protected String outputName = "temp.png", title = "No Title
", xLabel = "X", yLabel = "Y", dataSet = "data_temp.txt"
, macroName = "macro_temp.txt";
protected int width = 800, height = 600;
18 protected String plotType = "line";
20 public GNUPlotPNGPrinter() {
}
22
public GNUPlotPNGPrinter(int width , int height) {
24 this.width = width;
this.height = height;
26 }
28 public GNUPlotPNGPrinter setFileName(String fileName) {
this.outputName = fileName;
30 return this;
}
32
public GNUPlotPNGPrinter setTitle(String title) {
34 this.title = title;
return this;
36 }
38 public GNUPlotPNGPrinter setXLabel(String label) {
this.xLabel = label;
40 return this;
}
42
public GNUPlotPNGPrinter setYLabel(String label) {
44 this.yLabel = label;
return this;
46 }
140
48 public GNUPlotPNGPrinter setDataSet(String fileName) {
this.dataSet = fileName;
50 return this;
}
52
public void setMacroName(String macroName) {
54 this.macroName = macroName;
}
56
protected void writeGNUPlotMacro() {
58 Logger writer = new Logger(macroName , false);
writer.write("set terminal png size " + String.valueOf(
width) + " , " + String.valueOf(height) + "\n");
60 writer.write("set output \" + outputName + "\\n");
writer.write("set title \"" + title + "\"\n");
62 writer.write("set xlabel \"" + xLabel + "\"\n");
writer.write("set ylabel \"" + yLabel + "\"\n");
64 writer.write("set xzeroaxis lt -1\n");
writer.write("set grid\n");
66 writer.write("plot \"" + dataSet + "\" w " + plotType +
"boxes lt 4\n");
}
68
public void plot() {
70 this.writeGNUPlotMacro();
Process out;
72 try {
74 if ("Linux".equals(System.getProperty("os.name")))
{
out = Runtime.getRuntime().exec("gnuplot "+
macroName);
76 } else {
out = Runtime.getRuntime().exec(Paths.
gnuplotLocation + "\\gnuplot " + macroName);
141
78 }
80
out.waitFor();
82 System.out.println("OK...");
} catch (Exception e) {
84 System.out.println("Erro: " + e);
}
86 }
//set terminal png size 800 , 600
88 //set output d:\CRF_Fixo\\plots\foremanCaixa.png
//set title "Foreman"
90 //set xlabel "Amostra"
//set ylabel "%"
92 //set xzeroaxis lt -1
//set grid
94 //plot "d:/CRF_Fixo/amostraCRF25Foreman.txt" w boxes lt 4
}
GraphicTypes (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 /**
*
9 * @author Isma
*/
11 public enum GraphicTypes {
13 line;
15 }
142
PSNRGraphic (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 import Collector.GeneralCollector;
import java.util.List;
9 import logger.Logger;
import metrics.Metric;
11
/**
13 *
* @author Isma
15 */
public class PSNRGraphic extends GNUPlotPNGPrinter {
17
private double minimumY = 0.8, maximumY = 1.0;
19 GeneralCollector psnrCollector;
List <Metric > metrics;
21 String testName;
23 public PSNRGraphic(String testName , int numberOfTest , List <
Metric > metrics) {
this.metrics = metrics;
25 this.testName = testName;
this.title = testName.replace("_", " ") + " - PSNR vs.
M t r i c a ";
27 this.xLabel = " M t r i c a ";
this.yLabel = "PSNR (dB)";
29 this.outputName = testName + "_psnrVSmetrica.png";
this.dataSet = testName + "_psnr_data.txt";
31 psnrCollector = new GeneralCollector(this.dataSet , "
psnr", this.metrics , numberOfTest);
this.width = 800;
143
33 this.height = 600;
this.macroName = testName+"_psnr_macro.txt";
35 }
37 public String getLocations() {
String result = "using (1):1 title \"" + metrics.get(0)
.getNameWithSpace() + "\" , ";
39 int metricSize = metrics.size();
for (int i = 2; i < metricSize; i++) {
41 result += "\\ using (" + i + "):" + i + " title
\"" + metrics.get(i - 1).getNameWithSpace() + "
\", ";
}
43 result += "\\ using (" + metricSize + "):" +
metricSize + " title \"" + metrics.get(metricSize -
1).getNameWithSpace() + "\"";
return result;
45 }
47 public void updateDataSet() {
this.psnrCollector.generateOutput();
49 setMaximumY(psnrCollector.getMaxCollected() + 1);
setMinimumY(psnrCollector.getMinCollected() - 1);
51 }
53 public void setMinimumY(double minimumY) {
this.minimumY = minimumY;
55 }
57 public void setMaximumY(double maximumY) {
this.maximumY = maximumY;
59 }
61 @Override
protected void writeGNUPlotMacro() {
63 updateDataSet();
144
Logger writer = new Logger(macroName , false);
65 writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
writer.write("set output \" + outputName + "\\n");
67 //writer.write("set border 2 front linetype -1
linewidth 1.000\n");
writer.write("set border 3\n");
69 writer.write("set boxwidth 0.5 absolute\n");
writer.write("set style fill solid 0.25 border lt -1\
n");
71 //writer.write("unset key\n");
writer.write("set pointsize 0.5\n");
73 writer.write("set style data boxes\n");
//writer.write("set xtics border in scale 0,0 nomirror
norotate offset character 0, 0, 0\n");
75 //writer.write("set xtics nomirror\n");
//writer.write("set xtics norangelimit\n");
77 writer.write("set noxtics\n");
//writer.write("set xtics ("+getXTics()+")\n");
79 //set xtics ("SAD" 1.00000, "DC" 2.00000, "Cross -SAD"
3.00000)
writer.write("set ytics border in scale 1,0.5 nomirror
norotate offset character 0, 0, 0\n");
81 writer.write("set yrange [ " + minimumY + " : " +
maximumY + " ] noreverse nowriteback\n");
writer.write("set title \"" + title + "\"\n");
83 //writer.write("set xlabel \"" + xLabel + "\"\n");
writer.write("set ylabel \"" + yLabel + "\"\n");
85 //plot silver.dat using (1):2, using (2):(5*$3),
using (3):(2*$3)
writer.write("plot \"" + dataSet + "\"" + getLocations
());
87 }
89 }
145
ResidueGraphic (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 import Collector.GeneralCollector;
import java.util.List;
9 import logger.Logger;
import metrics.Metric;
11
/**
13 *
* @author Isma
15 */
public class ResidueGraphic extends GNUPlotPNGPrinter {
17
private double minimumY = 0.8, maximumY = 1.0;
19 GeneralCollector residueCollector;
List <Metric > metrics;
21 String testName;
23 public ResidueGraphic(String testName , int numberOfTest ,
List <Metric > metrics) {
this.metrics = metrics;
25 this.testName = testName;
this.title = testName.replace("_", " ") + " - R e s d u o
vs. M t r i c a ";
27 this.xLabel = " M t r i c a ";
this.yLabel = " R e s d u o (%)";
29 this.outputName = testName + "_residuoVSmetrica.png";
this.dataSet = testName + "_residuo_data.txt";
146
31 residueCollector = new GeneralCollector(this.dataSet , "
residue", this.metrics , numberOfTest);
this.width = 800;
33 this.height = 600;
this.macroName = testName+"_residuo_macro.txt";
35 }
37 public String getLocations() {
String result = "using (1):1 title \"" + metrics.get(0)
.getNameWithSpace() + "\" , ";
39 int metricSize = metrics.size();
for (int i = 2; i < metricSize; i++) {
41 result += "\\ using (" + i + "):" + i + " title
\"" + metrics.get(i - 1).getNameWithSpace() + "
\", ";
}
43 result += "\\ using (" + metricSize + "):" +
metricSize + " title \"" + metrics.get(metricSize -
1).getNameWithSpace() + "\"";
return result;
45 }
47 public void updateDataSet() {
this.residueCollector.generateOutput();
49 setMaximumY(residueCollector.getMaxCollected() + 1);
setMinimumY(residueCollector.getMinCollected() - 1);
51 }
53 public void setMinimumY(double minimumY) {
this.minimumY = minimumY;
55 }
57 public void setMaximumY(double maximumY) {
this.maximumY = maximumY;
59 }
147
61 @Override
protected void writeGNUPlotMacro() {
63 updateDataSet();
Logger writer = new Logger(macroName , false);
65 writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
writer.write("set output \" + outputName + "\\n");
67 //writer.write("set border 2 front linetype -1
linewidth 1.000\n");
writer.write("set border 3\n");
69 writer.write("set boxwidth 0.5 absolute\n");
writer.write("set style fill solid 0.25 border lt -1\
n");
71 //writer.write("unset key\n");
writer.write("set pointsize 0.5\n");
73 writer.write("set style data boxes\n");
//writer.write("set xtics border in scale 0,0 nomirror
norotate offset character 0, 0, 0\n");
75 //writer.write("set xtics nomirror\n");
//writer.write("set xtics norangelimit\n");
77 writer.write("set noxtics\n");
//writer.write("set xtics ("+getXTics()+")\n");
79 //set xtics ("SAD" 1.00000, "DC" 2.00000, "Cross -SAD"
3.00000)
writer.write("set ytics border in scale 1,0.5 nomirror
norotate offset character 0, 0, 0\n");
81 writer.write("set yrange [ " + minimumY + " : " +
maximumY + " ] noreverse nowriteback\n");
writer.write("set title \"" + title + "\"\n");
83 //writer.write("set xlabel \"" + xLabel + "\"\n");
writer.write("set ylabel \"" + yLabel + "\"\n");
85 //plot silver.dat using (1):2, using (2):(5*$3),
using (3):(2*$3)
writer.write("plot \"" + dataSet + "\"" + getLocations
());
148
87 }
}
SSIMGraphic (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package graphics;
6
import Collector.SSIMCollector;
8 import java.util.List;
import logger.Logger;
10 import metrics.Metric;
12 /**
*
14 * @author Isma
*/
16 public class SSIMGraphic extends GNUPlotPNGPrinter {
18 private double minimumY = 0.8, maximumY = 1.0;
SSIMCollector ssimCollector;
20 List <Metric > metrics;
String testName;
22
public SSIMGraphic(String testName , int numberOfTest , List <
Metric > metrics) {
24 this.metrics = metrics;
this.testName = testName;
26 this.title = testName.replace("_", " ") + " - SSIM vs.
M t r i c a ";
this.xLabel = " M t r i c a ";
28 this.yLabel = "SSIM";
this.outputName = testName + "_ssimVSmetrica.png";
30 this.dataSet = testName + "_ssim_data.txt";
149
ssimCollector = new SSIMCollector(this.dataSet , this.
metrics , numberOfTest);
32 this.width = 800;
this.height = 600;
34 this.macroName = testName+"_ssim_macro.txt";
}
36
public String getLocations() {
38 String result = "using (1):1 title \"" + metrics.get(0)
.getNameWithSpace() + "\" , ";
int metricSize = metrics.size();
40 for (int i = 2; i < metricSize; i++) {
result += "\\ using (" + i + "):" + i + " title
\"" + metrics.get(i - 1).getNameWithSpace() + "
\", ";
42 }
result += "\\ using (" + metricSize + "):" +
metricSize + " title \"" + metrics.get(metricSize -
1).getNameWithSpace() + "\"";
44 return result;
}
46
public void updateDataSet() {
48 this.ssimCollector.generateOutput();
setMaximumY(ssimCollector.getMaxCollected() + 0.01);
50 setMinimumY(ssimCollector.getMinCollected() - 0.01);
}
52
public void setMinimumY(double minimumY) {
54 this.minimumY = minimumY;
}
56
public void setMaximumY(double maximumY) {
58 this.maximumY = maximumY;
}
60
150
@Override
62 protected void writeGNUPlotMacro() {
updateDataSet();
64 Logger writer = new Logger(macroName , false);
writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
66 writer.write("set output \" + outputName + "\\n");
//writer.write("set border 2 front linetype -1
linewidth 1.000\n");
68 writer.write("set border 3\n");
writer.write("set boxwidth 0.5 absolute\n");
70 writer.write("set style fill solid 0.25 border lt -1\
n");
//writer.write("unset key\n");
72 writer.write("set pointsize 0.5\n");
writer.write("set style data boxes\n");
74 //writer.write("set xtics border in scale 0,0 nomirror
norotate offset character 0, 0, 0\n");
//writer.write("set xtics nomirror\n");
76 //writer.write("set xtics norangelimit\n");
writer.write("set noxtics\n");
78 //writer.write("set xtics ("+getXTics()+")\n");
//set xtics ("SAD" 1.00000, "DC" 2.00000, "Cross -SAD"
3.00000)
80 writer.write("set ytics border in scale 1,0.5 nomirror
norotate offset character 0, 0, 0\n");
writer.write("set yrange [ " + minimumY + " : " +
maximumY + " ] noreverse nowriteback\n");
82 writer.write("set title \"" + title + "\"\n");
//writer.write("set xlabel \"" + xLabel + "\"\n");
84 writer.write("set ylabel \"" + yLabel + "\"\n");
//plot silver.dat using (1):2, using (2):(5*$3),
using (3):(2*$3)
86 writer.write("plot \"" + dataSet + "\"" + getLocations
());
151
}
88 }
TimeGraphic (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package graphics;
6
import Collector.TimeCollector;
8 import java.util.List;
import metrics.Metric;
10
/**
12 *
* @author Isma
14 */
public class TimeGraphic extends BoxPlotter {
16
List <Metric > metrics;
18 String testName;
TimeCollector timeCollector;
20
public TimeGraphic(String testName , int numberOfTest , List <
Metric > metrics) {
22 this.metrics = metrics;
this.testName = testName;
24 this.title = testName.replace("_", " ") + " - Tempo vs.
M t r i c a ";
this.xLabel = " M t r i c a ";
26 this.yLabel = "Tempo (ms)";
this.outputName = testName + "_tempoVSmetrica.png";
28 this.dataSet = testName + "_time_data.txt";
timeCollector = new TimeCollector(this.dataSet , this.
metrics , numberOfTest);
152
30 this.width = 800;
this.height = 600;
32 this.macroName = testName+"_time_macro.txt";
}
34
@Override
36 public String getXTics() {
//"SAD" 1.00000, "DC" 2.00000, "Cross -SAD" 3.00000
38 String result = "";
int c = 1;
40 Metric lastMetric = metrics.remove(metrics.size() - 1);
for (Metric metric : metrics) {
42 result += "\"" + metric.getNameWithSpace() + "\" "
+ c + ", ";
c++;
44 }
result += "\"" + lastMetric.getNameWithSpace() + "\" "
+ c;
46 metrics.add(lastMetric);
return result;
48 }
50 // @Override
// public String getLocations() {
52 // //using (1):2, using (2):(5*$3), using (3):(2*
$3)
// String result = "using (1):1, ";
54 // int metricSize = metrics.size();
// for (int i = 2; i < metricSize; i++) {
56 // result+="\\ using ("+i+"):"+i+", ";
// }
58 // result+="\\ using ("+metricSize+"):"+metricSize;
// return result;
60 // }
@Override
62 public String getLocations() {
153
//using (1):2, using (2):(5*$3), using (3):(2*$3)
64 String result = "using (1):1 title \""+metrics.get(0).
getNameWithSpace()+"\" , ";
int metricSize = metrics.size();
66 for (int i = 2; i < metricSize; i++) {
result += "\\ using (" + i + "):" + i + " title
\""+metrics.get(i-1).getNameWithSpace()+"\", ";
68 }
result += "\\ using (" + metricSize + "):" +
metricSize+" title \""+metrics.get(metricSize -1).
getNameWithSpace()+"\"";
70 return result;
}
72 //plot "test.dat" usi 1:2:3 title "data" w yerrorbars
74 @Override
public void updateDataSet() {
76 this.timeCollector.generateOutput();
//setMaximumY((int)timeCollector.getMaxCollected()+1);
78 //setMinimumY((int)timeCollector.getMinCollected() -1);
}
80 }
B.1.5 image
Block (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package image;
6
import java.util.ArrayList;
8 import java.util.List;
10 /**
154
*
12 * @author Isma
*/
14 public class Block {
16 public static Block nullBlock(int width , int height ,
ImageType type) {
int[][] pixels = new int[width][height];
18 for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
20 pixels[i][j] = 0;
}
22 }
return new Block(pixels , type);
24 }
private List <Pixel > pixels = new ArrayList <Pixel >();
26 private byte width;
private byte height;
28 private ImageType type = ImageType.RGB;
30 public void copy(Block block) {
this.pixels = block.getPixels();
32 }
34 public Block(List <Pixel > pixels , byte width , byte height) {
this.pixels = pixels;
36 this.width = width;
this.height = height;
38 }
40 public Block(int[][] pixels , ImageType type) {
this.height = (byte) pixels.length;
42 this.width = (byte) pixels[1].length;
this.type = type;
44 for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
155
46 switch (type) {
case RGB:
48 this.pixels.add(new RGBPixel(pixels[i][
j]));
break;
50 case GRAYSCALE:
this.pixels.add(new GrayscalePixel(
pixels[i][j]));
52 break;
case MONOCROMATIC:
54 this.pixels.add(new Pixel(pixels[i][j])
);
break;
56 default:
this.pixels.add(new Pixel(pixels[i][j])
);
58 break;
}
60 }
}
62 }
64 public Block(int[] pixels , ImageType type) {
this.type = type;
66 this.height = (byte) (Math.sqrt(pixels.length));
this.width = this.height;
68 for (int i = 0; i < height * width; i++) {
switch (type) {
70 case RGB:
this.pixels.add(new RGBPixel(pixels[i]));
72 break;
case GRAYSCALE:
74 this.pixels.add(new GrayscalePixel(pixels[i
]));
break;
76 case MONOCROMATIC:
156
this.pixels.add(new Pixel(pixels[i]));
78 break;
default:
80 this.pixels.add(new Pixel(pixels[i]));
break;
82 }
}
84 }
86 public Pixel[][] getPixelsMatrix() {
Pixel[][] matrix = new Pixel[width][height];
88 for (int i = 0; i < pixels.size(); i++) {
matrix[i / width][i % height] = pixels.get(i);
90 }
return matrix;
92 }
94 public Pixel[] getPixelArray() {
Pixel[] result = new Pixel[width*height];
96 for (int i = 0; i < result.length; i++) {
result[i] = pixels.get(i);
98 }
return result;
100 }
102 public void toLuma() {
this.type = ImageType.GRAYSCALE;
104 List <Pixel > temp = new ArrayList <Pixel >();
for (Pixel pixel : pixels) {
106 temp.add(((RGBPixel) pixel).getLuma());
}
108 this.pixels = temp;
}
110
public List <Pixel > getPixels() {
112 return pixels;
157
}
114
public ImageType getType() {
116 return this.type;
}
118
public Block subtract(Block other){
120 List <Pixel > resultPixelList = new ArrayList <Pixel >();
for (int i = 0; i < this.pixels.size(); i++) {
122 resultPixelList.add(((GrayscalePixel)this.pixels.
get(i)).subtract((GrayscalePixel)other.pixels.
get(i)));
}
124 Block block = new Block(resultPixelList , this.width ,
this.height);
return block;
126 }
128 public long getSumOfPixels(){
long sum = 0;
130 for (Pixel pixel : pixels) {
sum+=pixel.getValue();
132 }
return sum;
134 }
136 @Override
protected Object clone(){
138 List <Pixel > listPixel = new ArrayList <Pixel >();
for (Pixel pixel : this.pixels) {
140 listPixel.add((Pixel)pixel.clone());
}
142 return new Block(listPixel , width , height);
}
144
@Override
158
146 public String toString() {
String result = "Block:";
148 for (int i= 0; i < width*height; i++) {
if (i%width == 0) {
150 result+="\n";
}
152 result+=pixels.get(i).getValue()+" ";
}
154 result+="";
return result;
156 }
158
160
162 }
GrayscalePixel (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package image;
6
/**
8 *
* @author Isma
10 */
public class GrayscalePixel extends Pixel{
12
public GrayscalePixel(int value) {
14 super(value);
}
16
public GrayscalePixel subtract(GrayscalePixel other){
159
18 return new GrayscalePixel(Math.abs(this.value -other.
getValue()));
}
20
@Override
22 protected Object clone(){
return new GrayscalePixel(value);
24 }
26
28 }
Image (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package image;
6
import java.awt.image.BufferedImage;
8 import java.awt.image.Raster;
import java.awt.image.WritableRaster;
10 import java.util.ArrayList;
import java.util.List;
12
/**
14 *
* @author Isma
16 */
public class Image {
18
private List <Block > blocks = new ArrayList <Block >();
20 private int width = 0;
private int height = 0;
22 private ImageType type;
160
byte blockSize = 4;
24
public List <Block > getBlocks() {
26 return blocks;
}
28
public byte getBlockSize(){
30 return blockSize;
}
32
public final void setBlocks(List <Block > blocks) {
34 List <Block > temp = new ArrayList <Block >();
for (Block block : blocks) {
36 Pixel[] pixelArray = block.getPixelArray();
int[] intPixArray = new int[pixelArray.length];
38 for (int i = 0; i < block.getPixels().size(); i++)
{
intPixArray[i] = pixelArray[i].getValue();
40 }
temp.add(new Block(intPixArray , block.getType()));
42 }
this.blocks = temp;
44 }
46 public Image(BufferedImage sourceImg , byte blockSize) {
this.blockSize = blockSize;
48 getBufferedImageType(sourceImg);
sourceImg.getType();
50 this.width = sourceImg.getWidth();
this.height = sourceImg.getHeight();
52 int nbands = sourceImg.getSampleModel().getNumBands();
Raster inputRaster = sourceImg.getData();
54 int[] pixels = new int[nbands * width * height];
inputRaster.getPixels(0, 0, width , height , pixels);
56 int[][][][] blocoPequeno = new int[width / blockSize][
height / blockSize][blockSize][blockSize];
161
for (int w = 0; w < width; w++) {
58 for (int h = 0; h < height; h++) {
blocoPequeno[w / blockSize][h / blockSize][w %
blockSize][h % blockSize] = sourceImg.getRGB
(w, h);
60 }
}
62
for (int i = 0; i < width / blockSize; i++) {
64 for (int j = 0; j < height / blockSize; j++) {
blocks.add(new Block(blocoPequeno[i][j], type))
;
66 }
}
68 }
70 public ImageType getType(){
return this.type;
72 }
74 public int getWidth(){
return this.width;
76 }
78 public int getHeight(){
return this.height;
80 }
82 public Image(byte blockSize , ImageType type , int width , int
height , List <Block > blocks) {
this.blockSize = blockSize;
84 this.type = type;
this.width = width;
86 this.height = height;
this.setBlocks(blocks);
88 }
162
90 public void changeBlock(Block oldBlock , Block newBlock) {
oldBlock.copy(newBlock);
92 }
94 public Block getBlock(int index) {
return blocks.get(index);
96 }
98 public int getBlockIndex(Block block) {
return blocks.indexOf(block);
100 }
102 public Block getUpperBlock(Block current) {
int index = blocks.indexOf(current);
104 if ((index < width / blockSize - 1) || (index - width /
blockSize == -1)) {
return Block.nullBlock(blockSize , blockSize , type);
106 }
return blocks.get(index - width / blockSize);
108 }
110 public Block getLeftBlock(Block current) {
int index = blocks.indexOf(current);
112 if ((index % (width / blockSize)) == 0) {
return Block.nullBlock(blockSize , blockSize , type);
114 }
return blocks.get(index - 1);
116 }
118 public Block getLeftUpperBlock(Block current) {
int index = blocks.indexOf(current);
120 if (((index % (width / blockSize)) == 0) || (index <
width / blockSize - 1)) {
return Block.nullBlock(blockSize , blockSize , type);
122 }
163
return getUpperBlock(blocks.get(index - 1));
124 }
126 public Block getRightUpperBlock(Block current) {
int index = blocks.indexOf(current);
128 if ((((index + 1) % (width / blockSize)) == 0) || index
< width / blockSize - 1) {
return Block.nullBlock(blockSize , blockSize , type);
130 }
return getUpperBlock(blocks.get(index + 1));
132 }
134 public BufferedImage getOutputImage() {
switch (type) {
136 case RGB:
return getOutputImageRGB();
138 case GRAYSCALE:
return getOutputImageGrayscale();
140 case MONOCROMATIC:
return getOutputImageMonocromatic();
142 default:
return null;
144 }
}
146
private BufferedImage getOutputImageRGB() {
148 BufferedImage img = new BufferedImage(width , height ,
BufferedImage.TYPE_INT_RGB);
WritableRaster raster = img.getRaster();
150 Pixel[][] pixelMatrix = getPixelMatrix();
for (int w = 0; w < width; w++) {
152 for (int h = 0; h < height; h++) {
raster.setSample(w, h, 0, ((RGBPixel)
pixelMatrix[w][h]).getR());
154 raster.setSample(w, h, 1, ((RGBPixel)
pixelMatrix[w][h]).getG());
164
raster.setSample(w, h, 2, ((RGBPixel)
pixelMatrix[w][h]).getB());
156 }
}
158 return img;
}
160
private BufferedImage getOutputImageGrayscale() {
162
164 BufferedImage img = new BufferedImage(width , height ,
BufferedImage.TYPE_USHORT_GRAY);
WritableRaster raster = img.getRaster();
166
Pixel[][] pixelMatrix = getPixelMatrix();
168 for (int h = 0; h < height; h++) {
for (int w = 0; w < width; w++) {
170 raster.setSample(w, h, 0, ((int) ((
GrayscalePixel) pixelMatrix[w][h]).getValue
()) << 8);
}
172 }
return img;
174 }
176 public Pixel[][] getPixelMatrix() {
Pixel[][] blocoGrande = new Pixel[width][height];
178 int numHBlocks = height / blockSize;
for (int w = 0; w < width; w++) {
180 for (int h = 0; h < height; h++) {
blocoGrande[w][h] = blocks.get((w / blockSize)
* numHBlocks + h / blockSize).
getPixelsMatrix()[w % blockSize][h %
blockSize];
182 }
}
165
184 return blocoGrande;
}
186
private void getBufferedImageType(BufferedImage sourceImg)
{
188 switch (sourceImg.getType()) {
case BufferedImage.TYPE_3BYTE_BGR:
190 type = ImageType.RGB;
break;
192 case BufferedImage.TYPE_INT_RGB:
type = ImageType.RGB;
194 break;
case BufferedImage.TYPE_USHORT_GRAY:
196 type = ImageType.GRAYSCALE;
break;
198 default:
type = ImageType.UNKNOWN;
200 break;
}
202 }
204 public Image getLuminanceCopy() {
Image result = null;
206 try {
result = (Image) this.clone();
208 } catch (Exception e) {
System.out.println("Erro ao clonar imagem\n" + e);
210 }
result.toLuma();
212 return result;
}
214
public void toLuma() {
216 this.type = ImageType.GRAYSCALE;
for (Block block : blocks) {
218 block.toLuma();
166
}
220 }
222 public Image lumaResidue(Image other){
Image luma = this;
224 Image result = (Image) luma.clone();
Image otherLuma = other;
226 for (Block reference : luma.getBlocks()) {
int index = luma.getBlockIndex(reference);
228 Block old = result.getBlock(index);
result.changeBlock(old , old.subtract(otherLuma.
getBlock(index)));
230 }
return result;
232 }
234 public long getSumOfPixels(){
long sum = 0;
236 for (Block lumaBlock : this.getBlocks()) {
sum+=lumaBlock.getSumOfPixels();
238 }
return sum;
240 }
242 public double getPercentualResidue(Image other){
return 0.0;
244 }
246 @Override
public Object clone() {
248 //return new Image(this.getOutputImage(), blockSize);
return copy(this);
250 }
252 public static Image copy(Image imageToCopy){
167
Image result = new Image(imageToCopy.getBlockSize(),
imageToCopy.getType(), imageToCopy.getWidth(),
imageToCopy.getHeight(), imageToCopy.getBlocks());
254 return result;
}
256
private BufferedImage getOutputImageMonocromatic() {
258 throw new UnsupportedOperationException("Not yet
implemented");
}
260 }
ImageType (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package image;
6
/**
8 *
* @author Isma
10 */
public enum ImageType {
12 MONOCROMATIC , GRAYSCALE , RGB , UNKNOWN;
}
Pixel (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package image;
7 /**
*
168
9 * @author Isma
*/
11 public class Pixel {
13 protected int value = 0;
15 public Pixel() {
}
17
public Pixel(int value) {
19 this.value = value;
}
21
public int getValue() {
23 return value;
}
25
public void setValue(int value) {
27 this.value = value;
}
29
@Override
31 protected Object clone(){
return new Pixel(value);
33 }
35 }
RGBPixel (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package image;
7 /**
169
*
9 * @author Isma
*/
11 public class RGBPixel extends Pixel {
13 private int R = 0, G = 0, B = 0;
15 public RGBPixel(int value) {
super(value);
17 this.splitRGB(value);
}
19
private void splitRGB(int value) {
21 this.R = (int) ((value & 0x00FF0000) >>> 16);
this.G = (int) ((value & 0x0000FF00) >>> 8);
23 this.B = (int) (value & 0x000000FF);
}
25
public int getR() {
27 return R;
}
29
public int getG() {
31 return G;
}
33
public int getB() {
35 return B;
}
37
@Override
39 public String toString() {
return "R ="+R+"\tG = "+G+"\tB = "+B;
41 }
43 public GrayscalePixel toGrayscale(){
170
return new GrayscalePixel((R+G+B)/3);
45 }
47 //http://www.amazon.com/exec/obidos/ASIN /1878707094/ref=
nosim/schildnet0c
public GrayscalePixel getLuma(){
49 return new GrayscalePixel((int)((0.257 * R)+(0.504*G)
+(0.098*B)+16));
}
51
@Override
53 protected Object clone(){
return new RGBPixel(value);
55 }
57
59 }
B.1.6 javaImage
ImageUtils (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package javaImage;
7 import image.Image;
import java.awt.image.BufferedImage;
9 import java.io.File;
import java.io.IOException;
11 import java.net.URL;
import javax.imageio.ImageIO;
13 import javax.swing.JFrame;
171
15 /**
*
17 * @author Isma
*/
19 public class ImageUtils {
21 public static BufferedImage loadImage(String location) {
BufferedImage bimg = null;
23 try {
URL url = new URL(location);
25 bimg = ImageIO.read(url);
} catch (Exception e) {
27 System.out.println("Error oppening image!\n" + e);
}
29 return bimg;
}
31
public static void apresentaImagem(String title ,
BufferedImage img) {
33 JFrame frame = new JFrame(title);
frame.setBounds(10, 10, img.getWidth(), img.getHeight()
);
35 JImagePanel panel = new JImagePanel(img , 0, 0);
frame.add(panel);
37 frame.setVisible(true);
}
39
public static void saveImage(String fileName , Image img){
41 generateOutImage(new File(fileName), img.getOutputImage
());
}
43
protected static void generateOutImage(File file ,
BufferedImage image) {
45 try {
ImageIO.write(image , "png", file);
172
47 } catch (IOException ex) {
System.out.println(ex);
49 }
}
51 }
JImagePanel (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package javaImage;
7 /**
*
9 * @author Isma
*/
11 import java.awt.Graphics;
import java.awt.image.BufferedImage;
13 import javax.swing.JPanel;
15 public class JImagePanel extends JPanel{
private BufferedImage image;
17 int x, y;
public JImagePanel(BufferedImage image , int x, int y) {
19 super();
this.image = image;
21 this.x = x;
this.y = y;
23 }
@Override
25 protected void paintComponent(Graphics g) {
super.paintComponent(g);
27 g.drawImage(image , x, y, null);
}
29 }
173
B.1.7 logger
ImageGeneralLogger (
1 /*
*
3 * To change this template , choose Tools | Templates
* and open the template in the editor.
5 */
package logger;
7
import constants.NumericalConstants;
9 import java.util.List;
import metrics.Metric;
11 import reader.DataFileReader;
13 /**
*
15 * @author Isma
*/
17 public class ImageGeneralLogger extends Logger {
19 String imageName = "";
List <Metric > metrics;
21 Statistic statistic = new Statistic();
DataFileReader reader = new DataFileReader();
23 //imageName
// m t r i c a
25
public ImageGeneralLogger(String imageName , List <Metric >
metrics) {
27 super(imageName + "_resume.txt", false);
this.imageName = imageName;
29 this.metrics = metrics;
}
31
private String formatPrecision(String target , int precision
) {
174
33 int pointPosition = target.indexOf(".");
if (pointPosition > 0) {
35 target = target.substring(0, pointPosition +
precision + 1);
}
37 return target;
}
39
public String getMeanTimeInMs(Metric metric) {
41 double[] times = reader.getAllDoubles(imageName + "_" +
metric.getName() + "_time.txt", NumericalConstants.
resultsPrecision);
statistic.setArray(times);
43 return formatPrecision(String.valueOf(TimeLogger.NSToMS
(statistic.getMediaAritmetica())),
NumericalConstants.resultsPrecision);
}
45
public String getStdDeviationOfTimeInMs(Metric metric) {
47 double[] times = reader.getAllDoubles(imageName + "_" +
metric.getName() + "_time.txt", NumericalConstants.
resultsPrecision);
statistic.setArray(times);
49 return formatPrecision(String.valueOf(TimeLogger.NSToMS
(statistic.getDesvioPadrao())), NumericalConstants.
resultsPrecision);
}
51
public String getSSIM(Metric metric) {
53 double ssim = reader.getDouble(imageName + "_" + metric
.getName() + "_SSIM.txt", NumericalConstants.
resultsPrecision);
return String.valueOf(ssim);
55 }
57 public String getPSNR(Metric metric) {
175
double psnr = reader.getDouble(imageName + "_" + metric
.getName() + "_psnr.txt", NumericalConstants.
resultsPrecision);
59 return String.valueOf(psnr);
}
61
public String getResidue(Metric metric) {
63 double residue = reader.getDouble(imageName + "_" +
metric.getName() + "_residue.txt",
NumericalConstants.resultsPrecision);
return String.valueOf(residue);
65 }
67 public void generateLaTeXTable() {
write("\\begin{table}[htb]\n");
69 write("\\centering\n");
write("\\setlength{\\arrayrulewidth }{2\\ arrayrulewidth}
% espessura da linha\n");
71 write("\\setlength{\\belowcaptionskip }{10pt} % e s p a o
entre caption e tabela\n");
write("\\caption{\\footnotesize Tabela de resultados
para a figura .}\n");
73 write("\\label{tab.result." + imageName + "}\n");
75 write("\\begin{center}\n");
write("\\begin{tabular}{l|ccccc}\n");
77 write("\\textbf{ M t r i c a } & \\textbf{PSNR (dB)} & \\
textbf{SSIM} & \\textbf{ R e s d u o (\\%)} & \\textbf{
Tempo\\footnote{Tempo m d i o .} (ms)} & \\textbf{\\
sigma\footnote{Desvio P a d r o da amostra de tempo.}
(ms)} \\\\\n");// \\
write("\\hline");
79 for (Metric metric : metrics) {
write("\\textbf{" + metric.getName() + "} & " +
getPSNR(metric) + " & " + getSSIM(metric) + " &
" + getResidue(metric) + " & "
176
81 + getMeanTimeInMs(metric) + "& "
+ getStdDeviationOfTimeInMs(metric) + "
\\\\\n");
83 }
85 //write("\textbf{SAD} & & & & \\");
write("\\end{tabular}\n");
87 write("\\end{center}\n");
write("\\end{table}\n");
89
}
91 // \begin{table}[htb]
// \centering
93 // \setlength{\arrayrulewidth }{2\ arrayrulewidth} %
espessura da linha
// \setlength{\belowcaptionskip }{10pt} % e s p a o entre
caption e tabela
95 // \caption{\footnotesize Tabela de resultados para a
figura \ref{fig.img1.1}.}
// \label{tab.result.img1.1}
97 // \begin{center}
// \begin{tabular}{lllll}
99 // \textbf{ M t r i c a } & \textbf{PSNR (dB)} & \textbf{SSIM} &
\textbf{Tempo (s)} & \textbf{ R e s d u o } \\
// \textbf{SAD} & & & & \\
101 // \textbf{DC} & & & &
// \end{tabular}
103 // \end{center}
// \end{table}
105 }
ImageGeneralLoggerResumed (
1 /*
*
3 * To change this template , choose Tools | Templates
* and open the template in the editor.
177
5 */
package logger;
7
import constants.NumericalConstants;
9 import java.util.List;
import metrics.Metric;
11 import reader.DataFileReader;
13 /**
*
15 * @author Isma
*/
17 public class ImageGeneralLoggerResumed extends Logger {
19 String imageName = "";
List <Metric > metrics;
21 Statistic statistic = new Statistic();
DataFileReader reader = new DataFileReader();
23 //imageName
// m t r i c a
25
public ImageGeneralLoggerResumed(String imageName , List <
Metric > metrics) {
27 super(imageName + "_resume.txt", false);
this.imageName = imageName;
29 this.metrics = metrics;
}
31
private String formatPrecision(String target , int precision
) {
33 int pointPosition = target.indexOf(".");
if (pointPosition > 0) {
35 target = target.substring(0, pointPosition +
precision + 1);
}
37 return target;
178
}
39
public String getSSIM(Metric metric) {
41 double ssim = reader.getDouble(imageName + "_" + metric
.getName() + "_SSIM.txt", NumericalConstants.
resultsPrecision);
return String.valueOf(ssim);
43 }
45 public String getPSNR(Metric metric) {
double psnr = reader.getDouble(imageName + "_" + metric
.getName() + "_psnr.txt", NumericalConstants.
resultsPrecision);
47 return String.valueOf(psnr);
}
49
public String getResidue(Metric metric) {
51 double residue = reader.getDouble(imageName + "_" +
metric.getName() + "_residue.txt",
NumericalConstants.resultsPrecision);
return String.valueOf(residue);
53 }
55 public void generateLaTeXTable() {
write("\\begin{table}[htb]\n");
57 write("\\centering\n");
write("\\setlength{\\arrayrulewidth }{2\\ arrayrulewidth}
% espessura da linha\n");
59 write("\\setlength{\\belowcaptionskip }{10pt} % e s p a o
entre caption e tabela\n");
write("\\caption{\\footnotesize Tabela de resultados
para a figura .}\n");
61 write("\\label{tab.result." + imageName + "}\n");
63 write("\\begin{center}\n");
write("\\begin{tabular}{l|ccc}\n");
179
65 write("\\textbf{ M t r i c a } & \\textbf{PSNR (dB)} & \\
textbf{SSIM} & \\textbf{ R e s d u o (\\%)} \\\\\n");//
\\
write("\\hline");
67 for (Metric metric : metrics) {
write("\\textbf{" + metric.getSimplifiedName() + "}
& " + getPSNR(metric) + " & " + getSSIM(metric)
+ " & " + getResidue(metric)+"\\\\\n");
69 }
71 //write("\textbf{SAD} & & & & \\");
write("\\end{tabular}\n");
73 write("\\end{center}\n");
write("\\end{table}\n");
75
}
77 // \begin{table}[htb]
// \centering
79 // \setlength{\arrayrulewidth }{2\ arrayrulewidth} %
espessura da linha
// \setlength{\belowcaptionskip }{10pt} % e s p a o entre
caption e tabela
81 // \caption{\footnotesize Tabela de resultados para a
figura \ref{fig.img1.1}.}
// \label{tab.result.img1.1}
83 // \begin{center}
// \begin{tabular}{lllll}
85 // \textbf{ M t r i c a } & \textbf{PSNR (dB)} & \textbf{SSIM} &
\textbf{Tempo (s)} & \textbf{ R e s d u o } \\
// \textbf{SAD} & & & & \\
87 // \textbf{DC} & & & &
// \end{tabular}
89 // \end{center}
// \end{table}
91 }
180
ImageJDistortionLogger (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package logger;
7 import java.io.BufferedReader;
import java.io.BufferedWriter;
9 import java.io.FileWriter;
import java.io.InputStreamReader;
11 import java.util.ArrayList;
import java.util.List;
13 import metrics.Metric;
15 /**
*
17 * @author Isma
*/
19 public class ImageJDistortionLogger {
21 List <Metric > metrics;
String distortionName;
23 int numberOfTests;
25 public ImageJDistortionLogger(String distortionName , List <
Metric > metrics , int numberOfTests) {
this.metrics = metrics;
27 this.distortionName = distortionName;
this.numberOfTests = numberOfTests;
29 }
31 public void writeAll() {
33 List <String > values = new ArrayList <String >();
181
System.out.println("Calculando " + distortionName + "
...");
35 try {
Process saida;
37 saida = Runtime.getRuntime().exec("java -jar \"C:\\
Program Files (x86)\\ImageJ\\ij.jar\" -ijpath \"
C:\\Program Files (x86)\\ImageJ\" -macro " +
distortionName + "Calculation");
//System.out.println(saida.exitValue());
39 //saida.waitFor();
//System.out.println(saida.exitValue());
41 String line;
BufferedReader input = new BufferedReader(new
InputStreamReader(saida.getInputStream()));
43 while ((line = input.readLine()) != null) {
values.add(line);
45 }
input.close();
47 } catch (Exception e) {
System.out.println(e);
49 }
System.out.println(distortionName + ", done.");
51 int c = 0;
for (int i = 0; i < numberOfTests; i++) {
53 for (Metric metric : metrics) {
write(values.get(c), "teste_"+String.valueOf(i)
+"_"+metric.getName()+"_"+distortionName+".
txt");
55 // System.out.println("c: "+c);
// System.out.println("value = "+values.get(c));
57 c++;
}
59 }
61
}
182
63
protected void write(String string , String fileName) {
65 try {
FileWriter fstream = new FileWriter(fileName , false
);
67 BufferedWriter out = new BufferedWriter(fstream);
out.write(string);
69 out.flush();
} catch (Exception e) {
71 System.err.println("Error: " + e.getMessage());
}
73 }
}
Logger (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package logger;
6
import java.io.BufferedWriter;
8 import java.io.FileWriter;
10 /**
*
12 * @author Isma
*/
14 public class Logger {
16 protected FileWriter fstream;
protected BufferedWriter out;
18
public Logger(String fileName , boolean append) {
20 try {
fstream = new FileWriter(fileName , append);
183
22 out = new BufferedWriter(fstream);
} catch (Exception e) {
24 System.err.println("Erro: " + e.getMessage());
}
26 }
28 public void write(String string) {
try {
30 out.write(string);
out.flush();
32 } catch (Exception e) {
System.err.println("Error: " + e.getMessage());
34 }
}
36
38 public void writeln(String string){
this.write(string+"\n");
40 }
42
protected void closeStream() {
44 try {
out.close();
46 } catch (Exception e) {
System.err.println("Error: " + e.getMessage());
48 }
}
50
@Override
52 protected void finalize() throws Throwable {
closeStream();
54 super.finalize();
}
56
184
58
}
MetricLogger (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package logger;
7 import metrics.Metric;
9 /**
*
11 * @author Isma
*/
13 public abstract class MetricLogger extends Logger{
15 protected Metric metric;
17 public MetricLogger(Metric metric , String fileName , boolean
append) {
super(fileName , append);
19 this.metric = metric;
}
21
23
}
PSNRLogger (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package logger;
185
6
import image.Image;
8 import metrics.Metric;
import quality.MSE;
10 import quality.PSNR;
12 /**
*
14 * @author Isma
*/
16 public class PSNRLogger extends MetricLogger{
18 public PSNRLogger(Metric metric , String fileName) {
super(metric , fileName , false);
20 }
22 public String calculateAndSavePSNR(Image img1 , Image img2){
PSNR psnr = new PSNR();
24 double psnrValue = psnr.calculate(img1 , img2);
String result = String.valueOf(psnrValue);
26 write(result);
return result;
28 }
30 public String calculateAndSaveMSE(Image img1 , Image img2){
MSE mse = new MSE();
32 double mseValue = mse.calculate(img1 , img2);
String result = String.valueOf(mseValue);
34 write(result);
return result;
36 }
38
40 }
186
ResidueLogger (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package logger;
6
import metrics.Metric;
8
/**
10 *
* @author Isma
12 */
public class ResidueLogger extends MetricLogger {
14
public ResidueLogger(Metric metric , String fileName) {
16 super(metric , fileName , false);
}
18
public void writeDouble(double value){
20 write(String.valueOf(value));
}
22
24 }
Statistic (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package logger;
6
import java.util.Arrays;
8 import java.util.HashMap;
187
10 /**
*
12 * @author http://www.devmedia.com.br/post -6160-Estatistica -
Descritiva -em-Java.html
*/
14 public class Statistic {
16 private double array[];
18 // Coeficiente de V a r i a o de Pearson
public double getPearson() {
20 return (getDesvioPadrao() / getMediaAritmetica()) *
100;
}
22
public double getMediaAritmetica() {
24 double total = 0;
for (int counter = 0; counter < array.length; counter
++) {
26 total += array[counter];
}
28 return total / array.length;
}
30
public double getSomaDosElementos() {
32 double total = 0;
for (int counter = 0; counter < array.length; counter
++) {
34 total += array[counter];
}
36 return total;
}
38
public double getSomaDosElementosAoQuadrado() {
40 double total = 0;
188
for (int counter = 0; counter < array.length; counter
++) {
42 total += Math.pow(array[counter], 2);
}
44 return total;
}
46
public double getMediaAritmetica(double array[]) {
48 double total = 0;
for (int counter = 0; counter < array.length; counter
++) {
50 total += array[counter];
}
52 return total / array.length;
}
54
public double getSomaDosElementos(double array[]) {
56 double total = 0;
for (int counter = 0; counter < array.length; counter
++) {
58 total += array[counter];
}
60 return total;
}
62
public void ordenar() {
64 Arrays.sort(array);
}
66
public void imprimeArray() {
68 System.out.print("\nElementos do Array: ");
for (int count = 0; count < array.length; count++) {
70 System.out.print(array[count] + " ");
}
72 }
189
74 // Array n o pode conter valores duplicados
public int buscaPor(int value) {
76 return Arrays.binarySearch(array , value);
}
78
// V a r i n c i a Amostral
80 public double getVariancia() {
double p1 = 1 / Double.valueOf(array.length - 1);
82 double p2 = getSomaDosElementosAoQuadrado()
- (Math.pow(getSomaDosElementos(), 2) / Double.
valueOf(array.length));
84 return p1 * p2;
}
86
// Desvio P a d r o Amostral
88 public double getDesvioPadrao() {
return Math.sqrt(getVariancia());
90 }
92 public double getMediana() {
this.ordenar();
94 int tipo = array.length % 2;
if (tipo == 1) {
96 return array[((array.length + 1) / 2) - 1];
} else {
98 int m = array.length / 2;
return (array[m - 1] + array[m]) / 2;
100 }
}
102
public double getModa() {
104 HashMap map = new HashMap();
Integer i;
106 Double moda = 0.0;
Integer numAtual , numMaior = 0;
108 for (int count = 0; count < array.length; count++) {
190
i = (Integer) map.get(new Double(array[count]));
110 if (i == null) {
map.put(new Double(array[count]), new Integer
(1));
112 } else {
map.put(new Double(array[count]), new Integer(i
.intValue() + 1));
114 numAtual = i.intValue() + 1;
if (numAtual > numMaior) {
116 numMaior = numAtual;
moda = new Double(array[count]);
118 }
}
120 }
// System.out.print("\n Eis o mapa: "+map.toString());
122 return moda;
}
124
public double getCoefAssimetria() {
126 return (getMediaAritmetica() - getModa()) /
getDesvioPadrao();
}
128
public double[] getArray() {
130 return array;
}
132
public void setArray(double[] array) {
134 this.array = array;
}
136 }
TimeLogger (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
191
4 */
package logger;
6
import metrics.Metric;
8
/**
10 *
* @author Isma
12 */
public class TimeLogger extends MetricLogger {
14
public TimeLogger(Metric metric , String fileName) {
16 super(metric , fileName , true);
}
18
public void logTimeAndResetTimer(){
20 write(String.valueOf(metric.getTotalTime())+"\n");
metric.resetTimer();
22 }
24 public static double NSToMS(double time){
return time /1000000.0;
26 }
28
}
B.1.8 metrics
DC (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics;
192
7 import image.Block;
import image.Pixel;
9 import java.util.List;
11 /**
*
13 * @author Isma
*/
15 public class DC extends Metric {
17 public DC(boolean withTime) {
super(withTime , "DC", "DC");
19 this.type = MetricType.LESS;
}
21
/**
23 * Calculates the absolute value of DC coefficient
differences between the blocks a and b.
* The DC is the sum of all pixels of a block. Is called DC
here because the H.264 DCT DC coefficient ,
25 * wich is the sum of all pixels of a block , too.
*
27 * @param a block wich will be performed the DC
* @param b block wich will be performed the DC
29 * @return the absolute DC difference between blocks a
and b
*/
31 @Override
protected int calculateTheValue(Block a, Block b) {
33 List <Pixel > aPixels = a.getPixels();
List <Pixel > bPixels = b.getPixels();
35 int dcA = 0, dcB = 0;
for (int i = 0; i < aPixels.size(); i++) {
37 dcA += aPixels.get(i).getValue();
}
39 for (int i = 0; i < aPixels.size(); i++) {
193
dcB += bPixels.get(i).getValue();
41 }
return Math.abs(dcA - dcB);
43 }
}
Metric (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package metrics;
6
import image.Block;
8
/**
10 *
* @author Isma
12 */
public abstract class Metric {
14
private long lastTime = -1;
16 private long totalTime = 0;
boolean withTime;
18 protected MetricType type = MetricType.LESS;
private String name , simplifiedName;
20
protected abstract int calculateTheValue(Block a, Block b);
22
public Metric(boolean withTime , String name , String
simplifiedName) {
24 this.withTime = withTime;
this.name = name;
26 this.simplifiedName = simplifiedName;
}
28
194
public String getSimplifiedName() {
30 return simplifiedName;
}
32
public int calculate(Block a, Block b){
34 if (withTime){
return timing(a, b);
36 }
return fast(a, b);
38 }
40 private int timing(Block a, Block b){
long t0 = System.nanoTime();
42 int temp = calculateTheValue(a, b);
lastTime = System.nanoTime() - t0;
44 totalTime+=lastTime;
return temp;
46 }
48 private int fast(Block a, Block b){
return calculateTheValue(a, b);
50 }
52 public long getLastTime() {
return lastTime;
54 }
56 public long getTotalTime() {
return totalTime;
58 }
60 public void resetTimer(){
totalTime = 0;
62 }
64 public MetricType getType() {
195
return type;
66 }
68 @Override
public String toString() {
70 return name+"\n\tTempo total = "+totalTime+" ns.";
}
72
public String getName() {
74 return name;
}
76
public String getNameWithSpace(){
78 return getName().replace("_", " ");
}
80
82
}
MetricType (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics;
7 /**
*
9 * @author Isma
*/
11 public enum MetricType {
13 GREATER , LESS;
15 }
196
B.1.9 metrics.SAD
BorderSAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class BorderSAD extends Metric {
19 public BorderSAD(boolean withTime) {
super(withTime , "Border_SAD", "Border");
21 this.type = MetricType.LESS;
}
23
@Override
25 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int borderSAD = 0;
29 borderSAD += Math.abs(aPixels.get(0).getValue() -
bPixels.get(0).getValue());
borderSAD += Math.abs(aPixels.get(1).getValue() -
bPixels.get(1).getValue());
31 borderSAD += Math.abs(aPixels.get(2).getValue() -
bPixels.get(2).getValue());
197
borderSAD += Math.abs(aPixels.get(3).getValue() -
bPixels.get(3).getValue());
33 borderSAD += Math.abs(aPixels.get(7).getValue() -
bPixels.get(7).getValue());
borderSAD += Math.abs(aPixels.get(11).getValue() -
bPixels.get(11).getValue());
35 borderSAD += Math.abs(aPixels.get(15).getValue() -
bPixels.get(15).getValue());
borderSAD += Math.abs(aPixels.get(14).getValue() -
bPixels.get(14).getValue());
37 borderSAD += Math.abs(aPixels.get(13).getValue() -
bPixels.get(13).getValue());
borderSAD += Math.abs(aPixels.get(12).getValue() -
bPixels.get(12).getValue());
39 borderSAD += Math.abs(aPixels.get(8).getValue() -
bPixels.get(8).getValue());
borderSAD += Math.abs(aPixels.get(4).getValue() -
bPixels.get(4).getValue());
41 return borderSAD;
}
43
}
CheckerEvenSAD (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package metrics.SAD;
6
import image.Block;
8 import image.Pixel;
import java.util.List;
10 import metrics.Metric;
import metrics.MetricType;
12
198
/**
14 *
* @author Isma
16 */
public class CheckerEvenSAD extends Metric {
18
public CheckerEvenSAD(boolean withTime) {
20 super(withTime , "Checker_Even_SAD", "CheckerEven");
this.type = MetricType.LESS;
22 }
24 @Override
protected int calculateTheValue(Block a, Block b) {
26 List <Pixel > aPixels = a.getPixels();
List <Pixel > bPixels = b.getPixels();
28 int evenSAD = 0;
evenSAD += Math.abs(aPixels.get(0).getValue() - bPixels
.get(0).getValue());
30 evenSAD += Math.abs(aPixels.get(2).getValue() - bPixels
.get(2).getValue());
evenSAD += Math.abs(aPixels.get(5).getValue() - bPixels
.get(5).getValue());
32 evenSAD += Math.abs(aPixels.get(7).getValue() - bPixels
.get(7).getValue());
evenSAD += Math.abs(aPixels.get(8).getValue() - bPixels
.get(8).getValue());
34 evenSAD += Math.abs(aPixels.get(10).getValue() -
bPixels.get(10).getValue());
evenSAD += Math.abs(aPixels.get(13).getValue() -
bPixels.get(13).getValue());
36 evenSAD += Math.abs(aPixels.get(15).getValue() -
bPixels.get(15).getValue());
return evenSAD;
38 }
}
199
CheckerOddSAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class CheckerOddSAD extends Metric {
19 public CheckerOddSAD(boolean withTime) {
super(withTime , "Checker_Odd_SAD", "CheckerOdd");
21 this.type = MetricType.LESS;
}
23
@Override
25 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int oddSAD = 0;
29 oddSAD += Math.abs(aPixels.get(1).getValue() - bPixels.
get(1).getValue());
oddSAD += Math.abs(aPixels.get(3).getValue() - bPixels.
get(3).getValue());
31 oddSAD += Math.abs(aPixels.get(4).getValue() - bPixels.
get(4).getValue());
200
oddSAD += Math.abs(aPixels.get(6).getValue() - bPixels.
get(6).getValue());
33 oddSAD += Math.abs(aPixels.get(9).getValue() - bPixels.
get(9).getValue());
oddSAD += Math.abs(aPixels.get(11).getValue() - bPixels
.get(11).getValue());
35 oddSAD += Math.abs(aPixels.get(12).getValue() - bPixels
.get(12).getValue());
oddSAD += Math.abs(aPixels.get(14).getValue() - bPixels
.get(14).getValue());
37 return oddSAD;
}
39 }
CrossSAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class CrossSAD extends Metric {
19 public CrossSAD(boolean withTime) {
super(withTime , "Cross_SAD", "Cross");
21 this.type = MetricType.LESS;
201
}
23
@Override
25 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int crossSad = 0;
29 crossSad += Math.abs(aPixels.get(0).getValue() -
bPixels.get(0).getValue());
crossSad += Math.abs(aPixels.get(5).getValue() -
bPixels.get(5).getValue());
31 crossSad += Math.abs(aPixels.get(10).getValue() -
bPixels.get(10).getValue());
crossSad += Math.abs(aPixels.get(15).getValue() -
bPixels.get(15).getValue());
33 crossSad += Math.abs(aPixels.get(3).getValue() -
bPixels.get(3).getValue());
crossSad += Math.abs(aPixels.get(6).getValue() -
bPixels.get(6).getValue());
35 crossSad += Math.abs(aPixels.get(9).getValue() -
bPixels.get(9).getValue());
crossSad += Math.abs(aPixels.get(12).getValue() -
bPixels.get(12).getValue());
37 return crossSad;
}
39 }
KernellSAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
202
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class KernellSAD extends Metric {
19 public KernellSAD(boolean withTime) {
super(withTime , "Kernell_SAD", "Kernell");
21 this.type = MetricType.LESS;
}
23
@Override
25 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int kernellSAD = 0;
29 kernellSAD += Math.abs(aPixels.get(6).getValue() -
bPixels.get(6).getValue());
kernellSAD += Math.abs(aPixels.get(5).getValue() -
bPixels.get(5).getValue());
31 kernellSAD += Math.abs(aPixels.get(10).getValue() -
bPixels.get(10).getValue());
kernellSAD += Math.abs(aPixels.get(9).getValue() -
bPixels.get(9).getValue());
33 return kernellSAD;
}
35 }
MainDiagonalSAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
203
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class MainDiagonalSAD extends Metric {
19 public MainDiagonalSAD(boolean withTime) {
super(withTime , "Main_Diagonal_SAD", "MainDiagonal");
21 this.type = MetricType.LESS;
}
23
@Override
25 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int mainDiagonalSAD = 0;
29 mainDiagonalSAD += Math.abs(aPixels.get(0).getValue() -
bPixels.get(0).getValue());
mainDiagonalSAD += Math.abs(aPixels.get(5).getValue() -
bPixels.get(5).getValue());
31 mainDiagonalSAD += Math.abs(aPixels.get(10).getValue()
- bPixels.get(10).getValue());
mainDiagonalSAD += Math.abs(aPixels.get(15).getValue()
- bPixels.get(15).getValue());
33 return mainDiagonalSAD;
}
35 }
204
SAD (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrics.SAD;
7 import image.Block;
import image.Pixel;
9 import java.util.List;
import metrics.Metric;
11 import metrics.MetricType;
13 /**
*
15 * @author Isma
*/
17 public class SAD extends Metric{
19 public SAD(boolean withTime) {
super(withTime , "SAD", "SAD");
21 this.type = MetricType.LESS;
}
23
25 /**
* Calculates the sum of absolute differences (SAD) between
the blocks a and b.
27 * The SAD consistis in subtract each pixel of a block to
another , and take the module.
* This module will be summed to all other modules , making
the SAD.
29 *
* @param a block wich will be performed the SAD
205
31 * @param b block wich will be performed the SAD
* @return the sum of absolute differences between blocks
a and b
33 */
@Override
35 protected int calculateTheValue(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
37 List <Pixel > bPixels = b.getPixels();
int sad = 0;
39 for (int i = 0; i < aPixels.size(); i++) {
sad += Math.abs(aPixels.get(i).getValue() - bPixels
.get(i).getValue());
41 }
return sad;
43 }
45 }
B.1.10 metrictests
Metrics (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrictests;
7 import image.*;
import java.util.List;
9
/**
11 *
* @author Isma
13 */
public class Metrics {
15
206
/**
17 * Calculates the sum of absolute differences (SAD) between
the blocks a and b.
* The SAD consistis in subtract each pixel of a block to
another , and take the module.
19 * This module will be summed to all other modules , making
the SAD.
*
21 * @param a block wich will be performed the SAD
* @param b block wich will be performed the SAD
23 * @return the sum of absolute differences between blocks
a and b
*/
25 public int SAD(Block a, Block b) {
List <Pixel > aPixels = a.getPixels();
27 List <Pixel > bPixels = b.getPixels();
int sad = 0;
29 for (int i = 0; i < aPixels.size(); i++) {
sad += Math.abs(aPixels.get(i).getValue() - bPixels
.get(i).getValue());
31 }
return sad;
33 }
35
/**
37 * Calculates the absolute value of DC coefficient
differences between the blocks a and b.
* The DC is the sum of all pixels of a block. Is called DC
here because the H.264 DCT DC coefficient ,
39 * wich is the sum of all pixels of a block , too.
*
41 * @param a block wich will be performed the DC
* @param b block wich will be performed the DC
43 * @return the absolute DC difference between blocks a
and b
207
*/
45 public int DCDifference(Block a, Block b){
List <Pixel > aPixels = a.getPixels();
47 List <Pixel > bPixels = b.getPixels();
int dcA = 0, dcB = 0;
49 for (int i = 0; i < aPixels.size(); i++) {
dcA += aPixels.get(i).getValue();
51 }
for (int i = 0; i < aPixels.size(); i++) {
53 dcB += bPixels.get(i).getValue();
}
55 return Math.abs(dcA -dcB);
}
57
public int numEqualBits(Block a, Block b){
59 List <Pixel > aPixels = a.getPixels();
List <Pixel > bPixels = b.getPixels();
61 return 0;
}
63
65 }
MetricTests (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package metrictests;
7 import generator.IntraModes;
import graphics.GNUPlotPNGPrinter;
9 import graphics.PSNRGraphic;
import graphics.ResidueGraphic;
11 import graphics.SSIMGraphic;
import graphics.TimeGraphic;
208
13 import image.Block;
import image.Image;
15 import image.ImageType;
import java.util.ArrayList;
17 import java.util.List;
import javaImage.ImageUtils;
19 import logger.ImageJDistortionLogger;
import logger.ImageGeneralLogger;
21 import logger.ImageGeneralLoggerResumed;
import logger.PSNRLogger;
23 import logger.ResidueLogger;
import logger.TimeLogger;
25 import metrics.DC;
import metrics.Metric;
27 import metrics.SAD.BorderSAD;
import metrics.SAD.CheckerEvenSAD;
29 import metrics.SAD.CheckerOddSAD;
import metrics.SAD.CrossSAD;
31 import metrics.SAD.KernellSAD;
import metrics.SAD.MainDiagonalSAD;
33 import metrics.SAD.SAD;
35 /**
*
37 * @author Isma
*/
39 public class MetricTests {
41 public static List <Metric > getMetricsList() {
List <Metric > metrics = new ArrayList <Metric >();
43
//order by tcc :P
45 metrics.add(new SAD(true));
metrics.add(new DC(true));
47 metrics.add(new MainDiagonalSAD(true));
metrics.add(new KernellSAD(true));
209
49 metrics.add(new BorderSAD(true));
metrics.add(new CrossSAD(true));
51 metrics.add(new CheckerOddSAD(true));
metrics.add(new CheckerEvenSAD(true));
53
System.out.println("Metricas carregadas...");
55 return metrics;
}
57
public static List <Image > getImageList() {
59 List <Image > images = new ArrayList <Image >();
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.01.png"), (
byte) 4));
61 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.02.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.03.png"), (
byte) 4));
63 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.04.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.05.png"), (
byte) 4));
65 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.06.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.07.png"), (
byte) 4));
67 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.1.08.png"), (
byte) 4));
210
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.01.png"), (
byte) 4));
69 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.02.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.03.png"), (
byte) 4));
71 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.04.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.05.png"), (
byte) 4));
73 images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.06.png"), (
byte) 4));
images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /4.2.07.png"), (
byte) 4));
75
77 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.09.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.10.png"), (byte) 4))
;
79 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.11.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.12.png"), (byte) 4))
;
211
81 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.13.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.1.14.png"), (byte) 4))
;
83 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.2.08.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.2.09.png"), (byte) 4))
;
85 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.2.10.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.3.01.png"), (byte) 4))
;
87 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /5.3.02.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.01.png"), (byte) 4))
;
89 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.02.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.03.png"), (byte) 4))
;
91 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.04.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.05.png"), (byte) 4))
;
212
93 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.06.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.07.png"), (byte) 4))
;
95 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.08.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.09.png"), (byte) 4))
;
97 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.1.10.png"), (byte) 4))
;
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images /7.2.01.png"), (byte) 4))
;
99 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/boat.512.png"), (byte)
4));
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/elaine.512.png"), (byte)
4));
101 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/gray21.512.png"), (byte)
4));
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/house.png"), (byte) 4));
103 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/numbers .512.png"), (byte
) 4));
// images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/ruler.512.png"), (byte)
4));
213
105 // images.add(new Image(ImageUtils.loadImage("http://dl.
dropbox.com/u/2650772/ Test%20Images/testpat.1k.png"), (byte)
4));
System.out.println("Imagens carregadas!");
107 return images;
}
109 private static int counter = 0;
111 public static void silentTestAllImagesWithAllMetrics(List <
Image > images , List <Metric > metrics , IntraModes intra) {
ImageGeneralLoggerResumed resumeLog;
113 counter = 0;
// for (Image referenceImage : images) {
115 // Image luma = referenceImage.getLuminanceCopy();
// Image result = (Image) luma.clone();
117 // ImageUtils.saveImage("teste_" + String.valueOf(
counter) + "_original.png", result);
// for (Metric metric : metrics) {
119 // testWithMetric(referenceImage , metric , intra)
;
// }
121 // counter++;
// }
123 //
// System.out.println("Testes completos!");
125 //
// ImageJDistortionLogger ssimLogger = new
ImageJDistortionLogger("SSIM", metrics , images.size());
127 // ssimLogger.writeAll();
129 counter = 0;
for (int i = 0; i < images.size(); i++) {
131 for (int j = 0; j < metrics.size(); j++) {
resumeLog = new ImageGeneralLoggerResumed("
teste_" + String.valueOf(counter), metrics);
133 resumeLog.generateLaTeXTable();
214
}
135 counter++;
}
137 System.out.println("Passou!");
139 }
141 public static void testWithMetric(Image referenceImage ,
Metric metric , IntraModes intra) {
Image luma = referenceImage.getLuminanceCopy();
143 Image result = (Image) luma.clone();
145 System.out.println("Recreating image...");
for (Block reference : luma.getBlocks()) {
147 result.changeBlock(result.getBlock(luma.
getBlockIndex(reference)), intra.
bestMatchWithMetric(metric , result.getBlock(luma
.getBlockIndex(reference)), luma.getLeftBlock(
reference), luma.getLeftUpperBlock(reference),
luma.getUpperBlock(reference), luma.
getRightUpperBlock(reference)));
}
149 System.out.println("Done.");
151 System.out.println("Saving new image...");
ImageUtils.saveImage("teste_" + String.valueOf(counter)
+ "_" + metric.getName() + ".png", result);
153 System.out.println("Done.");
155
System.out.println("Calculating PSNR and writing log...
");
157 //PSNR quality log
PSNRLogger psnrLogger = new PSNRLogger(metric , "teste_"
+ String.valueOf(counter) + "_" + metric.getName()
+ "_psnr.txt");
215
159 psnrLogger.calculateAndSavePSNR(luma , result);
System.out.println("Done.");
161
System.out.println("Calculating residue and writing log
...");
163 long blockSum = luma.getSumOfPixels();
Image residue = luma.lumaResidue(result);
165 long residueSum = residue.getSumOfPixels();
double percentualResidue = (residueSum / (double)
blockSum) * 100;
167
//Residue log
169 ResidueLogger residueLogger = new ResidueLogger(metric ,
"teste_" + String.valueOf(counter) + "_" + metric.
getName() + "_residue.txt");
residueLogger.writeDouble(percentualResidue);
171 System.out.println("Done.");
173 System.out.println("Saving residue image...");
ImageUtils.saveImage("teste_" + String.valueOf(counter)
+ "_" + metric.getName() + "_residue.png", residue)
;
175 System.out.println("Done.");
177 System.out.println("Writing timing log...");
//Timing log
179 TimeLogger timeLogger = new TimeLogger(metric , "teste_"
+ String.valueOf(counter) + "_" + metric.getName()
+ "_time.txt");
timeLogger.logTimeAndResetTimer();
181 System.out.println("teste_" + String.valueOf(counter) +
"_" + metric.getName() + " feito!!!");
System.out.println("Done.");
183 }
185 public static void clearPNGs() {
216
try {
187 Runtime.getRuntime().exec("rm *.png");
} catch (Exception e) {
189 System.out.println("Erro: " + e);
}
191 }
193 /**
* @param args the command line arguments
195 */
public static void main(String[] args) {
197 int numberOfTests = 1;
List <Metric > metrics = getMetricsList();
199 List <Image > images = getImageList();
for (int i = 0; i < numberOfTests; i++) {
201 //// clearPNGs();
// System.out.println("Iniciando todas as rodadas
...");
203 // System.out.println("\n\nRodada n m e r o "+i+"\n");
silentTestAllImagesWithAllMetrics(images , metrics ,
new IntraModes(ImageType.GRAYSCALE));
205 }
207 List <GNUPlotPNGPrinter > graphics = new ArrayList <
GNUPlotPNGPrinter >();
for (int i = 0; i < images.size(); i++) {
209 graphics.add(new TimeGraphic("teste_"+i, i, metrics
));
graphics.add(new SSIMGraphic("teste_"+i, i, metrics
));
211 graphics.add(new PSNRGraphic("teste_"+i, i, metrics
));
graphics.add(new ResidueGraphic("teste_"+i, i,
metrics));
213 }
217
215 for (GNUPlotPNGPrinter graphic : graphics) {
graphic.plot();
217 }
219
// SSIMGraphic ssimGraphic0 =
221 // ssimGraphic0.plot();
223 // Image img = new Image(ImageUtils.loadImage("http://4.
bp.blogspot.com/_n92csLa3ox0/THc9BxnvrkI/AAAAAAAAAO4/
_umm405trho/s1600/Karla+Carrillo2.jpg"), (byte) 4);
// ImageUtils.apresentaImagem("Teste", img.
getOutputImage());
225 // IntraModes intra = new IntraModes(ImageType.GRAYSCALE
);
// testWithMetric(img , new SAD(true), intra);
227 // testWithMetric(img , new DC(true), intra);
}
229 }
B.1.11 quality
MSE (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package quality;
7 import image.Image;
import image.Pixel;
9
/**
11 *
* @author Isma
13 */
218
public class MSE implements QualityMetric{
15
@Override
17 public double calculate(Image I, Image K) {
double sum = 0.0;
19 double diff;
Pixel[][] mI = I.getPixelMatrix(), mK = K.
getPixelMatrix();
21 int m = mI.length , n = mI[1].length;
for (int i = 0; i < m; i++) {
23 for (int j = 0; j < n; j++) {
diff = mI[i][j].getValue() - mK[i][j].getValue
();
25 sum+=diff*diff;
}
27 }
return sum/((double)m*n);
29 }
31
33 }
PSNR (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package quality;
7 import image.Image;
9 /**
*
11 * @author Isma
*/
219
13 public class PSNR implements QualityMetric{
15 @Override
public double calculate(Image I, Image K) {
17 MSE mse = new MSE();
double mseValue = mse.calculate(I, K);
19 double psnrValue = 10*Math.log10 ((255*255)/mseValue);
return psnrValue;
21
}
23
}
QualityMetric (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package quality;
6
import image.Image;
8
/**
10 *
* @author Isma
12 */
public interface QualityMetric {
14
double calculate(Image I, Image K);
16
}
B.1.12 reader
DataFileReader (
1 /*
* To change this template , choose Tools | Templates
220
3 * and open the template in the editor.
*/
5 package reader;
7 import java.io.BufferedReader;
import java.io.FileReader;
9 import java.text.NumberFormat;
import java.util.ArrayList;
11 import java.util.List;
13 /**
*
15 * @author Isma
*/
17 public class DataFileReader {
19 public double[] getAllDoubles(String fileName , int
precision) {
NumberFormat f = NumberFormat.getInstance();
21 f.setMaximumFractionDigits(precision);
List <Double > doublesList = new ArrayList <Double >();
23 int pointPosition;
try {
25 BufferedReader in = new BufferedReader(new
FileReader(fileName));
String str;
27 while (in.ready()) {
str = in.readLine();
29 if (!"".equals(str)) {
pointPosition = str.indexOf(".");
31 if (pointPosition > 0)
str = str.substring(0, pointPosition +
precision + 1);
33 doublesList.add(new Double(str));
}
35 }
221
in.close();
37 } catch (Exception e) {
System.out.println("Erro: " + e);
39 }
double[] result = new double[doublesList.size()];
41 for (int i = 0; i < result.length; i++) {
result[i] = doublesList.get(i).doubleValue();
43 }
return result;
45 }
47 public double getDouble(String fileName , int precision) {
double result = 0.0;
49 int pointPosition;
try {
51 BufferedReader in = new BufferedReader(new
FileReader(fileName));
String str;
53 if (in.ready()) {
str = in.readLine();
55 pointPosition = str.indexOf(".");
if (pointPosition > 0)
57 str = str.substring(0, pointPosition +
precision + 1);
result = Double.parseDouble(str);
59 }
in.close();
61 } catch (Exception e) {
System.out.println("Erro: " + e);
63 }
return result;
65 }
}
222
B.2 Macro para o software ImageJ - Avaliao do SSIM
location = "C:\\Users\\Isma\\Documents\\NetBeansProjects\\
MetricTests\\";
2 numberOfImages = 15;
metrics = newArray("SAD", "DC", "Main_Diagonal_SAD", "
Kernell_SAD", "Border_SAD", "Cross_SAD", "Checker_Odd_SAD",
"Checker_Even_SAD");
4
for (i=0; i<numberOfImages; i++){
6 //print("Abrindo imagem original"+i);
open(location+"teste_"+i+"_original.png");
8 for (j=0; j<metrics.length; j++){
print("Abrindo metrica "+metrics[j]);
10 open(location+"teste_"+i+"_"+metrics[j]+".png");
run("SSIM index", "standard=1.5 window=[Same weight]
filter=11 k1=0.01 k2=0.03 view=1 filter=20");
12 print("Fechando metrica "+metrics[j]);
close();
14 }
close();
16 }
18 run("Quit");
B.3 Vericao da implementao na JM
B.3.1 validacaojm
Main (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package validacaojm;
223
6
import image.Block;
8 import image.ImageType;
import java.io.BufferedReader;
10 import java.io.DataInputStream;
import java.io.FileInputStream;
12 import java.io.InputStreamReader;
import java.util.ArrayList;
14 import java.util.List;
import metrics.DC;
16 import metrics.Metric;
import metrics.SAD.BorderSAD;
18 import metrics.SAD.CheckerEvenSAD;
import metrics.SAD.CheckerOddSAD;
20 import metrics.SAD.CrossSAD;
import metrics.SAD.KernellSAD;
22 import metrics.SAD.MainDiagonalSAD;
import metrics.SAD.SAD;
24
/**
26 *
* @author ismaelseidel
28 */
public class Main {
30
public static final String validationPath = "../../JM/
Validacao/";
32
/**
34 * @param args the command line arguments
*/
36 public static void main(String[] args) {
List <Metric > metrics = new ArrayList <Metric >();
38 metrics.add(new SAD(false));
metrics.add(new DC(false));
40 metrics.add(new MainDiagonalSAD(false));
224
metrics.add(new KernellSAD(false));
42 metrics.add(new BorderSAD(false));
metrics.add(new CrossSAD(false));
44 metrics.add(new CheckerOddSAD(false));
metrics.add(new CheckerEvenSAD(false));
46
System.out.println("Iniciando validacao da
implementacao das metricas no software de referencia
...\n\n");
48
for (Metric metric : metrics) {
50 validate(metric);
}
52
System.out.println("DONE...\n\n");
54 }
56 public static boolean validate(Metric metric) {
System.out.println("Iniciando validacao da metrica "+
metric.getName()+"...");
58 String fileName = validationPath + metric.getName() + "
.txt";
long numBlocks = 0;
60 int[][] src = new int[4][4], ref = new int[4][4];
62
try {
64 FileInputStream fstream = new FileInputStream(
fileName);
DataInputStream in = new DataInputStream(fstream);
66 BufferedReader br = new BufferedReader(new
InputStreamReader(in));
String strLine;
68 int i = 0, j;
int lastResult = 0;
70 while ((strLine = br.readLine()) != null) {
225
if ("".equals(strLine)) {
72 br.readLine();
lastResult = Integer.parseInt(br.readLine()
);
74 br.readLine();
br.readLine();
76 i = 0;
numBlocks++;
78 if (!validateOneBlock(src , ref , lastResult ,
metric))
{
80 System.out.println("Validacao da
metrica "+metric.getName()+" FALHOU
...");
System.out.println("Antes de falhar
foram verificados "+(numBlocks -1)+"
blocos 4x4.\n\n");
82 return false;
}
84 } else {
String[] tokens = strLine.split("\t\t");
86 j = 0;
for (String pair : tokens) {
88 String[] s = pair.split("\t");
src[i][j] = Integer.parseInt(s[0]);
90 ref[i][j] = Integer.parseInt(s[1]);
j++;
92 }
i++;
94 }
}
96 in.close();
} catch (Exception e) {
98 System.err.println("Error: " + e.getMessage());
return false;
100 }
226
102 System.out.println("Validacao da metrica "+metric.
getName()+" terminada com SUCESSO.");
System.out.println("Foram verificados "+numBlocks+"
blocos 4x4.\n");
104 return true;
}
106
public static boolean validateOneBlock(int[][] src , int[][]
ref , int expectedResult , Metric metric) {
108 Block srcBlock = new Block(src , ImageType.GRAYSCALE),
refBlock = new Block(ref , ImageType.GRAYSCALE);
int result = metric.calculate(refBlock , srcBlock);
110 if (result == expectedResult) {
return true;
112 } else {
System.out.println("\n\n#################\ nEsperado
: "+expectedResult);
114 System.out.println("Encontrado: "+result);
System.out.println("SRC BLOCK:\n"+srcBlock);
116 System.out.println("REF BLOCK:\n"+refBlock);
System.out.println("#################\n\n");
118 return false;
}
120 }
}
B.4 Leitura das estatsticas e Gerao de Grcos sobre a JM
B.4.1 graphics
SampleContainner (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
227
5 package graphics;
7 import java.util.HashSet;
import java.util.List;
9 import metrics.Metric;
import searchMethods.SearchMethod;
11 import testSample.Sample;
13 /**
*
15 * @author ismaelseidel
*/
17 public class SampleContainner {
19 private String title;
private List <Sample > samples;
21 private HashSet metrics = new HashSet(), searchModes = new
HashSet();
23 public SampleContainner(List <Sample > samples) {
this.title = samples.get(0).getVideoSampleName();
25 this.samples = samples;
for (Sample sample : samples) {
27 metrics.add(sample.getMetric());
searchModes.add(sample.getSearchMethod());
29 }
}
31
public double getMaxRDValue() {
33 double maxRD = Double.MIN_VALUE;
double tempRD;
35 for (Sample sample : samples) {
tempRD = sample.getRD();
37 if (tempRD > maxRD) {
maxRD = tempRD;
39 }
228
}
41 return maxRD;
}
43
public double getMinRDValue() {
45 double minRD = Double.MAX_VALUE;
double tempRD;
47 for (Sample sample : samples) {
tempRD = sample.getRD();
49 if ((tempRD < minRD) && (tempRD != 0)) {
minRD = tempRD;
51 }
}
53 return minRD;
}
55
public String getName() {
57 return title.replace( , _);
}
59
public String getTitle() {
61 return title;
}
63
public HashSet <Metric > getMetrics() {
65 return metrics;
}
67
public HashSet <SearchMethod > getSearchModes() {
69 return searchModes;
}
71
public List <Sample > getSamples() {
73 return samples;
}
75
229
public double getMaxPSNR() {
77 double maxPSNR = Double.MIN_VALUE;
double tempPSNR;
79 for (Sample sample : samples) {
tempPSNR = sample.getPSNR();
81 if (tempPSNR > maxPSNR) {
maxPSNR = tempPSNR;
83 }
}
85 return maxPSNR;
}
87
public double getMinPSNR() {
89 double minPSNR = Double.MAX_VALUE;
double tempPSNR;
91 for (Sample sample : samples) {
tempPSNR = sample.getPSNR();
93 if ((tempPSNR < minPSNR) && (tempPSNR != 0)) {
minPSNR = tempPSNR;
95 }
}
97 return minPSNR;
}
99
public double getMaxBitRate() {
101 double maxBitRate = Double.MIN_VALUE;
double tempBitRate;
103 for (Sample sample : samples) {
tempBitRate = sample.getBitRate();
105 if (tempBitRate > maxBitRate) {
maxBitRate = tempBitRate;
107 }
}
109 return maxBitRate;
}
111
230
public double getMinBitRate() {
113 double minBitRate = Double.MAX_VALUE;
double tempBitRate;
115 for (Sample sample : samples) {
tempBitRate = sample.getBitRate();
117 if ((tempBitRate < minBitRate) && (tempBitRate !=
0)) {
minBitRate = tempBitRate;
119 }
}
121 return minBitRate;
}
123
public double getMaxFairComparissonValue() {
125 double maxFairComparissonValue = Double.MIN_VALUE;
double tempFairComparissonValue;
127 for (Sample sample : samples) {
tempFairComparissonValue = sample.
getFairComparissonValue(this);
129 if (tempFairComparissonValue >
maxFairComparissonValue) {
maxFairComparissonValue =
tempFairComparissonValue;
131 }
}
133 return maxFairComparissonValue;
}
135
public double getMinFairComparissonValue() {
137 double minFairComparissonValue = Double.MAX_VALUE;
double tempFairComparissonValue;
139 for (Sample sample : samples) {
tempFairComparissonValue = sample.
getFairComparissonValue(this);
141 if ((tempFairComparissonValue <
minFairComparissonValue) && (
231
tempFairComparissonValue != 0)) {
minFairComparissonValue =
tempFairComparissonValue;
143 }
}
145 return minFairComparissonValue;
}
147
149
}
SamplePercentualPlotter (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package graphics;
6
import java.util.ArrayList;
8 import java.util.Collections;
import java.util.List;
10 import jmstatsparser.Comparators;
import logger.Logger;
12 import metrics.Metric;
import searchMethods.SearchMethod;
14 import testSample.Sample;
16 /**
*
18 * @author ismaelseidel
*/
20 public class SamplePercentualPlotter extends GNUPlotPNGPrinter
{
22 SampleContainner sc;
232
24
public SamplePercentualPlotter(SampleContainner sc) {
26 this.sc = sc;
this.title = sc.getTitle()+" - RD(%) vs. M t r i c a ";
28 this.xLabel = " M t r i c a ";
this.yLabel = "RD %% em r e l a o SAD";
30 this.outputName = sc.getName() + "_rdSADVSmetrica.png";
this.dataSet = sc.getName()+ "_rdsad_data.txt";
32 this.width = 800;
this.height = 600;
34 this.macroName = sc.getName()+"_rdsad_macro.txt";
}
36
// # set terminal png transparent nocrop enhanced font arial
8 size 420,320
38 //# set output histograms.2.png
//set boxwidth 0.9 absolute
40 //set style fill solid 1.00 border -1
//set style histogram clustered gap 1 title offset character
0, 0, 0
42 //set datafile missing -
//set style data histograms
44 //set xtics border in scale 1,0.5 nomirror rotate by -45
offset character 0, 0, 0
//set xtics ("1891 -1900" 0.00000, "1901-1910" 1.00000,
"1911-1920" 2.00000, "1921-1930" 3.00000, "1931-1940"
4.00000, "1941-1950" 5.00000, "1951-1960" 6.00000,
"1961-1970" 7.00000)
46 //set title "US immigration from Northern Europe\nPlot selected
data columns as histogram of clustered boxes"
//set yrange [ 0.00000 : 300000. ] noreverse nowriteback
48 //plot immigration.dat using 6:xtic(1) ti col , u 12 ti col
, u 13 ti col , u 14 ti col
double yMax , yMin;
50
233
@Override
52 protected void writeGNUPlotMacro() {
updateDataSet();
54 Logger writer = new Logger(macroName , false);
writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
56 writer.write("set output \" + outputName + "\\n");
58 writer.write("set boxwidth 0.9 absolute\n");
writer.write("set style fill solid 1.00 border -1\n");
60 writer.writeln("set style histogram clustered gap 1
title offset character 0, 0, 0");
writer.writeln("set datafile missing -");
62 writer.writeln("set style data histograms");
writer.writeln("set xtics border in scale 1,0.5
nomirror rotate by -45 offset character 0, 0, 0");
64 //tics OK
writer.writeln("set xtics "+getXTics());
66 writer.writeln("set xlabel \""+xLabel+"\"");
writer.write("set title \"" + title + "\"\n");
68 //atencao
writer.writeln("set yrange [ "+yMin+" : "+yMax+" ]
noreverse nowriteback");
70 writer.writeln("set ylabel \""+yLabel+"\"");
writer.writeln(getPlotStr());//plot immigration.dat
using 6:xtic(1) ti col , u 12 ti col , u 13 ti
col , u 14 ti col
72
74 }
76 private String getPlotStr(){
String result = "plot \"+dataSet+"\ using 2:xtic(1)
ti col";
78 int lim = sc.getSearchModes().size()+2;
234
for (int i= 3; i < lim; i++) {
80 result+=", \\ u "+i+" ti col";
}
82 return result;
}
84
private String getXTics(){
86 String xTics = "(";
double c = 0.0;
88 for (Metric metric : sc.getMetrics()) {
if(c != 0.0)
90 xTics+=", ";
xTics+="\""+metric.getSimplifiedName()+"\" "+c;
92 c++;
}
94 xTics+=")";
return xTics;
96 }
98 private void updateDataSet() {
List <Metric > tempMetrics = new ArrayList <Metric >();
100 List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
for (SearchMethod searchMethod : sc.getSearchModes()) {
102 tempSearchMethods.add(searchMethod);
}
104 for (Metric metric : sc.getMetrics()) {
tempMetrics.add(metric);
106 }
108 Collections.sort(tempMetrics , Comparators.
metricComparator);
Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
110
235
double map[][] = new double[tempMetrics.size()][
tempSearchMethods.size()];
112
for (Sample sample : sc.getSamples()) {
114 map[tempMetrics.indexOf(sample.getMetric())][
tempSearchMethods.indexOf(sample.getSearchMethod
())] = sample.getFairComparissonValue(sc);
}
116
118 Logger writer = new Logger(dataSet , false);
String ln="metric";
120 for (SearchMethod searchMethod : tempSearchMethods) {
ln+="\t"+searchMethod.getName();
122 }
writer.writeln(ln);
124
126 for (int i= 0; i < map.length; i++) {
ln = tempMetrics.get(i).getSimplifiedName();
128 for (int j= 0; j < map[0].length; j++) {
ln+="\t"+map[i][j];
130 }
writer.writeln(ln);
132 }
double maxFair = sc.getMaxFairComparissonValue(),
minFair = sc.getMinFairComparissonValue();
134
yMax = maxFair +0.01* maxFair;
136 yMin = minFair -0.01* minFair;
}
138 }
SamplePercentualPlotterRight (
1 /*
* To change this template , choose Tools | Templates
236
3 * and open the template in the editor.
*/
5 package graphics;
7 import java.util.ArrayList;
import java.util.Collections;
9 import java.util.List;
import jmstatsparser.Comparators;
11 import logger.Logger;
import metrics.Metric;
13 import searchMethods.SearchMethod;
import testSample.Sample;
15
/**
17 *
* @author ismaelseidel
19 */
public class SamplePercentualPlotterRight extends
GNUPlotPNGPrinter {
21
SampleContainner sc;
23
public SamplePercentualPlotterRight(SampleContainner sc) {
25 this.sc = sc;
this.title = sc.getTitle() + " - R/D (Kb/dB) vs. Busca"
;
27 this.xLabel = "Busca";
this.yLabel = "R/D (Kb/dB)";
29 //this.outputName = sc.getName() + "
_rdPercentualVSmetrica.ps";
this.outputName = sc.getName() + "
_rdPercentualVSmetrica.png";
31 this.dataSet = sc.getName() + "_rdpercentual_data.txt";
this.width = 800;
33 this.height = 600;
237
this.macroName = sc.getName() + "_rdpercentual_macro.
txt";
35 }
// # set terminal png transparent nocrop enhanced font arial
8 size 420,320
37 //# set output histograms.2.png
//set boxwidth 0.9 absolute
39 //set style fill solid 1.00 border -1
//set style histogram clustered gap 1 title offset character
0, 0, 0
41 //set datafile missing -
//set style data histograms
43 //set xtics border in scale 1,0.5 nomirror rotate by -45
offset character 0, 0, 0
//set xtics ("1891 -1900" 0.00000, "1901-1910" 1.00000,
"1911-1920" 2.00000, "1921-1930" 3.00000, "1931-1940"
4.00000, "1941-1950" 5.00000, "1951-1960" 6.00000,
"1961-1970" 7.00000)
45 //set title "US immigration from Northern Europe\nPlot selected
data columns as histogram of clustered boxes"
//set yrange [ 0.00000 : 300000. ] noreverse nowriteback
47 //plot immigration.dat using 6:xtic(1) ti col , u 12 ti col
, u 13 ti col , u 14 ti col
double yMax , yMin;
49
@Override
51 protected void writeGNUPlotMacro() {
updateDataSet();
53 Logger writer = new Logger(macroName , false);
writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
55 //writer.writeln("set term postscript enhanced color ")
;
writer.write("set output \" + outputName + "\\n");
57
238
writer.write("set boxwidth 0.9 absolute\n");
59 writer.write("set style fill solid 1.00 border -1\n");
writer.writeln("set style histogram clustered gap 1
title offset character 0, 0, 0");
61 writer.writeln("set datafile missing -");
writer.writeln("set style data histograms");
63 writer.writeln("set xtics border in scale 1,0.5
nomirror rotate by -45 offset character 0, 0, 0");
//tics OK
65 writer.writeln("set xtics " + getXTics());
writer.writeln("set xlabel \"" + xLabel + "\"");
67 writer.write("set title \"" + title + "\"\n");
//atencao
69 writer.writeln("set yrange [ " + yMin + " : " + yMax +
" ] noreverse nowriteback");
writer.writeln("set ylabel \"" + yLabel + "\"");
71 writer.writeln("set mytics 2");
writer.writeln("set grid ytics mytics");
73 writer.writeln("set key box");
writer.writeln(getPlotStr());//plot immigration.dat
using 6:xtic(1) ti col , u 12 ti col , u 13 ti
col , u 14 ti col
75
77 }
79 private String getPlotStr() {
String result = "plot \" + dataSet + "\ using 2:xtic
(1) ti col";
81 int lim = sc.getMetrics().size() + 2;
for (int i = 3; i < lim; i++) {
83 result += ", \\ u " + i + " ti col";
}
85 return result;
}
87
239
private String getXTics() {
89 List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
for (SearchMethod searchMethod : sc.getSearchModes()) {
91 tempSearchMethods.add(searchMethod);
}
93 Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
Collections.reverse(tempSearchMethods);
95 String xTics = "(";
double c = 0.0;
97 for (SearchMethod sm : tempSearchMethods) {
if (c != 0.0) {
99 xTics += ", ";
}
101 xTics += "\"" + sm.getName() + "\" " + c;
c++;
103 }
xTics += ")";
105 return xTics;
}
107
private void updateDataSet() {
109 List <Metric > tempMetrics = new ArrayList <Metric >();
List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
111 for (SearchMethod searchMethod : sc.getSearchModes()) {
tempSearchMethods.add(searchMethod);
113 }
for (Metric metric : sc.getMetrics()) {
115 tempMetrics.add(metric);
}
117
Collections.sort(tempMetrics , Comparators.
metricComparator);
119 Collections.reverse(tempMetrics);
240
Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
121 Collections.reverse(tempSearchMethods);
123
125
double map[][] = new double[tempSearchMethods.size()][
tempMetrics.size()];
127
for (Sample sample : sc.getSamples()) {
129 map[tempSearchMethods.indexOf(sample.
getSearchMethod())][tempMetrics.indexOf(sample.
getMetric())] = sample.getFairComparissonValue(
sc);
}
131
133 Logger writer = new Logger(dataSet , false);
String ln="mode";
135 for (Metric metric : tempMetrics) {
ln+="\t"+metric.getSimplifiedName();
137 }
writer.writeln(ln);
139
141 for (int i= 0; i < map.length; i++) {
ln = tempSearchMethods.get(i).getName();
143 for (int j= 0; j < map[0].length; j++) {
ln+="\t"+map[i][j];
145 }
writer.writeln(ln);
147 }
double maxFair = sc.getMaxFairComparissonValue(),
minFair = sc.getMinFairComparissonValue();
149
241
yMax = maxFair + 0.01* maxFair;
151 yMin = minFair - 0.01 * minFair;
}
153 }
SamplePlotter (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 import java.util.ArrayList;
import java.util.Collections;
9 import java.util.List;
import jmstatsparser.Comparators;
11 import logger.Logger;
import metrics.Metric;
13 import searchMethods.SearchMethod;
import testSample.Sample;
15
/**
17 *
* @author ismaelseidel
19 */
public class SamplePlotter extends GNUPlotPNGPrinter {
21
SampleContainner sc;
23
25 public SamplePlotter(SampleContainner sc) {
this.sc = sc;
27 this.title = sc.getTitle()+" - RD vs. M t r i c a ";
this.xLabel = " M t r i c a ";
29 this.yLabel = "RD = PSNR(dB)*bit -rate(kbps)";
this.outputName = sc.getName() + "_rdVSmetrica.png";
242
31 this.dataSet = sc.getName()+ "_rd_data.txt";
this.width = 800;
33 this.height = 600;
this.macroName = sc.getName()+"_rd_macro.txt";
35 }
37 // # set terminal png transparent nocrop enhanced font arial
8 size 420,320
//# set output histograms.2.png
39 //set boxwidth 0.9 absolute
//set style fill solid 1.00 border -1
41 //set style histogram clustered gap 1 title offset character
0, 0, 0
//set datafile missing -
43 //set style data histograms
//set xtics border in scale 1,0.5 nomirror rotate by -45
offset character 0, 0, 0
45 //set xtics ("1891 -1900" 0.00000, "1901-1910" 1.00000,
"1911-1920" 2.00000, "1921-1930" 3.00000, "1931-1940"
4.00000, "1941-1950" 5.00000, "1951-1960" 6.00000,
"1961-1970" 7.00000)
//set title "US immigration from Northern Europe\nPlot selected
data columns as histogram of clustered boxes"
47 //set yrange [ 0.00000 : 300000. ] noreverse nowriteback
//plot immigration.dat using 6:xtic(1) ti col , u 12 ti col
, u 13 ti col , u 14 ti col
49 double yMax , yMin;
51 @Override
protected void writeGNUPlotMacro() {
53 updateDataSet();
Logger writer = new Logger(macroName , false);
55 writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
writer.write("set output \" + outputName + "\\n");
243
57
writer.write("set boxwidth 0.9 absolute\n");
59 writer.write("set style fill solid 1.00 border -1\n");
writer.writeln("set style histogram clustered gap 1
title offset character 0, 0, 0");
61 writer.writeln("set datafile missing -");
writer.writeln("set style data histograms");
63 writer.writeln("set xtics border in scale 1,0.5
nomirror rotate by -45 offset character 0, 0, 0");
//tics OK
65 writer.writeln("set xtics "+getXTics());
writer.writeln("set xlabel \""+xLabel+"\"");
67 writer.write("set title \"" + title + "\"\n");
//atencao
69 writer.writeln("set yrange [ "+yMin+" : "+yMax+" ]
noreverse nowriteback");
writer.writeln("set ylabel \""+yLabel+"\"");
71 writer.writeln(getPlotStr());//plot immigration.dat
using 6:xtic(1) ti col , u 12 ti col , u 13 ti
col , u 14 ti col
73
}
75
private String getPlotStr(){
77 String result = "plot \"+dataSet+"\ using 2:xtic(1)
ti col";
int lim = sc.getSearchModes().size()+2;
79 for (int i= 3; i < lim; i++) {
result+=", \\ u "+i+" ti col";
81 }
return result;
83 }
85 private String getXTics(){
String xTics = "(";
244
87 double c = 0.0;
for (Metric metric : sc.getMetrics()) {
89 if(c != 0.0)
xTics+=", ";
91 xTics+="\""+metric.getSimplifiedName()+"\" "+c;
c++;
93 }
xTics+=")";
95 return xTics;
}
97
private void updateDataSet() {
99 List <Metric > tempMetrics = new ArrayList <Metric >();
List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
101 for (SearchMethod searchMethod : sc.getSearchModes()) {
tempSearchMethods.add(searchMethod);
103 }
for (Metric metric : sc.getMetrics()) {
105 tempMetrics.add(metric);
}
107
Collections.sort(tempMetrics , Comparators.
metricComparator);
109 Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
111 double map[][] = new double[tempMetrics.size()][
tempSearchMethods.size()];
113 for (Sample sample : sc.getSamples()) {
map[tempMetrics.indexOf(sample.getMetric())][
tempSearchMethods.indexOf(sample.getSearchMethod
())] = sample.getRD();
115 }
245
117
Logger writer = new Logger(dataSet , false);
119 String ln="metric";
for (SearchMethod searchMethod : tempSearchMethods) {
121 ln+="\t"+searchMethod.getName();
}
123 writer.writeln(ln);
125
for (int i= 0; i < map.length; i++) {
127 ln = tempMetrics.get(i).getSimplifiedName();
for (int j= 0; j < map[0].length; j++) {
129 ln+="\t"+map[i][j];
}
131 writer.writeln(ln);
}
133
double maxRD = sc.getMaxRDValue(), minRD = sc.
getMinRDValue();
135 yMax = maxRD+maxRD*0.01;
yMin = minRD -maxRD*0.01;
137 }
}
SampleRightPlotter (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package graphics;
7 import java.util.ArrayList;
import java.util.Collections;
9 import java.util.List;
import jmstatsparser.Comparators;
11 import logger.Logger;
246
import metrics.Metric;
13 import searchMethods.SearchMethod;
import testSample.Sample;
15
/**
17 *
* @author ismaelseidel
19 */
public class SampleRightPlotter extends GNUPlotPNGPrinter {
21
SampleContainner sc;
23
25 public SampleRightPlotter(SampleContainner sc) {
this.sc = sc;
27 this.title = sc.getTitle()+" - RD vs. Busca";
this.xLabel = "Busca";
29 this.yLabel = "RD = PSNR(dB)*bit -rate(kbps)";
this.outputName = sc.getName() + "_rdVSbusca.png";
31 this.dataSet = sc.getName()+ "_busca_data.txt";
this.width = 800;
33 this.height = 600;
this.macroName = sc.getName()+"_busca_macro.txt";
35 }
37 // # set terminal png transparent nocrop enhanced font arial
8 size 420,320
//# set output histograms.2.png
39 //set boxwidth 0.9 absolute
//set style fill solid 1.00 border -1
41 //set style histogram clustered gap 1 title offset character
0, 0, 0
//set datafile missing -
43 //set style data histograms
//set xtics border in scale 1,0.5 nomirror rotate by -45
offset character 0, 0, 0
247
45 //set xtics ("1891 -1900" 0.00000, "1901-1910" 1.00000,
"1911-1920" 2.00000, "1921-1930" 3.00000, "1931-1940"
4.00000, "1941-1950" 5.00000, "1951-1960" 6.00000,
"1961-1970" 7.00000)
//set title "US immigration from Northern Europe\nPlot selected
data columns as histogram of clustered boxes"
47 //set yrange [ 0.00000 : 300000. ] noreverse nowriteback
//plot immigration.dat using 6:xtic(1) ti col , u 12 ti col
, u 13 ti col , u 14 ti col
49 double yMax , yMin;
51 @Override
protected void writeGNUPlotMacro() {
53 updateDataSet();
Logger writer = new Logger(macroName , false);
55 writer.write("set terminal png transparent nocrop font
\"Arial Bold , 12\" size " + String.valueOf(width) +
" , " + String.valueOf(height) + "\n");
writer.write("set output \" + outputName + "\\n");
57
writer.write("set boxwidth 0.9 absolute\n");
59 writer.write("set style fill solid 1.00 border -1\n");
writer.writeln("set style histogram clustered gap 1
title offset character 0, 0, 0");
61 writer.writeln("set datafile missing -");
writer.writeln("set style data histograms");
63 writer.writeln("set xtics border in scale 1,0.5
nomirror rotate by -45 offset character 0, 0, 0");
//tics OK
65 writer.writeln("set xtics "+getXTics());
writer.writeln("set xlabel \""+xLabel+"\"");
67 writer.write("set title \"" + title + "\"\n");
//atencao
69 writer.writeln("set yrange [ "+yMin+" : "+yMax+" ]
noreverse nowriteback");
writer.writeln("set ylabel \""+yLabel+"\"");
248
71 writer.writeln(getPlotStr());//plot immigration.dat
using 6:xtic(1) ti col , u 12 ti col , u 13 ti
col , u 14 ti col
73
}
75
private String getPlotStr(){
77 String result = "plot \"+dataSet+"\ using 2:xtic(1)
ti col";
int lim = sc.getMetrics().size()+2;
79 for (int i= 3; i < lim; i++) {
result+=", \\ u "+i+" ti col";
81 }
return result;
83 }
85 private String getXTics(){
List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
87 for (SearchMethod searchMethod : sc.getSearchModes()) {
tempSearchMethods.add(searchMethod);
89 }
Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
91 Collections.reverse(tempSearchMethods);
String xTics = "(";
93 double c = 0.0;
for (SearchMethod sm : tempSearchMethods) {
95 if (c != 0.0) {
xTics += ", ";
97 }
xTics += "\"" + sm.getName() + "\" " + c;
99 c++;
}
101 xTics += ")";
249
return xTics;
103 }
105 private void updateDataSet() {
List <Metric > tempMetrics = new ArrayList <Metric >();
107 List <SearchMethod > tempSearchMethods = new ArrayList <
SearchMethod >();
for (SearchMethod searchMethod : sc.getSearchModes()) {
109 tempSearchMethods.add(searchMethod);
}
111 for (Metric metric : sc.getMetrics()) {
tempMetrics.add(metric);
113 }
115 Collections.sort(tempMetrics , Comparators.
metricComparator);
Collections.reverse(tempMetrics);
117 Collections.sort(tempSearchMethods , Comparators.
searchMethodComparator);
Collections.reverse(tempSearchMethods);
119
double map[][] = new double[tempSearchMethods.size()][
tempMetrics.size()];
121
for (Sample sample : sc.getSamples()) {
123 map[tempSearchMethods.indexOf(sample.
getSearchMethod())][tempMetrics.indexOf(sample.
getMetric())] = sample.getRD();
}
125
127 Logger writer = new Logger(dataSet , false);
String ln="mode";
129 for (Metric metric : tempMetrics) {
ln+="\t"+metric.getSimplifiedName();
131 }
250
writer.writeln(ln);
133
135 for (int i= 0; i < map.length; i++) {
ln = tempSearchMethods.get(i).getName();
137 for (int j= 0; j < map[0].length; j++) {
ln+="\t"+map[i][j];
139 }
writer.writeln(ln);
141 }
143 double maxRD = sc.getMaxRDValue(), minRD = sc.
getMinRDValue();
yMax = maxRD+maxRD*0.01;
145 yMin = minRD -maxRD*0.01;
}
147 }
B.4.2 jmstatsparser
Comparators (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
package jmstatsparser;
6
import java.util.Comparator;
8 import metrics.Metric;
import searchMethods.SearchMethod;
10
/**
12 *
* @author ismaelseidel
14 */
public class Comparators {
251
16
public static Comparator <Metric > metricComparator = new
Comparator() {
18
public int compare(Object o1, Object o2) {
20 Metric m1 = (Metric) o1;
Metric m2 = (Metric) o2;
22 return m1.getName().compareTo(m2.getName());
}
24 };
26
public static Comparator <SearchMethod >
searchMethodComparator = new Comparator() {
28
public int compare(Object o1, Object o2) {
30 SearchMethod s1 = (SearchMethod) o1;
SearchMethod s2 = (SearchMethod) o2;
32 return s1.getName().compareTo(s2.getName());
}
34 };
}
Main (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package jmstatsparser;
7 import configurationfilegenerator.Video;
import graphics.SampleContainner;
9 import graphics.SamplePercentualPlotter;
import graphics.SamplePercentualPlotterRight;
11 import graphics.SamplePlotter;
import graphics.SampleRightPlotter;
252
13 import java.util.ArrayList;
import java.util.List;
15 import metrics.Metric;
import metrictests.MetricTests;
17 import searchMethods.SearchMethod;
import searchMethods.SearchMethods;
19 import testSample.Sample;
21 /**
*
23 * @author ismaelseidel
*/
25 public class Main {
27 /**
* @param args the command line arguments
29 */
public static void main(String[] args) {
31
33
List <Metric > metrics = MetricTests.getMetricsList();
35
List <SearchMethod > searchMethods = SearchMethods.getAll
();
37 List <Sample > samples = new ArrayList <Sample >();
List <Video > videos = new ArrayList <Video >();
39
videos.add(new Video("sunflower", "Sunflower", 1920,
1080, 25, 25));
41 videos.add(new Video("riverbed", "Riverbed", 1920,
1080, 25, 25));
//videos.add(new Video("pedestrian_area", "Pedestrian
Area", 1920, 1080, 25, 25));
43 videos.add(new Video("in_to_the_tree", "In to the Tree"
, 1280, 720, 50, 25));
253
videos.add(new Video("ducks_take_off", "Ducks Take Off"
, 1280, 720, 50, 25));
45 videos.add(new Video("park_joy", "Park Joy", 1280, 720,
50, 25));
videos.add(new Video("soccer", "Soccer", 352, 288, 30,
25));
47 videos.add(new Video("foreman", "Foreman", 352, 288,
30, 25));
videos.add(new Video("big_buck_bunny", "Big Buck Bunny"
, 1920, 1080, 30, 25));
49
for (Video video : videos) {
51 samples.clear();
for (Metric metric : metrics) {
53 for (SearchMethod searchMethod : searchMethods)
{
Sample testSample = new Sample(metric ,
searchMethod , video , "/home/ismaelseidel
/stats/");
55 samples.add(testSample);
}
57 }
59 SampleContainner sc = new SampleContainner(samples)
;
SamplePlotter sp = new SamplePlotter(sc);
61 SamplePercentualPlotter spp = new
SamplePercentualPlotter(sc);
SampleRightPlotter srp = new SampleRightPlotter(sc)
;
63 SamplePercentualPlotterRight sppr = new
SamplePercentualPlotterRight(sc);
sp.plot();
65 spp.plot();
srp.plot();
67 sppr.plot();
254
}
69 //p.readNext();
//System.out.println(p.getValue());
71
Process out;
73 try {
75 if ("Linux".equals(System.getProperty("os.name")))
{
out = Runtime.getRuntime().exec("./copyResults.
sh");
77 out.waitFor();
}
79 System.out.println("OK...");
} catch (Exception e) {
81 System.out.println("Erro: " + e);
}
83
}
85
87 }
Parser (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package jmstatsparser;
7 import java.io.File;
import java.io.FileNotFoundException;
9 import java.util.Scanner;
11 /**
*
255
13 * @author ismaelseidel
*/
15 public class Parser {
17 private String fileName;
private int interestingPosition = 0;
19
public Parser(String fileName , int position) {
21 this.fileName = fileName;
interestingPosition = position;
23 }
25 public void updateInterestPosition(int pos){
interestingPosition = pos;
27 }
29 public void updateFileName(String fileName){
this.fileName = fileName;
31 }
33 public double readNext() {
try {
35 File file = new File(fileName);
Scanner scanner = new Scanner(file);
37 String next = "";
int c = 0;
39 while (scanner.hasNext()) {
//next = scanner.next();
41 System.out.println(c + ": " + scanner.next());
c++;
43 }
scanner.close();
45 } catch (FileNotFoundException e) {
System.out.println(e);
47 }
return 0.0;
256
49 }
51 public double getValue() {
try {
53 File file = new File(fileName);
Scanner scanner = new Scanner(file);
55 String next = "";
int c = 0;
57 while (scanner.hasNext()) {
next = scanner.next();
59 if(c == interestingPosition)
return Double.parseDouble(next);
61 //System.out.println(c + ": " + scanner.next())
;
c++;
63 }
scanner.close();
65 } catch (FileNotFoundException e) {
System.out.println(e);
67 }
return 0.0;
69 }
//bit -rate position = line 43;
71 //psnr position of luminance blocks = line 143;
}
B.4.3 searchMethods
SearchMethod (
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
6 package searchMethods;
257
8 /**
*
10 * @author ismaelseidel
*/
12 public class SearchMethod {
14
private String name;
16 private int positionOfPSNR , positionOfBitRate;
18 public SearchMethod(String name , int positionOfPSNR , int
positionOfBitRate) {
this.name = name;
20 this.positionOfPSNR = positionOfPSNR;
this.positionOfBitRate = positionOfBitRate;
22 }
24 public String getName() {
return name;
26 }
28 public int getPositionOfBitRate() {
return positionOfBitRate;
30 }
32 public int getPositionOfPSNR() {
return positionOfPSNR;
34 }
36
38
40 }
SearchMethods (
258
/*
2 * To change this template , choose Tools | Templates
* and open the template in the editor.
4 */
6 package searchMethods;
8 import java.util.ArrayList;
import java.util.List;
10
/**
12 *
* @author ismaelseidel
14 */
public class SearchMethods {
16
public static SearchMethod fullsearch = new SearchMethod("
fullsearch", 145, 43);
18 public static SearchMethod epzs = new SearchMethod("epzs",
192, 43);
public static SearchMethod umhexagonsearch = new
SearchMethod("umhexagonsearch", 145, 43);
20 public static SearchMethod fastfullsearch = new
SearchMethod("fastfullsearch", 145, 43);
22 public static List <SearchMethod > getAll(){
List <SearchMethod > searchMethods = new ArrayList <
SearchMethod >();
24 searchMethods.add(fullsearch);
searchMethods.add(epzs);
26 searchMethods.add(umhexagonsearch);
searchMethods.add(fastfullsearch);
28 return searchMethods;
}
30
}
259
B.4.4 testSample
Sample (
1 /*
* To change this template , choose Tools | Templates
3 * and open the template in the editor.
*/
5 package testSample;
7 import configurationfilegenerator.Video;
import graphics.SampleContainner;
9 import jmstatsparser.Parser;
import metrics.Metric;
11 import searchMethods.SearchMethod;
13 /**
*
15 * @author ismaelseidel
*/
17 public class Sample {
19 private Metric metric;
private SearchMethod searchMethod;
21 private double PSNR , bitRate;
private Video videoSample;
23
public Sample(Metric metric , SearchMethod searchMethod ,
Video videoSample , String statsLocation) {
25 this.metric = metric;
this.searchMethod = searchMethod;
27 this.videoSample = videoSample;
Parser p = new Parser(statsLocation + videoSample.
getName() + "_" + searchMethod.getName() + "_" +
metric.getSimplifiedName() + ".dat", searchMethod.
getPositionOfBitRate());
260
29 this.bitRate = p.getValue();
p.updateInterestPosition(searchMethod.getPositionOfPSNR
());
31 this.PSNR = p.getValue();
}
33
public Video getVideoSample() {
35 return videoSample;
}
37
public double getPSNR() {
39 return PSNR;
}
41
public Metric getMetric() {
43 return metric;
}
45
public double getBitRate() {
47 return bitRate;
}
49
public SearchMethod getSearchMethod() {
51 return searchMethod;
}
53
public String getSearhMethodName(){
55 return searchMethod.getName();
}
57
public double getRD(){
59 return this.bitRate*this.PSNR;
}
61
public String getVideoSampleName(){
63 return this.videoSample.getReadableName();
261
}
65
public double getFairComparissonValue(SampleContainner sc){
67 //double maxPSNR = sc.getMaxPSNR(), maxBitRate = sc.
getMaxBitRate();
return this.bitRate/this.PSNR;//return ((this.bitRate/
maxBitRate)/(this.PSNR/maxPSNR))*100;
69 }
}
B.5 Modicaes na JM
B.5.1 SAD
A mtrica SAD j possui implementao na (JVT, 2011).
B.5.2 DC
int mcost_src = 0, mcost_ref = 0;
2 for (y=0; y<blocksize_y; y++)
{
4 for (x = 0; x < blocksize_x; x+=4)
{
6 mcost_src += *src_line++;
mcost_ref += *ref_line++;
8 mcost_src += *src_line++;
mcost_ref += *ref_line++;
10 mcost_src += *src_line++;
mcost_ref += *ref_line++;
12 mcost_src += *src_line++;
mcost_ref += *ref_line++;
14 }
ref_line += pad_size_x;
16 }
#if (JM_MEM_DISTORTION)
262
18 mcost = imgpel_abs[ mcost_src - mcost_ref ];
#else
20 mcost = iabs( mcost_src - mcost_ref );
#endif
22 if(mcost > imin_cost)
return (dist_scale_f((distblk)mcost));
B.5.3 Border
1 int modTemp;
for (y=0; y<blocksize_y; y++)
3 {
modTemp = y % 4;
5 for (x = 0; x < blocksize_x; x+=4)
{
7 #if (JM_MEM_DISTORTION)
if((modTemp == 0) || (modTemp == 3)){
9 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
11 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
13 }else{
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
15 ref_line+=2;
src_line+=2;
17 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
}
19 #else
if((modTemp == 0) || (modTemp == 3)){
21 mcost += iabs( *src_line++ - *ref_line++ );
mcost += iabs( *src_line++ - *ref_line++ );
23 mcost += iabs( *src_line++ - *ref_line++ );
mcost += iabs( *src_line++ - *ref_line++ );
25 }else{
mcost += iabs( *src_line++ - *ref_line++ );
27 ref_line+=2;
263
src_line+=2;
29 mcost += iabs( *src_line++ - *ref_line++ );
}
31 #endif
}
33 if(mcost > imin_cost)
return (dist_scale_f((distblk)mcost));
35 ref_line += pad_size_x;
}
B.5.4 Checker Even
int modTemp;
2 for (y=0; y<blocksize_y; y++)
{
4 modTemp = y % 4;
for (x = 0; x < blocksize_x; x+=4)
6 {
#if (JM_MEM_DISTORTION)
8 if((modTemp == 0) || (modTemp == 2)){
ref_line++;
10 src_line++;
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
12 ref_line++;
src_line++;
14 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
}else{
16 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
ref_line++;
18 src_line++;
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
20 ref_line++;
src_line++;
22 }
#else
24 if((modTemp == 0) || (modTemp == 2)){
264
ref_line++;
26 src_line++;
mcost += iabs( *src_line++ - *ref_line++ );
28 ref_line++;
src_line++;
30 mcost += iabs( *src_line++ - *ref_line++ );
}else{
32 mcost += iabs( *src_line++ - *ref_line++ );
ref_line++;
34 src_line++;
mcost += iabs( *src_line++ - *ref_line++ );
36 ref_line++;
src_line++;
38 }
#endif
40 }
if(mcost > imin_cost)
42 return (dist_scale_f((distblk)mcost));
ref_line += pad_size_x;
44 }
B.5.5 Checker Odd
int modTemp;
2 for (y=0; y<blocksize_y; y++)
{
4 modTemp = y % 4;
for (x = 0; x < blocksize_x; x+=4)
6 {
#if (JM_MEM_DISTORTION)
8 if((modTemp == 0) || (modTemp == 2)){
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
10 ref_line++;
src_line++;
12 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
ref_line++;
265
14 src_line++;
}else{
16 ref_line++;
src_line++;
18 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
ref_line++;
20 src_line++;
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
22 }
#else
24 if((modTemp == 0) || (modTemp == 2)){
mcost += iabs( *src_line++ - *ref_line++ );
26 ref_line++;
src_line++;
28 mcost += iabs( *src_line++ - *ref_line++ );
ref_line++;
30 src_line++;
}else{
32 ref_line++;
src_line++;
34 mcost += iabs( *src_line++ - *ref_line++ );
ref_line++;
36 src_line++;
mcost += iabs( *src_line++ - *ref_line++ );
38 }
#endif
40 }
if(mcost > imin_cost)
42 return (dist_scale_f((distblk)mcost));
ref_line += pad_size_x;
44 }
B.5.6 Cross
int modTemp;
2 for (y=0; y<blocksize_y; y++)
266
{
4 modTemp = y % 4;
for (x = 0; x < blocksize_x; x+=4)
6 {
#if (JM_MEM_DISTORTION)
8 if((modTemp == 0) || (modTemp == 3)){
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
10 ref_line+=2;
src_line+=2;
12 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
}else{
14 src_line++;
ref_line++;
16 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
18 src_line++;
ref_line++;
20 }
#else
22 if((modTemp == 0) || (modTemp == 3)){
mcost += iabs( *src_line++ - *ref_line++ );
24 ref_line+=2;
src_line+=2;
26 mcost += iabs( *src_line++ - *ref_line++ );
}else{
28 src_line++;
ref_line++;
30 mcost += iabs( *src_line++ - *ref_line++ );
mcost += iabs( *src_line++ - *ref_line++ );
32 src_line++;
ref_line++;
34 }
#endif
36 }
if(mcost > imin_cost)
38 return (dist_scale_f((distblk)mcost));
267
ref_line += pad_size_x;
40 }
B.5.7 Kernell
int modTemp;
2 for (y=0; y<blocksize_y; y++)
{
4 modTemp = y % 4;
for (x = 0; x < blocksize_x; x+=4)
6 {
#if (JM_MEM_DISTORTION)
8 if((modTemp == 0) || (modTemp == 3)){
ref_line+=4;
10 src_line+=4;
}else{
12 src_line++;
ref_line++;
14 mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
mcost += imgpel_abs[ *src_line++ - *ref_line++ ];
16 src_line++;
ref_line++;
18 }
#else
20 if((modTemp == 0) || (modTemp == 3)){
ref_line+=4;
22 src_line+=4;
}else{
24 src_line++;
ref_line++;
26 mcost += iabs( *src_line++ - *ref_line++ );
mcost += iabs( *src_line++ - *ref_line++ );
28 src_line++;
ref_line++;
30 }
#endif
268
32 }
if(mcost > imin_cost)
34 return (dist_scale_f((distblk)mcost));
ref_line += pad_size_x;
36 }
B.6 Arquivo de congurao utilizado
As linhas que seguem mostram a congurao utilizada nos testes em software utilizado-se
o software de referncia do padro H.264/AVC (JVT, 2011). Deve-se notar que conforme expli-
cado na seo 5.2, cada modo de busca ter um arquivo de congurao diferente no parmetro
SearchMode, de acordo com o modo de busca selecionado. Tambm existiro diferenas de
acordo com a amostra de vdeo a ser codicada
1
.
# New nput File Format is as follows
2 # <ParameterName > = <ParameterValue > # Comment
#
4 # See configfile.h for a list of supported ParameterNames
#
6 # For bug reporting and known issues see:
# https://ipbt.hhi.fraunhofer.de
8
##########################################################################################
10 # Files
##########################################################################################
12
InputFile = "/home/ismaelseidel/raw/big_buck_bunny.yuv"
14 InputHeaderLength = 0
StartFrame = 0
16 FramesToBeEncoded = 25
FrameRate = 30
1
Arquivos estes pertencentes seo #Files do arquivo de congurao. saber: InputFile , FramesTo-
BeEncoded , FrameRate , SourceWidth , SourceHeight , OutputWidth , OutputHeight , TraceFile , ReconFile ,
OutputFile e StatsFile.
269
18 Enable32Pulldown = 0
SEIVUI32Pulldown = 0
20 SourceWidth = 1920
SourceHeight = 1080
22 SourceResize = 0
OutputWidth = 1920
24 OutputHeight = 1080
ProcessInput = 0
26 Interleaved = 0
StandardRange = 0
28 VideoCode = 1
TraceFile = "/home/ismaelseidel/traces/
big_buck_bunny_umhexagonsearch_Border.txt"
30 ReconFile = "/home/ismaelseidel/recon/
big_buck_bunny_umhexagonsearch_Border.yuv"
OutputFile = "/home/ismaelseidel/outputs/
big_buck_bunny_umhexagonsearch_Border .264"
32 StatsFile = "/home/ismaelseidel/stats/
big_buck_bunny_umhexagonsearch_Border.dat"
NumberOfViews = 1
34 View1ConfigFile = "encoder_view1.cfg"
##########################################################################################
36 # Encoder Control
##########################################################################################
38 Grayscale = 0 # Encode in grayscale (Currently
only works for 8 bit YUV 420 input)
ProfileIDC = 100 # Profile IDC (66=baseline , 77=main
, 88=extended; FREXT Profiles: 100=High , 110=High 10, 122=
High 4:2:2, 244=High 4:4:4, 44=CAVLC 4:4:4 Intra , 118=
Multiview High Profile , 128=Stereo High Profile)
40 IntraProfile = 0 # Activate Intra Profile for FRExt
(0: false, 1: true)
# (e.g. ProfileIDC=110,
IntraProfile=1 => High 10
270
Intra Profile)
42 LevelIDC = 41 # Level IDC (e.g. 20 = level 2.0)
44 IntraPeriod = 0 # Period of I-pictures (0=only
first)
IDRPeriod = 0 # Period of IDR pictures (0=only
first)
46 AdaptiveIntraPeriod = 1 # Adaptive intra period
AdaptiveIDRPeriod = 0 # Adaptive IDR period
48 IntraDelay = 0 # Intra (IDR) picture delay (i.e.
coding structure of PPIPPP... )
EnableIDRGOP = 0 # Support for IDR closed GOPs (0:
disabled , 1: enabled)
50 EnableOpenGOP = 0 # Support for open GOPs (0:
disabled , 1: enabled)
QPISlice = 28 # Quant. param for I Slices (0-51)
52 QPPSlice = 28 # Quant. param for P Slices (0-51)
FrameSkip = 0 # Number of frames to be skipped in
input (e.g 2 will code every third frame).
54 # Note that this now excludes
intermediate (i.e. B) coded
pictures
ChromaQPOffset = 0 # Chroma QP offset (-51..51)
56
DisableSubpelME = 0 # Disable Subpixel Motion
Estimation (0=off/default, 1=on)
58 SearchRange = 32 # Max search range
60 MEDistortionFPel = 0 # Select error metric for Full -Pel
ME (0: SAD , 1: SSE , 2: Hadamard SAD)
MEDistortionHPel = 0 # Select error metric for Half -Pel
ME (0: SAD , 1: SSE , 2: Hadamard SAD)
62 MEDistortionQPel = 0 # Select error metric for Quarter -
Pel ME (0: SAD , 1: SSE , 2: Hadamard SAD)
MDDistortion = 0 # Select error metric for Mode
Decision (0: SAD , 1: SSE , 2: Hadamard SAD)
271
64 SkipDeBlockNonRef = 0 # Skip Deblocking (regardless of
DFParametersFlag) for non -reference frames (0: off , 1: on)
ChromaMCBuffer = 1 # Calculate Color component
interpolated values in advance and store them.
66 # Provides a trade -off between
memory and computational
complexity
# (0: disabled/default, 1: enabled)
68 ChromaMEEnable = 0 # Take into account Color component
information during ME
# (0: only first component/default,
70 # 1: All Color components -
Integer refinement only
# 2: All Color components - All
refinements)
72 ChromaMEWeight = 1 # Weighting for chroma components.
This parameter should have a relationship with color format.
74 NumberReferenceFrames = 4 # Number of previous frames used
for inter motion search (0-16)
76 PList0References = 0 # P slice List 0 reference override
(0 disable , N <= NumberReferenceFrames)
Log2MaxFNumMinus4 = 0 # Sets log2_max_frame_num_minus4
(-1 : based on FramesToBeEncoded/Auto , >=0 :
Log2MaxFNumMinus4)
78 Log2MaxPOCLsbMinus4 = -1 # Sets
log2_max_pic_order_cnt_lsb_minus4 (-1 : Auto , >=0 :
Log2MaxPOCLsbMinus4)
80 GenerateMultiplePPS = 1 # Transmit multiple parameter sets.
Currently parameters basically enable all WP modes (0:
diabled , 1: enabled)
SendAUD = 0 # Send Access Delimiter Unit NALU (
for every access unit)
82 ResendSPS = 2 # Resend SPS (0: disabled , 1: all
272
Intra pictures , 2: only for IDR , 3: for IDR and OpenGOP I)
ResendPPS = 0 # Resend PPS (with
pic_parameter_set_id 0) for every coded Frame/Field pair (0:
disabled , 1: enabled)
84
MbLineIntraUpdate = 0 # Error robustness(extra intra
macro block updates)(0=off , N: One GOB every N frames are
intra coded)
86 RandomIntraMBRefresh = 0 # Forced intra MBs per picture
88 ##########################################################################################
# PSlice Mode types
90 ##########################################################################################
PSliceSkip = 1 # P-Slice Skip mode consideration
(0=disable , 1=enable)
92 PSliceSearch16x16 = 1 # P-Slice Inter block search 16x16
(0=disable , 1=enable)
PSliceSearch16x8 = 1 # P-Slice Inter block search 16x8
(0=disable , 1=enable)
94 PSliceSearch8x16 = 1 # P-Slice Inter block search 8x16
(0=disable , 1=enable)
PSliceSearch8x8 = 1 # P-Slice Inter block search 8x8
(0=disable , 1=enable)
96 PSliceSearch8x4 = 1 # P-Slice Inter block search 8x4
(0=disable , 1=enable)
PSliceSearch4x8 = 1 # P-Slice Inter block search 4x8
(0=disable , 1=enable)
98 PSliceSearch4x4 = 1 # P-Slice Inter block search 4x4
(0=disable , 1=enable)
100 ##########################################################################################
# BSlice Mode types
102 ##########################################################################################
273
104 BSliceDirect = 1 # B-Slice Skip mode consideration
(0=disable , 1=enable)
BSliceSearch16x16 = 1 # B-Slice Inter block search 16x16
(0=disable , 1=enable)
106 BSliceSearch16x8 = 1 # B-Slice Inter block search 16x8
(0=disable , 1=enable)
BSliceSearch8x16 = 1 # B-Slice Inter block search 8x16
(0=disable , 1=enable)
108 BSliceSearch8x8 = 1 # B-Slice Inter block search 8x8
(0=disable , 1=enable)
BSliceSearch8x4 = 1 # B-Slice Inter block search 8x4
(0=disable , 1=enable)
110 BSliceSearch4x8 = 1 # B-Slice Inter block search 4x8
(0=disable , 1=enable)
BSliceSearch4x4 = 1 # B-Slice Inter block search 4x4
(0=disable , 1=enable)
112
BiPredSearch16x16 = 1 # B-Slice Bi-prediction block
search 16x16 (0=disable , 1=enable)
114 BiPredSearch16x8 = 1 # B-Slice Bi-prediction block
search 16x8 (0=disable , 1=enable)
BiPredSearch8x16 = 1 # B-Slice Bi-prediction block
search 8x16 (0=disable , 1=enable)
116 BiPredSearch8x8 = 0 # B-Slice Bi-prediction block
search 8x8 (0=disable , 1=enable)
118 DisableIntra4x4 = 0 # Disable Intra 4x4 modes
DisableIntra16x16 = 0 # Disable Intra 16x16 modes
120 DisableIntraInInter = 0 # Disable Intra modes for inter
slices
IntraDisableInterOnly = 0 # Apply Disabling Intra conditions
only to Inter Slices (0:disable/default,1: enable)
122 Intra4x4ParDisable = 0 # Disable Vertical & Horizontal 4x4
Intra4x4DiagDisable = 0 # Disable Diagonal 45degree 4x4
274
124 Intra4x4DirDisable = 0 # Disable Other Diagonal 4x4
Intra16x16ParDisable = 0 # Disable Vertical & Horizontal 16
x16
126 Intra16x16PlaneDisable = 0 # Disable Planar 16x16
ChromaIntraDisable = 0 # Disable Intra Chroma modes other
than DC
128 EnableIPCM = 1 # Enable IPCM macroblock mode
130 DisposableP = 0 # Enable Disposable P slices in the
primary layer (0: disable/default, 1: enable)
DispPQPOffset = 0 # Quantizer offset for disposable P
slices (0: default)
132
PreferDispOrder = 1 # Prefer display order when
building the prediction structure as opposed to coding order
(affects intra and IDR periodic insertion , among others)
134 PreferPowerOfTwo = 0 # Prefer prediction structures that
have lengths expressed as powers of two
FrmStructBufferLength = 16 # Length of the frame structure
unit buffer; it can be overriden for certain cases
136
ChangeQPFrame = 0 # Frame in display order from which
to apply the Change QP offsets
138 ChangeQPI = 0 # Change QP offset value for
I_SLICE
ChangeQPP = 0 # Change QP offset value for
P_SLICE
140 ChangeQPB = 0 # Change QP offset value for
B_SLICE
ChangeQPSI = 0 # Change QP offset value for
SI_SLICE
142 ChangeQPSP = 0 # Change QP offset value for
SP_SLICE
144 ##########################################################################################
275
# B Slices
146 ##########################################################################################
148 NumberBFrames = 7 # Number of B coded frames inserted
(0=not used)
PReplaceBSlice = 0 # Replace B-coded slices with P-
coded slices when NumberBFrames >0
150 QPBSlice = 30 # Quant. param for B slices (0-51)
BRefPicQPOffset = -1 # Quantization offset for reference
B coded pictures (-51..51)
152 DirectModeType = 1 # Direct Mode Type (0:Temporal 1:
Spatial)
DirectInferenceFlag = 1 # Direct Inference Flag (0: Disable
1: Enable)
154 BList0References = 0 # B slice List 0 reference override
(0 disable , N <= NumberReferenceFrames)
BList1References = 1 # B slice List 1 reference override
(0 disable , N <= NumberReferenceFrames)
156 # 1 List1 reference is usually
recommended for normal GOP
Structures.
# A larger value is usually more
appropriate if a more flexible
158 # structure is used (i.e. using
HierarchicalCoding)
160 BReferencePictures = 0 # Referenced B coded pictures (0=
off , 1=B references for secondary layer , 2=B references for
primary layer)
162 HierarchicalCoding = 3 # B hierarchical coding (0= off ,
1= 2 layers , 2= 2 full hierarchy , 3 = explicit)
HierarchyLevelQPEnable = 1 # Adjust QP based on hierarchy
level (in increments of 1). Overrides BRefPicQPOffset
behavior.(0=off , 1=on)
276
164 ExplicitHierarchyFormat = "b3r0b1r1b0e2b2e2b5r1b4e2b6e2" #
Explicit Enhancement GOP. Format is {
FrameDisplay_orderReferenceQP}.
#
Valid
values
for
reference
type
is
r:
reference
, e
:
non
reference
.
166 ExplicitSeqCoding = 0 # Enable support for explicit
sequence coding
ExplicitSeqFile = "explicit_seq.cfg"
168 LowDelay = 0 # Apply HierarchicalCoding
without delay (i.e., encode in the captured/display order)
ReferenceReorder = 1 # Reorder References according to
Poc distance for HierarchicalCoding (0=off , 1=enable , 2=use
when LowDelay is set)
170 PocMemoryManagement = 1 # Memory management based on Poc
Distances for HierarchicalCoding (0=off , 1=on, 2=use when
LowDelay is set)
SetFirstAsLongTerm = 0 # Set first frame as long term
172
BiPredMotionEstimation = 1 # Enable Bipredictive based Motion
277
Estimation (0:disabled , 1:enabled)
174 BiPredMERefinements = 3 # Bipredictive ME extra
refinements (0: single , N: N extra refinements (1 default)
BiPredMESearchRange = 16 # Bipredictive ME Search range (8
default). Note that range is halved for every extra
refinement.
176 BiPredMESubPel = 2 # Bipredictive ME Subpixel
Consideration (0: disabled , 1: single level , 2: dual level)
178
##########################################################################################
180 # SP Frames
##########################################################################################
182
SPPicturePeriodicity = 0 # SP-Picture
Periodicity (0=not used)
184 SPSwitchPeriod = 0 # Switch period (in
terms of switching SP/SI frames) between bitstream 1 and
bitstream 2
QPSPSlice = 36 # Quant. param of SP
-Slices for Prediction Error (0-51)
186 QPSISlice = 36 # Quant. param of SI
-Slices for Prediction Error (0-51)
QPSP2Slice = 35 # Quant. param of SP
/SI-Slices for Predicted Blocks (0-51)
188 SI_FRAMES = 0 # SI frame encoding
flag (0=not used , 1=used)
SP_output = 0 # Controls whether
coefficients will be output to encode switching SP frames
(0=no, 1=yes)
190 SP_output_name = "low_quality.dat" # Filename for SP
output coefficients
SP2_FRAMES = 0 # switching SP frame
encoding flag (0=not used , 1=used)
278
192 SP2_input_name1 = "high_quality.dat" # Filename for the
first swithed bitstream coefficients
SP2_input_name2 = "low_quality.dat" # Filename for the
second switched bitstream coefficients
194
##########################################################################################
196 # Output Control , NALs
##########################################################################################
198
SymbolMode = 1 # Symbol mode (Entropy coding
method: 0=UVLC , 1=CABAC)
200 OutFileMode = 0 # Output file mode , 0:Annex B, 1:
RTP
PartitionMode = 0 # Partition Mode , 0: no DP, 1: 3
Partitions per Slice
202
##########################################################################################
204 # CABAC context initialization
##########################################################################################
206
ContextInitMethod = 1 # Context init (0: fixed , 1:
adaptive)
208 FixedModelNumber = 0 # model number for fixed
decision for inter slices ( 0, 1, or 2 )
210 ##########################################################################################
# Interlace Handling
212 #########################################################################################
214 PicInterlace = 0 # Picture AFF (0: frame
279
coding , 1: field coding , 2:adaptive frame/field coding)
MbInterlace = 0 # Macroblock AFF (0: frame
coding , 1: field coding , 2:adaptive frame/field coding , 3:
frame MB-only AFF)
216 IntraBottom = 0 # Force Intra Bottom at GOP
Period
218 ##########################################################################################
# Weighted Prediction
220 #########################################################################################
222 WeightedPrediction = 0 # P picture Weighted
Prediction (0=off , 1=explicit mode)
WeightedBiprediction = 0 # B picture Weighted
Prediciton (0=off , 1=explicit mode , 2=implicit mode)
224 ChromaWeightSupport = 1 # Enable consideration of
weights for Chroma components
UseWeightedReferenceME = 1 # Use weighted reference for
ME (0=off , 1=on)
226 WPMethod = 1 # WP method (0: DC based , 1:
LMS based)
WPIterMC = 0 # Iterative Motion
compensated based weighted prediction method
228 EnhancedBWeightSupport = 0 # Enhanced B Weight support (
needs revisit if we wish to merge with WPMethod)
WPMCPrecision = 2 # Improved Motion
Compensation Precision using WP based methods.
230 # Clones WP references with
slightly modified rounding
offsets (Requires
RDPictureDecision and
GenerateMultiplePPS) :
# 0: disabled (default)
232 # 1: Up to one additional
280
coding pass. Ref0 is 0,
ref1 is 0 with a -1 offset
# 2: Up to two additional
coding passes. (1) Ref0 is
0, ref1 is 0 with a -1
offset , (1) Ref0 is 0 with
a -1 offset , ref1 is 0
234 WPMCPrecFullRef = 0 # Increases the number of
references in the reference picture lists to account
# for the lost reference slot
when reordering is used
during a coding pass in
WPMCPrecision for
reference replication.
236 # The number of references in
non -reordered passes
stays unchanged
WPMCPrecBSlice = 1 # 2: Apply rounding on every
B slice. This efectively disables the evaluation of
alternative QPs during RDPictureDecision.
238 # 1: Disable rounding for non
-reference B slices. Non -
reference B slices are
evaluated for alternative
QPs during
RDPictureDecision.
# 0: Disable rounding for B
slices.
240
##########################################################################################
242 # Picture based Multi -pass encoding
#########################################################################################
244
RDPictureDecision = 1 # Perform multiple pass
281
coding and make RD optimal decision among them
246 RDPSliceBTest = 0 # Perform Slice level RD
decision between P and B slices.
RDPSliceITest = 1 # Perform Slice level RD
decision between P and I slices. Default value is 1 (enabled
).
248 RDPictureMaxPassISlice = 1 # Max number of coding passes
for I slices , valid values [1,3], default is 1
RDPictureMaxPassPSlice = 2 # Max number of coding passes
for P slices , valid values [1,6], default is 2
250 RDPictureMaxPassBSlice = 3 # Max number of coding passes
for B slices , valid values [1,6], default is 3
RDPictureFrameQPPSlice = 0 # Perform additional frame
level QP check (QP+/-1) for P slices , 0: disabled (default),
1: enabled
252 RDPictureFrameQPBSlice = 0 # Perform additional frame
level QP check (QP+/-1) for B slices , 0: disabled , 1:
enabled (default)
RDPictureDeblocking = 0 # Perform another coding pass
to check non -deblocked picture , 0: disabled (default), 1:
enabled
254 RDPictureDirectMode = 0 # Perform another coding pass
to check the alternative direct mode for B slices , , 0:
disabled (default), 1: enabled
256 ##########################################################################################
# Deblocking filter parameters
258 ##########################################################################################
260 DFParametersFlag = 0 # Configure deblocking filter
(0=parameters below ignored , 1=parameters sent)
# Note that for pictures with
multiple slice types ,
262 # only the type of the first
282
slice will be considered.
DFDisableRefISlice = 0 # Disable deblocking filter
in reference I coded pictures (0=Filter , 1=No Filter).
264 DFAlphaRefISlice = 0 # Reference I coded pictures
Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
DFBetaRefISlice = 0 # Reference I coded pictures
Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
266 DFDisableNRefISlice = 0 # Disable deblocking filter
in non reference I coded pictures (0=Filter , 1=No Filter).
DFAlphaNRefISlice = 0 # Non Reference I coded
pictures Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
268 DFBetaNRefISlice = 0 # Non Reference I coded
pictures Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
DFDisableRefPSlice = 0 # Disable deblocking filter
in reference P coded pictures (0=Filter , 1=No Filter).
270 DFAlphaRefPSlice = 0 # Reference P coded pictures
Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
DFBetaRefPSlice = 0 # Reference P coded pictures
Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
272 DFDisableNRefPSlice = 0 # Disable deblocking filter
in non reference P coded pictures (0=Filter , 1=No Filter).
DFAlphaNRefPSlice = 0 # Non Reference P coded
pictures Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
274 DFBetaNRefPSlice = 0 # Non Reference P coded
pictures Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
DFDisableRefBSlice = 0 # Disable deblocking filter
in reference B coded pictures (0=Filter , 1=No Filter).
276 DFAlphaRefBSlice = 0 # Reference B coded pictures
Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
DFBetaRefBSlice = 0 # Reference B coded pictures
Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
278 DFDisableNRefBSlice = 0 # Disable deblocking filter
in non reference B coded pictures (0=Filter , 1=No Filter).
DFAlphaNRefBSlice = 0 # Non Reference B coded
pictures Alpha offset div. 2, {-6, -5, ... 0, +1, .. +6}
280 DFBetaNRefBSlice = 0 # Non Reference B coded
283
pictures Beta offset div. 2, {-6, -5, ... 0, +1, .. +6}
282 ##########################################################################################
# Error Resilience / Slices
284 ##########################################################################################
286 SliceMode = 0 # Slice mode (0=off 1=fixed #mb in
slice 2=fixed #bytes in slice 3=use callback)
SliceArgument = 50 # Slice argument (Arguments to
modes 1 and 2 above)
288
num_slice_groups_minus1 = 0 # Number of Slice Groups Minus 1,
0 == no FMO , 1 == two slice groups , etc.
290 slice_group_map_type = 0 # 0: Interleave , 1: Dispersed ,
2: Foreground with left -over ,
# 3: Box -out , 4: Raster Scan
5: Wipe
292 # 6: Explicit , slice_group_id
read from
SliceGroupConfigFileName
slice_group_change_direction_flag = 0 # 0: box -out clockwise
, raster scan or wipe right ,
294 # 1: box -out counter
clockwise , reverse
raster scan or wipe
left
slice_group_change_rate_minus1 = 85 #
296 SliceGroupConfigFileName = "sg0conf.cfg" # Used for
slice_group_map_type 0, 2, 6
298 UseRedundantPicture = 0 # 0: not used , 1: enabled
NumRedundantHierarchy = 1 # 0-4
300 PrimaryGOPLength = 10 # GOP length for redundant
allocation (1-16)
284
# NumberReferenceFrames must be no
less than PrimaryGOPLength
when redundant slice enabled
302 NumRefPrimary = 1 # Actually used number of
references for primary slices (1-16)
304 ##########################################################################################
# Search Range Restriction / RD Optimization
306 ##########################################################################################
308 RestrictSearchRange = 1 # restriction for (0: blocks and
ref , 1: ref , 2: no restrictions)
RDOptimization = 1 # rd-optimized mode decision
310 # 0: RD-off (Low complexity mode)
# 1: RD-on (High complexity mode)
312 # 2: RD-on (Fast high complexity
mode - not work in FREX
Profiles)
# 3: with losses
314 I16RDOpt = 0 # perform rd-optimized mode
decision for Intra 16x16 MB
# 0: SAD -based mode decision for
Intra 16x16 MB
316 # 1: RD-based mode decision for
Intra 16x16 MB
SubMBCodingState = 1 # submacroblock coding state
318 # 0: lowest complexity , do not
store or reset coding state
during sub -MB mode decision
# 1: medium complexity , reset to
master coding state (for
current mode) during sub -MB
mode decision
320 # 2: highest complexity , store and
285
reset coding state during sub -
MB mode decision
DistortionSSIM = 1 # Compute SSIM distortion. (0:
disabled/default, 1: enabled)
322 DistortionMS_SSIM = 0 # Compute Multiscale SSIM
distortion. (0: disabled/default, 1: enabled)
SSIMOverlapSize = 8 # Overlap size to calculate SSIM
distortion (1: pixel by pixel , 8: no overlap)
324 DistortionYUVtoRGB = 0 # Calculate distortion in RGB
domain after conversion from YCbCr (0:off , 1:on)
CtxAdptLagrangeMult = 0 # Context Adaptive Lagrange
Multiplier
326 # 0: disabled (default)
# 1: enabled (works best when
RDOptimization=0)
328 FastCrIntraDecision = 1 # Fast Chroma intra mode decision
(0:off , 1:on)
DisableThresholding = 0 # Disable Thresholding of
Transform Coefficients (0:off , 1:on)
330 DisableBSkipRDO = 0 # Disable B Skip Mode
consideration from RDO Mode decision (0:off , 1:on)
BiasSkipRDO = 0 # Negative Bias for Skip/
DirectSkip modes (0: off , 1: on)
332 ForceTrueRateRDO = 0 # Force true rate (even zero
values) during RDO process
SkipIntraInInterSlices = 0 # Skips Intra mode checking in
inter slices if certain mode decisions are satisfied (0: off
, 1: on)
334 WeightY = 1 # Luma weight for RDO
WeightCb = 1 # Cb weight for RDO
336 WeightCr = 1 # Cr weight for RDO
338 ##########################################################################################
# Explicit Lambda Usage
340 ##########################################################################################
286
UseExplicitLambdaParams = 0 # Use explicit lambda scaling
parameters (0:disabled , 1:enable lambda weight , 2: use
explicit lambda value)
342 UpdateLambdaChromaME = 0 # Update lambda given Chroma
ME consideration
FixedLambdaISlice = 0.1 # Fixed Lambda value for I
slices
344 FixedLambdaPSlice = 0.1 # Fixed Lambda value for P
slices
FixedLambdaBSlice = 0.1 # Fixed Lambda value for B
slices
346 FixedLambdaRefBSlice = 0.1 # Fixed Lambda value for
Referenced B slices
FixedLambdaSPSlice = 0.1 # Fixed Lambda value for SP
slices
348 FixedLambdaSISlice = 0.1 # Fixed Lambda value for SI
slices
350 LambdaWeightISlice = 0.65 # scaling param for I slices.
This will be used as a multiplier i.e. lambda=
LambdaWeightISlice * 2^((QP -12)/3)
LambdaWeightPSlice = 0.68 # scaling param for P slices.
This will be used as a multiplier i.e. lambda=
LambdaWeightPSlice * 2^((QP -12)/3)
352 LambdaWeightBSlice = 0.68 # scaling param for B slices.
This will be used as a multiplier i.e. lambda=
LambdaWeightBSlice * 2^((QP -12)/3)
LambdaWeightRefBSlice = 0.68 # scaling param for Referenced
B slices. This will be used as a multiplier i.e. lambda=
LambdaWeightRefBSlice * 2^((QP -12)/3)
354 LambdaWeightSPSlice = 0.68 # scaling param for SP slices.
This will be used as a multiplier i.e. lambda=
LambdaWeightSPSlice * 2^((QP -12)/3)
LambdaWeightSISlice = 0.65 # scaling param for SI slices.
This will be used as a multiplier i.e. lambda=
287
LambdaWeightSISlice * 2^((QP -12)/3)
356
LossRateA = 5 # expected packet loss rate of
the channel for the first partition , only valid if
RDOptimization = 3
358 LossRateB = 0 # expected packet loss rate of
the channel for the second partition , only valid if
RDOptimization = 3
LossRateC = 0 # expected packet loss rate of
the channel for the third partition , only valid if
RDOptimization = 3
360 FirstFrameCorrect = 0 # If 1, the first frame is
encoded under the assumption that it is always correctly
received.
NumberOfDecoders = 30 # Numbers of decoders used to
simulate the channel , only valid if RDOptimization = 3
362 RestrictRefFrames = 0 # Doesnt allow reference to
areas that have been intra updated in a later frame.
364 ##########################################################################################
# Additional Stuff
366 #########################################################################################
368 UseConstrainedIntraPred = 0 # If 1, Inter pixels are not
used for Intra macroblock prediction.
370 NumberofLeakyBuckets = 8 # Number of
Leaky Bucket values
LeakyBucketRateFile = "leakybucketrate.cfg" # File from
which encoder derives rate values
372 LeakyBucketParamFile = "leakybucketparam.cfg" # File where
encoder stores leakybucketparams
374 NumFramesInELayerSubSeq = 0 # number of frames in the
288
Enhanced Scalability Layer(0: no Enhanced Layer)
376 SparePictureOption = 0 # (0: no spare picture info ,
1: spare picture available)
SparePictureDetectionThr = 6 # Threshold for spare
reference pictures detection
378 SparePicturePercentageThr = 92 # Threshold for the spare
macroblock percentage
380 PicOrderCntType = 0 # (0: POC mode 0, 1: POC mode
1, 2: POC mode 2)
382 ########################################################################################
#Rate control
384 ########################################################################################
386 RateControlEnable = 0 # 0 Disable , 1 Enable
Bitrate = 45020 # Bitrate(bps)
388 InitialQP = 0 # Initial Quantization
Parameter for the first I frame
# InitialQp depends on two
values: Bits Per Picture ,
390 # and the GOP length
BasicUnit = 0 # Number of MBs in the basic
unit
392 # should be a fraction of the
total number
# of MBs in a frame ("0" sets a
BU equal to a frame)
394 ChannelType = 0 # type of channel( 1=time
varying channel; 0=Constant channel)
RCUpdateMode = 0 # Rate Control type. Modes
supported :
396 # 0 = original JM rate control ,
289
# 1 = rate control that is
applied to all frames
regardless of the slice type
,
398 # 2 = original plus intelligent
QP selection for I and B
slices (including
Hierarchical),
# 3 = original + hybrid
quadratic rate control for I
and B slice using bit rate
statistics
400 #
RCISliceBitRatio = 1.0 # target ratio of bits for I-
coded pictures compared to P-coded Pictures (for
RCUpdateMode=3)
402 RCBSliceBitRatio0 = 0.5 # target ratio of bits for B-
coded pictures compared to P-coded Pictures - temporal level
0 (for RCUpdateMode=3)
RCBSliceBitRatio1 = 0.25 # target ratio of bits for B-
coded pictures compared to P-coded Pictures - temporal level
1 (for RCUpdateMode=3)
404 RCBSliceBitRatio2 = 0.25 # target ratio of bits for B-
coded pictures compared to P-coded Pictures - temporal level
2 (for RCUpdateMode=3)
RCBSliceBitRatio3 = 0.25 # target ratio of bits for B-
coded pictures compared to P-coded Pictures - temporal level
3 (for RCUpdateMode=3)
406 RCBSliceBitRatio4 = 0.25 # target ratio of bits for B-
coded pictures compared to P-coded Pictures - temporal level
4 (for RCUpdateMode=3)
RCBoverPRatio = 0.45 # ratio of bit rate usage of a
B-coded picture over a P-coded picture for the SAME QP (for
RCUpdateMode=3)
408 RCIoverPRatio = 3.80 # ratio of bit rate usage of an
I-coded picture over a P-coded picture for the SAME QP (for
290
RCUpdateMode=3)
RCMinQPPSlice = 8 # minimum P Slice QP value for
rate control
410 RCMaxQPPSlice = 42 # maximum P Slice QP value for
rate control
RCMinQPBSlice = 8 # minimum B Slice QP value for
rate control
412 RCMaxQPBSlice = 42 # maximum B Slice QP value for
rate control
RCMinQPISlice = 8 # minimum I Slice QP value for
rate control
414 RCMaxQPISlice = 42 # maximum I Slice QP value for
rate control
RCMinQPSPSlice = 8 # minimum SP Slice QP value for
rate control
416 RCMaxQPSPSlice = 40 # maximum SP Slice QP value for
rate control
RCMinQPSISlice = 8 # minimum SI Slice QP value for
rate control
418 RCMaxQPSISlice = 42 # maximum SI Slice QP value for
rate control
RCMaxQPChange = 4 # maximum QP change for frames
of the base layer
420
########################################################################################
422 #Fast Mode Decision
########################################################################################
424 EarlySkipEnable = 0 # Early skip detection (0:
Disable 1: Enable)
SelectiveIntraEnable = 0 # Selective Intra mode decision
(0: Disable 1: Enable)
426
########################################################################################
291
428 #FREXT stuff
########################################################################################
430
YUVFormat = 1 # YUV format (0=4:0:0, 1=4:2:0,
2=4:2:2, 3=4:4:4)
432 RGBInput = 0 # 1=RGB input , 0=GBR or YUV
input
SeparateColourPlane = 0 # 4:4:4 coding: 0=Common mode ,
1=Independent mode
434 SourceBitDepthLuma = 8 # Source Bit Depth for Luma
color component (8...14 bits)
SourceBitDepthChroma = 8 # Source Bit Depth for Chroma
color components (8...14 bits)
436 SourceBitDepthRescale = 0 # Rescale bit depth of source
for output (0: Disable 1: Enable)
OutputBitDepthLuma = 8 # Output Bit Depth for Luma
color component (8...14 bits)
438 OutputBitDepthChroma = 8 # Output Bit Depth for Chroma
color components (8...14 bits)
440 CbQPOffset = 0 # Chroma QP offset for Cb-part
(-51..51)
CrQPOffset = 0 # Chroma QP offset for Cr-part
(-51..51)
442 Transform8x8Mode = 1 # (0: only 4x4 transform , 1:
allow using 8x8 transform additionally , 2: only 8x8
transform)
ReportFrameStats = 0 # (0:Disable Frame Statistics
1: Enable)
444 DisplayEncParams = 0 # (0:Disable Display of Encoder
Params 1: Enable)
Verbose = 1 # level of display verboseness
446 # 0: short, 1: normal (default)
, 2: detailed , 3: detailed/
nvb
292
SkipGlobalStats = 0 # Disable global stat
accumulation (Set to 1 to avoid bipred core dump)
448
########################################################################################
450 #Q-Matrix (FREXT)
########################################################################################
452 QmatrixFile = "q_matrix.cfg"
454 ScalingMatrixPresentFlag = 0 # Enable Q_Matrix (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
ScalingListPresentFlag0 = 3 # Intra4x4_Luma (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
456 ScalingListPresentFlag1 = 3 # Intra4x4_ChromaU (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
ScalingListPresentFlag2 = 3 # Intra4x4_chromaV (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
458 ScalingListPresentFlag3 = 3 # Inter4x4_Luma (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
ScalingListPresentFlag4 = 3 # Inter4x4_ChromaU (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
460 ScalingListPresentFlag5 = 3 # Inter4x4_ChromaV (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
ScalingListPresentFlag6 = 3 # Intra8x8_Luma (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
both SPS & PPS)
462 ScalingListPresentFlag7 = 3 # Inter8x8_Luma (0 Not
present , 1 Present in SPS , 2 Present in PPS , 3 Present in
293
both SPS & PPS)
ScalingListPresentFlag8 = 3 # Intra8x8_ChromaU for 4:4:4 (0
Not present , 1 Present in SPS , 2 Present in PPS , 3 Present
in both SPS & PPS)
464 ScalingListPresentFlag9 = 3 # Inter8x8_ChromaU for 4:4:4 (0
Not present , 1 Present in SPS , 2 Present in PPS , 3 Present
in both SPS & PPS)
ScalingListPresentFlag10 = 3 # Intra8x8_ChromaV for 4:4:4 (0
Not present , 1 Present in SPS , 2 Present in PPS , 3 Present
in both SPS & PPS)
466 ScalingListPresentFlag11 = 3 # Inter8x8_ChromaV for 4:4:4 (0
Not present , 1 Present in SPS , 2 Present in PPS , 3 Present
in both SPS & PPS)
468 ########################################################################################
#Rounding Offset control
470 ########################################################################################
472 OffsetMatrixPresentFlag = 0 # Enable Explicit Offset
Quantization Matrices (0: disable 1: enable)
QOffsetMatrixFile = "q_offset.cfg" # Explicit
Quantization Matrices file
474
AdaptiveRounding = 1 # Enable Adaptive Rounding
based on JVT -N011 (0: disable , 1: enable)
476 AdaptRoundingFixed = 0 # Enable Global Adaptive
rounding for all qps (0: disable , 1: enable - default/old)
AdaptRndPeriod = 16 # Period in terms of MBs for
updating rounding offsets.
478 # 0 performs update at the
picture level. Default is
16. 1 is as in JVT -N011.
AdaptRndChroma = 1 # Enables coefficient rounding
adaptation for chroma
294
480
AdaptRndWFactorIRef = 8 # Adaptive Rounding Weight for
I/SI slices in reference pictures /4096
482 AdaptRndWFactorPRef = 8 # Adaptive Rounding Weight for
P/SP slices in reference pictures /4096
AdaptRndWFactorBRef = 8 # Adaptive Rounding Weight for
B slices in reference pictures /4096
484 AdaptRndWFactorINRef = 8 # Adaptive Rounding Weight for
I/SI slices in non reference pictures /4096
AdaptRndWFactorPNRef = 8 # Adaptive Rounding Weight for
P/SP slices in non reference pictures /4096
486 AdaptRndWFactorBNRef = 8 # Adaptive Rounding Weight for
B slices in non reference pictures /4096
488 AdaptRndCrWFactorIRef = 8 # Chroma Adaptive Rounding
Weight for I/SI slices in reference pictures /4096
AdaptRndCrWFactorPRef = 8 # Chroma Adaptive Rounding
Weight for P/SP slices in reference pictures /4096
490 AdaptRndCrWFactorBRef = 8 # Chroma Adaptive Rounding
Weight for B slices in reference pictures /4096
AdaptRndCrWFactorINRef = 8 # Chroma Adaptive Rounding
Weight for I/SI slices in non reference pictures /4096
492 AdaptRndCrWFactorPNRef = 8 # Chroma Adaptive Rounding
Weight for P/SP slices in non reference pictures /4096
AdaptRndCrWFactorBNRef = 8 # Chroma Adaptive Rounding
Weight for B slices in non reference pictures /4096
494
################################################################
496 # Rate Distortion Optimized Quantization
################################################################
498 UseRDOQuant = 1 # Use Rate Distortion Optimized
Quantization (0=disable , 1=enable)
RDOQ_DC = 1 # Enable Rate Distortion
Optimized Quantization for DC components (0=disable , 1=
295
enable)
500 RDOQ_CR = 1 # Enable Rate Distortion
Optimized Quantization for Chroma components (0=disable , 1=
enable)
RDOQ_DC_CR = 1 # Enable Rate Distortion
Optimized Quantization for Chroma DC components (0=disable ,
1=enable)
502 RDOQ_QP_Num = 5 # 1-9: Number of QP tested in
RDO_Q (I/P/B slice)
RDOQ_CP_Mode = 0 # copy Mode from first QP tested
504 RDOQ_CP_MV = 0 # copy MV from first QP tested
RDOQ_Fast = 0 # Fast RDOQ decision method for
multiple QPs
506
########################################################################################
508 #Lossless Coding (FREXT)
########################################################################################
510
LosslessCoding = 0 # Enable lossless coding when
qpprime_y is zero (0 Disabled , 1 Enabled)
512
########################################################################################
514 #Fast Motion Estimation Control Parameters
########################################################################################
516
SearchMode = 1
518 UMHexDSR = 1 # Use Search Range Prediction.
Only for UMHexagonS method
# (0:disable , 1:enabled/default
)
520 UMHexScale = 3 # Use Scale_factor for
different image sizes. Only for UMHexagonS method
296
# (0:disable , 3:/default)
522 # Increasing value can speed up
Motion Search.
524 EPZSPattern = 2 # Select EPZS primary
refinement pattern.
# (0: small diamond , 1: square ,
2: extended diamond/default
,
526 # 3: large diamond , 4: SBP
Large Diamond ,
# 5: PMVFAST )
528 EPZSDualRefinement = 3 # Enables secondary refinement
pattern.
# (0:disabled , 1: small diamond
, 2: square ,
530 # 3: extended diamond/default,
4: large diamond ,
# 5: SBP Large Diamond , 6:
PMVFAST )
532 EPZSFixedPredictors = 2 # Enables Window based
predictors
# (0:disabled , 1: P only , 2: P
and B/default)
534 EPZSTemporal = 1 # Enables temporal predictors
# (0: disabled , 1: enabled/
default)
536 EPZSSpatialMem = 1 # Enables spatial memory
predictors
# (0: disabled , 1: enabled/
default)
538 EPZSBlockType = 1 # Enables block type Predictors
# (0: disabled , 1: enabled/
default)
540 EPZSMinThresScale = 0 # Scaler for EPZS minimum
threshold (0 default).
297
# Increasing value can speed up
encoding.
542 EPZSMedThresScale = 1 # Scaler for EPZS median
threshold (1 default).
# Increasing value can speed up
encoding.
544 EPZSMaxThresScale = 2 # Scaler for EPZS maximum
threshold (1 default).
# Increasing value can speed up
encoding.
546
EPZSSubPelME = 1 # EPZS Subpel ME consideration
548 EPZSSubPelMEBiPred = 1 # EPZS Subpel ME consideration
for BiPred partitions
EPZSSubPelThresScale = 1 # EPZS Subpel ME Threshold
scaler
550 EPZSSubPelGrid = 1 # Perform EPZS using a subpixel
grid
552 ########################################################################################
# SEI Parameters
554 ########################################################################################
556 ToneMappingSEIPresentFlag = 0 # Enable Tone mapping SEI (0
Not present , 1 Present)
ToneMappingFile = "ToneMapping.cfg"
558
GenerateSEIMessage = 0 # Generate an
SEI Text Message
560 SEIMessageText = "H.264/AVC Encoder" # Text SEI
Message
562 UseMVLimits = 0 # Use MV
Limits
298
SetMVXLimit = 512 # Horizontal
MV Limit (in integer units)
564 SetMVYLimit = 512 # Vertical MV
Limit (in integer units)
566 ########################################################################################
# VUI Parameters
568 ########################################################################################
# the variables below do not affect encoding and decoding
570 # (many are dummy variables but others can be useful when
supported by the decoder)
572 EnableVUISupport = 0 #
Enable VUI Parameters
574 # display parameters
VUI_aspect_ratio_info_present_flag = 0
576 VUI_aspect_ratio_idc = 1
VUI_sar_width = 0
578 VUI_sar_height = 0
VUI_overscan_info_present_flag = 0
580 VUI_overscan_appropriate_flag = 0
VUI_video_signal_type_present_flag = 0
582 VUI_video_format = 5
VUI_video_full_range_flag = 0
584 VUI_colour_description_present_flag = 0
VUI_colour_primaries = 2
586 VUI_transfer_characteristics = 2
VUI_matrix_coefficients = 2
588 VUI_chroma_location_info_present_flag = 0
VUI_chroma_sample_loc_type_top_field = 0
590 VUI_chroma_sample_loc_type_bottom_field = 0
VUI_timing_info_present_flag = 0
592 VUI_num_units_in_tick = 1000
299
VUI_time_scale = 60000
594 VUI_fixed_frame_rate_flag = 0
596 # nal hrd parameters
VUI_nal_hrd_parameters_present_flag = 0
598 VUI_nal_cpb_cnt_minus1 = 0
VUI_nal_bit_rate_scale = 0
600 VUI_nal_cpb_size_scale = 0
VUI_nal_bit_rate_value_minus1 = 0
602 VUI_nal_cpb_size_value_minus1 = 0
VUI_nal_vbr_cbr_flag = 0
604 VUI_nal_initial_cpb_removal_delay_length_minus1 = 23
VUI_nal_cpb_removal_delay_length_minus1 = 23
606 VUI_nal_dpb_output_delay_length_minus1 = 23
VUI_nal_time_offset_length = 24
608
# vlc hrd parameters
610 VUI_vcl_hrd_parameters_present_flag = 0
VUI_vcl_cpb_cnt_minus1 = 0
612 VUI_vcl_bit_rate_scale = 0
VUI_vcl_cpb_size_scale = 0
614 VUI_vcl_bit_rate_value_minus1 = 0
VUI_vcl_cpb_size_value_minus1 = 0
616 VUI_vcl_vbr_cbr_flag = 0
VUI_vcl_initial_cpb_removal_delay_length_minus1 = 23
618 VUI_vcl_cpb_removal_delay_length_minus1 = 23
VUI_vcl_dpb_output_delay_length_minus1 = 23
620 VUI_vcl_time_offset_length = 24
VUI_low_delay_hrd_flag = 0
622
# other parameters (i.e. bitsream restrictions)
624 VUI_pic_struct_present_flag = 0
VUI_bitstream_restriction_flag = 0
626 VUI_motion_vectors_over_pic_boundaries_flag = 1
VUI_max_bytes_per_pic_denom = 0
628 VUI_max_bits_per_mb_denom = 0
300
VUI_log2_max_mv_length_vertical = 16
630 VUI_log2_max_mv_length_horizontal = 16
VUI_num_reorder_frames = 16
632 VUI_max_dec_frame_buffering = 16
301
ANEXO C -- Artigo obrigatrio
Investigac ao de Padr oes de Subamostragem em M etrica de
Similaridade de Imagem
Ismael Seidel
1
1
Laborat orio de Computac ao Embarcada (LCE)
Departamento de Inform atica e Estatstica (INE)
Universidade Federal de Santa Catarina (UFSC)
Florian opolis SC Brasil
ismaelseidel@inf.ufsc.br
Abstract. This work investigated some pixel subsampling patterns as input for
cost metrics during the motion estimation algorithm in a digital video encoder.
The pel decimation (pixel subsampling) is widely used and provides efcient
hardware implementations and high performance. Initially are proposed some
sampling patterns and the error generated by such metrics were evaluated using
the reference software of the H.264/AVC standard, as well as an initial imple-
mentation of still images into a pre-assessment.
Resumo. Neste trabalho foram investigados padr oes de subamostragem de
pixels como entrada de m etricas de custo durante a fase de estimac ao de
movimento em um codicador de vdeo digital. A subamostragem de pixels
(pel decimation) e largamente utilizada e propicia implementac oes em hard-
ware ecientes e com alto desempenho. Inicialmente foram propostos padr oes
de amostragem e o erro gerado pelas m etricas consideradas foram avaliado
utilizando-se o software de refer encia do padr ao H.264/AVC, bem como uma
implementac ao inicial sobre imagens est aticas para uma pr e-avaliac ao.
1. Introduc ao
A compress ao de imagens est aticas e de vdeo exige alto desempenho, principalmente em
aplicac oes em que a compress ao deve ocorrer em tempo real (uma transmiss ao ao vivo,
por exemplo). Al em disso, e cada vez mais frequente o uso de compress ao de imagens
em equipamentos port ateis operados a bateria (c ameras, telefones celulares, smartphones,
etc). Nestes casos, o processo de compress ao deve ocorrer com m axima eci encia en-
erg etica, a m de prolongar a carga e a vida util das baterias.
Este trabalho investiga padr oes de amostragem para o algoritmo de pel decimation
[Kuhn 1999], como forma de acelerar a etapa de codicac ao conhecida como Estimac ao
de Movimento (ME), que e um passo fundamental nos compressores de vdeo. Para tanto
ser ao estudadas as principais m etricas de similaridade com especial atenc ao ` a SAD, por
ser esta a mais utilizada.
A busca por novos padr oes de amostragem a serem usados no c alculo de simi-
laridade tem por objetivo reduzir o custo do c alculo sem comprometer a qualidade da
compress ao. A reduc ao do custo do c alculo conduz a implementac oes em hardware com
menor custo, maior desempenho e menor consumo de energia.
2. Propostas de Amostragem
2.1. Soma das Diferencas Absolutas SAD
Por ser a m etrica mais simples da literatura, a SAD foi escolhida como base dos exper-
imentos, e tamb em como comparac ao em relac ao ` a qualidade para as outras m etricas.
Al em de ser a mais simples, tamb em e uma das m etricas mais utilizadas. A SAD e calcu-
lada de acordo com a Equac ao 1, na qual os ndices i e j s ao a localizac ao de cada pixel
na matriz de pixel original e de refer encia (Ori e Ref , respectivamente). Como pode
ser observado na Equac ao 1, s ao utilizados todos os pixels das matrizes dos dois blocos.
SAD =
M

i=0
N

j=0
|Ori
i,j
Ref
i,j
| (1)
2.2. Diagonal Principal - (Main Diagonal SAD)
Esta e uma m etrica bastante simples e calcula a SAD usando apenas a diagonal princi-
pal das matrizes original e candidata, ou seja, apenas 25% dos pixels do bloco 4x4. A
Equac ao 2 mostra seu c alculo.
Main Diagonal =
M

i=0
N

j=0
|Ori
i,j
Ref
i,j
|, quando i = j (2)
2.3. N ucleo - (Kernell SAD)
Faz o c alculo da SAD apenas do n ucleo
1
da matriz, ou seja a parte mais central. No caso
dos blocos 4x4, os quatro elementos mais centrais da matriz equivalem ao n ucleo e os
demais elementos s ao pertencentes ` as bordas. Assim, utilizando tamb em apenas quatro
pixels do bloco, o que equivale a 25% destes.
2.4. Bordas - (Border SAD)
Utiliza os pixels nas bordas das matrizes, efetuando a SAD sobre os mesmos. Utiliza 75%
dos pixels do bloco. Este padr ao de amostragem foge do comumente utilizado na t ecnica
de pel decimation, a qual normalmente utiliza proporc oes 2:1 ou 4:1 (ou ainda menores).
Como este padr ao inclui mais informac ao sobre o bloco, pode vir a ser mais preciso e
ainda economizar aproximadamente 1/4 de operac oes.
2.5. Cruzado - (Cross SAD)
Utiliza tanto a diagonal principal quanto a diagonal secund aria da matriz de pixel e sobre
estas efetua o c alculo da SAD.

E possvel notar que utiliza, no caso de blocos 4x4, os
pixels do n ucleo do bloco, e dos 4 cantos. Dessa forma, usa 50% dos pixels do bloco,
equivalente ent ao ` a proporc ao 2:1 do pel decimation.
1
Esta nomenclatura n ao deriva da algebra linear.

E apenas utilizada neste trabalho para identicar a
regi ao central da matriz de pixels.
2.6. Tabuleiro - (Checker SAD)
Utiliza 50% dos pixels do bloco, alternando entre eles, como num jogo de tabuleiro (por
exemplo xadrez).

E o padr ao utilizado no algoritmo de pel decimation, portanto pode
servir de base para comparac oes. Neste caso a proporc ao e 2:1 e as perdas s ao pouco sig-
nicativas em termos de qualidade e taxa de bit. Por outro lado, h a uma grande economia
na complexidade da computac ao da m etrica. A abordagem do tabuleiro est a subdivi-
dida nos testes em dois grupos, par e mpar (Checker Even e Checker Odd). Uma das
possveis vantagens da utilizac ao destes dois padr oes ao mesmo tempo e uma organizac ao
de mem oria onde um bloco de mem oria de 256 bits (4 linhas, 4 colunas e 8 bits por ele-
mento) pode conter o necess ario para 2 blocos 4x4 de forma intuitiva e f acil ger encia.
Par - (Even) Comeca na posic ao 0 do bloco, utilizando os valores das posic oes pares
nas linhas pares e os valores das posic oes mpares nas linhas mpares.

E o padr ao adotado
no pel decimation na maioria das implementac oes.

Impar - (Odd) Comeca na posic ao 1 do bloco, utilizando os valores das posic oes
mpares nas linhas pares e os valores das posic oes pares nas linhas mpares.

E o com-
plemento do padr ao adotado no pel decimation na maioria das implementac oes.
3. Blocos de outros tamanhos
At e aqui, os padr oes de amostragem foram apresentados para blocos 4x4. Os mesmos
podem ser estendidos para blocos com outros tamanhos, como e possvel de acordo com
o padr ao H.264/AVC [JVT ]. Por exemplo, a m etrica Main Diagonal SAD pode ser cal-
culada exatamente em seu sentido para um bloco 8x8, por exemplo, utilizado apenas
os valores da diagonal principal. Assim como na diagonal principal, pode-se utilizar a
mesma implementac ao usada em 4x4, por exemplo, utilizando 2 c alculos de Main Diag-
onal SAD em setores especcos do bloco maior, como ilustrado na Figura 1. A mesma
ideia pode ser aplicada para as m etricas com tabuleiro.
Figure 1. Exemplo de aplicac ao da m etrica Main Diagonal sobre um bloco 8x8,
coletando apenas os elementos da diagonal principal.
Tal m etodo n ao se aplica ao c alculo de SAD apenas do centro (n ucleo) e bordas,
necessitando assim de implementac oes especcas de acordo com o tamanho. Podem
ser utilizadas implementac oes gen ericas, mas ser ao mais custosas pois e necess aria uma
l ogica maior para a separac ao dos valores de pixels a serem utilizados no c alculo. Apesar
de economizarem muito mais em recursos, tais abordagens quase certamente ir ao causar
uma grande diminuic ao na qualidade (testes passveis de serem implementados como
trabalhos futuros).
A sada ent ao e considerar a soma dos resultados parciais para blocos 4x4, uma
vez que as outras possibilidades de subdivis oes de blocos previstos no padr ao s ao todos
m ultiplos de blocos 4x4. Isto e bastante adotado, inclusive no software de refer encia
[JVT ]. Para essa soluc ao, a Figura 2 mostra tamb em um exemplo de seu uso.
Figure 2. Exemplo de aplicac ao da m etrica Main Diagonal sobre um bloco 8x8,
obtendo a diagonal principal de cada sub-bloco 4x4.
4. Resultados Experimentais
Com objetivo de avaliar primariamente o desempenho das m etricas estudadas e, princi-
palmente, de avaliar a qualidade do uso de tais m etricas, s ao propostas duas formas de
avaliac ao. A primeira delas e uma avaliac ao simples para imagens est aticas, utilizando
apenas nove candidatos por bloco (4x4), mantendo assim um maior controle sobre a
execuc ao da avaliac ao, e podendo demonstrar com as pr oprias imagens resultantes da
escolha de cada m etrica a qualidade nal obtida. J a para uma melhor adaptac ao ao con-
texto de compress ao de vdeo, tamb em foi efetuada uma avaliac ao das m etricas, quando
utilizadas no padr ao H.264/AVC. Neste Captulo ser ao descritos os resultados de tais
avaliac oes das m etricas estudadas em software.
4.1. Imagem
Devido ` a simplicidade de implementac ao de testes em software com imagens est aticas, foi
desenvolvida usando a linguagem Java uma aplicac ao para avaliar a qualidade de imagens
usando as m etricas em estudo. Uma vez que n ao h a outras otimizac oes do codicador de
vdeo, como por exemplo a RDO, a distorc ao gerada deve-se apenas ` a escolha do bloco
pela m etrica avaliada.
Cada imagem analisada e dividida em blocos e para cada um destes s ao gerados,
utilizando os algoritmos de gerac ao de blocos intra 4x4 do software de refer encia do
H.264/AVC [JVT ], nove candidatos similares. Ent ao, aplica-se cada uma das m etricas
em estudo para avaliar o melhor casamento entre o bloco em quest ao e os nove candidatos
gerados. O melhor candidato gerado ocupar a o lugar do candidato em quest ao, formando
uma nova imagem. Essa nova imagem ser a comparada com a sua original para cada
m etrica de similaridade em estudo, em termos de resduo, qualidade em SSIM e PSNR.
Table 1. Tabela de resultados com imagem est atica.
M etrica PSNR (dB) SSIM Resduo (%)
SAD 27.8605 0.9142 3.4039
DC 26.4248 0.8844 4.1988
MainDiagonal 26.6252 0.8854 3.8922
Kernell 26.4076 0.8759 3.9769
Border 27.821 0.9095 3.4603
Cross 27.6842 0.9092 3.5059
CheckerOdd 26.9779 0.8979 3.7477
CheckerEven 26.5879 0.9089 3.884
A Tabela 1 mostra os resultados de PSNR, SSIM e resduo(%) (Equac ao 3).
Observa-se que a melhor m etrica, em todos os requisitos foi a SAD
2
. Dessa, as que mais
se aproximaram foram a Border, Cross e Checker Even.

E interessante perceber que
mesmo a Border utilizando 75% dos dados do bloco, os resultados de SSIM foram pouco
diferentes entre estes tr es padr oes (sendo que os dois ultimos utilizam 50% dos dados).
Uma maneira simples de visualizar estes dados est a nas Figuras 3, 4 e 5, nas quais s ao
apresentados gr acos onde cada uma das m etricas est a disposta lado a lado a m de serem
comparadas com as demais para SSIM, PSNR e resduo.
Figure 3. SSIM de cada uma das m etricas em estudo para o teste 4.
Na Figura 3 torna-se visvel o fato das m etricas Border, Cross e Checker Even
terem resultados similares entre si e pr oximos ao valor da SAD. Ainda, h a uma boa
2
Ao se analisar apenas em software, sem contar a an alise de tempo. Parte da implementac ao em software
levou em considerac ao a an alise de tempo, mas a execuc ao dos testes sofreu pela utuac ao de uso do
processador, resultando em valores bastante variados, poluindo assim os resultados. Dessa forma optou-se
por deixar de fora deste trabalho tais resultados.
diferenca entre os valores de Checker Even e Checker Odd, mostrando que, mesmo para
padr oes bastante similares, pode-se deixar de lado partes importantes da imagem, n ao
importando o padr ao usado, ao se utilizar a t ecnica de pel decimation.
Figure 4. PSNR de cada uma das m etricas em estudo para o teste 4.
J a a Figura 4 mostra que, com resultados de PSNR, o padr ao Border chega muito
pr oximo ` a SAD e para os padr oes Checker o resultado se inverte, ambos agora sendo
menores que Cross. O valor de PSNR entre Checker Even e Main Diagonal e aproxi-
madamente o mesmo, ainda que o ultimo padr ao faca pel decimation 4:1 e o primeiro seja
2:1.
percentual residuo =
M

i=0
N

j=0
|img reconstruida
i,j
img original
i,j
|
M

i=0
N

j=0
img original
i,j
(3)
O resduo nos testes indica a quantidade de dados que restou da subtrac ao da
imagem original com a imagem reconstruda. Seu percentual foi calculado de acordo
com a Equac ao 3. Intuitivamente, observa-se que h a uma grande correlac ao entre os
resultados de resduo e qualidade (SSIM e PSNR) para a grande maioria dos casos, de
forma que quanto maior o resduo, menor a qualidade. Deve-se notar que, tanto pela
qualidade quanto pela taxa de compress ao, e importante ter um valor baixo de resduo
3
.
4.2. Vdeo
Para a avaliac ao de qualidade em vdeo foi usado o software de refer encia do H.264/AVC
[JVT ] (JM), modicado para utilizar as m etricas em estudo. S ao comparados os valores
de bitrate, qualidade em SSIM e PSNR. O software de refer encia do H.264/AVC [JVT ]
foi escolhido por ser comumente utilizado para prova de conceitos em diversos trabal-
hos na literatura. Embora tenha baixo desempenho, por ser refer encia, seu c odigo busca
implementar ` a risca o padr ao.
3
Nestes testes, uma vez que independem de vetores de movimento e outros valores que inuenciam no
bitrate nal em, por exemplo, um vdeo.
Figure 5. Resduo de cada uma das m etricas em estudo para o teste 4.
Para os testes com vdeos, foram selecionados vdeos que correspondem ` a um mix
de resoluc ao e qualidade, tamb em utilizados por [de Moraes 2010]. Os vdeos utilizados
foram obtidos no reposit orio da [Xiph.org ].
Figure 6. Resultados da sequ encia de teste Foreman para as m etricas uti-
lizadas no codicador [JVT ].
Um ponto bastante interessante a ser notado na Figura 6 e o fato da Border ter
melhor resultado que a SAD na fullsearch. O segundo melhor resultado foi o do Checker
Odd, sendo que este foi tamb em o melhor no algoritmo fastfullsearch. Para este ultimo,
os padr oes Checker Even e Border e SAD tem resultados bastante pr oximos, e inclusive,
melhores do que os demais resultados em fullsearch. Os demais padr oes tem resultados
piores do que a SAD, resultado j a esperado. Entre Kernell e Main Diagonal os melhores
resultados foram do primeiro para todos os algoritmos de busca.
Figure 7. Resultados da sequ encia de teste Soccer para as m etricas utilizadas
no codicador [JVT ].
No gr aco da Figura 7 o resultado foi mais pr oximo ao esperado, sendo que os
melhores resultados foram no algoritmo de fullsearch. Mas no algoritmo fastfullsearch, o
melhor ganho n ao foi da SAD como esperado, mas sim do padr ao Border. No algoritmo
epzs o padr ao Cross teve resultado melhor do que os padr oes Checker.
Figure 8. Resultados da sequ encia de teste Sunower para as m etricas uti-
lizadas no codicador [JVT ].
Tamb em no gr aco presente na Figura 8, os resultados foram de acordo com o
esperado em sua maioria. Principalmente no que concerne ao algoritmo fullsearch ter os
melhores resultados. V e-se tamb em que para o algoritmo fastfullsearch o comportamento
do padr ao Border deixou de ser melhor que a SAD (no caso do fullsearch) e, excetuando
o padr ao Main Diagonal, teve os piores resultados. No algoritmo epzs, o resultado de
Checker Odd foi muito pr oximo ao da SAD, sendo os dois melhores resultados para este
algoritmo de busca. No algoritmo umhexagonsearch o melhor resultado foi o da SAD,
seguido por Cross e Border. J a o padr ao Checker Even, bastante pr oximo do resultado da
SAD em fastfullsearch, teve os piores resultados no umhexagonsearch.
5. Conclus oes
A partir da compilac ao de resultados apresentados neste trabalho viu-se que a melhor
forma de fazer subamostragem (para o algoritmo de pel decimation) nos blocos 4x4 n ao
e necessariamente a atualmente utilizada (Checker), sendo que modicac oes nos padr oes
de subamostragem geram diferentes resultados, podendo ser melhores ou piores do que o
utilizado, dependendo do caso. Tornou-se claro tamb em que h a uma variac ao grande nos
resultados, de acordo com a complexidade do vdeo, o que abre a possibilidade de mel-
horias neste sentido. Infelizmente, tais abordagens s ao bastante custosas, por exemplo,
para a identicac ao pr evia de parte da complexidade para a busca se adequar ao conte udo.
Em um vdeo com pouca complexidade, no caso a cena de fade-in do teste Big Buck
Bunny, a qualidade n ao sofreu com o uso de menos informac ao do bloco.
References
de Moraes, B. G. (2010). Uma m etrica para taxa de distorc ao voltada codicac ao de vdeo
perceptiva. Trabalho de conclus ao de curso, UFSC.
JVT. Jm joint video team reference software.
Kuhn, P. M. (1999). Fast mpeg-4 motion estimation: Processor based and ex-
ible vlsi implementations. The Journal of VLSI Signal Processing, 23:6792.
10.1023/A:1008192719838.
Xiph.org. Xiph.org test media repository.

Você também pode gostar