You are on page 1of 311

Ismael Seidel

Investigação de Padrões de Subamostragem em
Métrica de Similaridade de Imagem
Florianópolis, Santa Catarina
2011.2
Ismael Seidel
Investigação de Padrões de Subamostragem em
Métrica de Similaridade de Imagem
Trabalho de Conclusão de Curso apresentado
como parte dos requisitos para obtenção do grau
de Bacharel em Ciências da Computação.
Orientador:
Prof. Dr. José Luís Almada Güntzel
UNIVERSIDADE FEDERAL DE SANTA CATARINA
CENTRO TECNOLÓGICO
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
Florianópolis, Santa Catarina
2011.2
Trabalho de conclusão de curso sob o título “Investigação de Padrões de Subamostragem
em Métrica de Similaridade de Imagem”, defendido por Ismael Seidel e aprovado em 10 de
novembro de 2011, em Florianópolis, Santa Catarina, pela banca examinadora constituída pelos
professores:
Prof. Dr. José Luís Almada Güntzel
Universidade Federal de Santa Catarina
Orientador
Prof. Dr. Djones Vinícius 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. Começo, não pra ser padrão, mas pelo fato de que acre-
dito Nele, agradecendo à Deus. Agradeço meus pais, que tanto fizeram por mim durante toda
minha vida. Que cuidaram de mim, mas ao mesmo tempo me deixaram aprender a caminhar.
Por confiarem em mim e em minhas decisões, por exemplo na escolha de um curso, de uma
universidade. Bom, aparentemente deu certo! Então deixo por escrito meu muito obrigado aos
melhores pais do mundo! Agradeço também a meus familiares, aqueles que deixei de ter tanto
contato, que deixei de comparecer nas festas... Foi o necessário para estar aqui, e sei que todos
sempre me apoiaram com bastante força.
Também aos meus amigos, companheiros de ap., amigos da GG’s 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?! Também a grande Rafa! Tuto, Rangel e
Marcélo, que moram comigo, que bagunçam o ap comigo... Tuto além de dividir ap também
deu umas dicas legais no TCC. Ao pessoal incrível que estudou comigo no terceirão, grandes
amigos da GG’s kã então (que ainda não foram citados): Khero, Mio, Neil, Vane, Nero... Ao
distante Coelho... Todos temos uma grande amizade, alguns com mais ligação, alguns com
menos. Mas ainda nos vemos, nem que seja em uma frequência não tão alta...
Cabe agradecer aos professores, desde as primeiras séries até neste último semestre (assim
espero!) de graduação... Também com uma breve citação à alguns, não por desmerecimento aos
demais, mas sim por terem sido fatores que ajudaram a traçar alguns caminhos. Ao professor
Luciano Alves, que me conseguiu a oportunidade de estudar no CCSJ. Ao professor Adriano
Coelho pelo apoio e orientação enquanto lá. Ao professor Güntzel, que me propôs ser membro
do, antes, LAPS. Este me trouxe mais perto da área de imagem e vídeo digital. Agradeço
também pela orientação, das bolsas de iniciação científica e TCC. Agradeço também ao CNPq
pelas bolsas.
Agradeço aos demais membros da banca, prof. Djones e Vinicius. Obrigado por terem
aceito participar da banca, corrigir o texto e também pela já feita avaliação do começo deste
trabalho na disciplina de Projetos I. Agradeço também aos demais membros do Laboratório de
Computação Embarcada, pelas conversas, bolinhos, pelo ambiente de trabalho... Agradeço ao
Bruno pelas longas discussões sobre o padrão e as demais conversas sobre áudio/imagem/vídeo.
“Now you’re SAD SAD SAD
SAD SAD SAD
SAD SAD SAD
But you’re gonna be fine”
The Rolling Stones
Sumário
Lista de Figuras
Lista de Tabelas
Lista de Acrônimos p. 17
Resumo p. 20
Abstract p. 21
1 Introdução p. 22
1.1 Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
1.1.1 Compressão de Vídeo . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.2.1 Objetivos gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.2.2 Objetivos específicos . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.3 Escopo deste Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 25
1.4 Organização deste Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 26
2 Conceitos de Compressão de Vídeo Digital p. 27
2.1 Conceitos Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 27
2.1.1 Captura da Imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 28
2.1.2 Conversão do Espaço de Cor . . . . . . . . . . . . . . . . . . . . . . p. 29
2.1.3 Subamostragem Croma . . . . . . . . . . . . . . . . . . . . . . . . . p. 30
2.1.4 Transformada Discreta dos Cossenos . . . . . . . . . . . . . . . . . p. 31
2.1.5 Quantização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 31
2.1.6 Estimação de Movimento . . . . . . . . . . . . . . . . . . . . . . . p. 31
2.1.7 Codificação Aritmética . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
2.2 Padrões de Compressão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 32
2.2.1 H.264/AVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 33
2.3 Conceitos no H.264/AVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.1 Aritmética Inteira . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.2 DCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 34
2.3.3 Novidades na Estimação de Movimento . . . . . . . . . . . . . . . . p. 35
2.3.4 Predição Intra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 37
3 Métricas de Similaridade p. 39
3.1 Métricas Objetivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 39
3.2 Métricas Subjetivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 41
4 Contribuição às Métricas 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 Núcleo - (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 Referência do H.264 p. 50
5.1 Ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 50
5.1.1 Análise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 50
5.2 Arquivo de configuração . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 52
6 Resultados Experimentais p. 53
6.1 Imagens Estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 53
6.2 Vídeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 62
6.3 Conlusão 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 Comparação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 77
7.6 Blocos de outros tamanhos . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 79
7.7 DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 80
8 Conclusões e trabalhos futuros p. 81
Referências Bibliográficas p. 83
Anexo A -- Resultados da avaliação em software das métricas 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 Resíduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 109
Anexo B -- Código fonte do teste em software p. 117
B.1 Aplicação Java - Imagens Estáticas . . . . . . . . . . . . . . . . . . . . . . . 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 - Avaliação do SSIM . . . . . . . . . . . . . p. 222
B.3 Verificação da implementação na JM . . . . . . . . . . . . . . . . . . . . . . p. 222
B.3.1 validacaojm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 222
B.4 Leitura das estatísticas e Geração de Gráficos 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 Modificações na JM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 261
B.5.1 Soma das Diferenças 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 configuração utilizado . . . . . . . . . . . . . . . . . . . . . . . p. 268
Anexo C -- Artigo obrigatório p. 301
Lista de Figuras
1.1 Matriz de pixels de diversos padrões de imagens. Mostrando as dimensões em altura e
largura. Fonte:(POYNTON, 2003) . . . . . . . . . . . . . . . . . . . . . . . . . . p. 23
2.1 Criação e uso de técnicas de compressão de vídeo 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 Conversão do espaço de cor RGB para o espaço 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 reconstruído por interpolação. . . . . . . p. 30
2.6 Exemplo de Estimação de Movimento - Motion Estimation - (ME). . . . . . . . . . . . . p. 32
2.7 Padrões de codificação de vídeo 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 Predição de movimento com uso de vetores que apontam para fora do quadro. . . . . . . . p. 35
2.10 Simplificação da ME com precisão de 1/4 de pixel. . . . . . . . . . . . . . . . . . . . p. 36
2.11 Representação de múltiplas referências de um quadro no padrão H.264/AVC. . . . . . . . p. 36
2.12 Uso da predição com peso em uma cena com “fade out”. . . . . . . . . . . . . . . . . p. 37
2.13 Exemplo da predição de vetores de movimento. . . . . . . . . . . . . . . . . . . . . p. 37
2.14 Início da predição intra 4x4. Adaptado de:(MANOEL, 2007) . . . . . . . . . . . . . . p. 37
2.15 Bloco original e os nove possíveis candidatos intra 4x4. Adaptado de:(MANOEL, 2007) . . p. 38
2.16 Quatro possíveis direções da predição intra 16x16. . . . . . . . . . . . . . . . . . . . p. 38
4.1 Exemplo de blocos utilizados durante a ME. . . . . . . . . . . . . . . . . . . . . . . p. 42
4.2 Padrão de amostragem 2:1 comumente utilizado para pel decimation em um bloco 8x8.
Fonte: (PORTO, 2006) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 46
4.3 Os pixels utilizados no cálculo das métricas estão marcados. . . . . . . . . . . . . . . . p. 46
4.4 Exemplo de aplicação da métrica Main Diagonal sobre um bloco 8x8, coletando apenas os
elementos da diagonal principal. . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 49
4.5 Exemplo de aplicação da métrica 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
métricas em estudo para o teste “4”. . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
6.4 Relação Sinal-Ruído de Pico - Peak signal-to-noise ratio - (PSNR) de cada uma das métricas
em estudo para o teste “4”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 56
6.5 Resíduo de cada uma das métricas em estudo para o teste “4”. . . . . . . . . . . . . . . p. 57
6.6 Resíduos sobre o teste “4”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 58
6.7 Segunda imagem de teste, “teste 11” (Lena). . . . . . . . . . . . . . . . . . . . . . . p. 58
6.8 SSIM de cada uma das métricas em estudo para o teste “11”. . . . . . . . . . . . . . . p. 59
6.9 PSNR de cada uma das métricas em estudo para o teste “11”. . . . . . . . . . . . . . . p. 60
6.10 Resíduo de cada uma das métricas 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 métricas em estudo para o teste “10”, Baboon. . . . . . . . . . . p. 61
6.13 PSNR de cada uma das métricas em estudo para o teste “10”, Baboon. . . . . . . . . . . p. 62
6.14 Resíduo de cada uma das métricas em estudo para o teste “10”, Baboon. . . . . . . . . . p. 62
6.15 Vídeos de teste utilizados para avaliação de qualidade em vídeo das métricas de similaridade
estudadas. Fonte: (XIPH.ORG, 2011) . . . . . . . . . . . . . . . . . . . . . . . . . p. 63
6.16 As duas imagens possuem o mesmo PSNR, mas o ruído está distribuído em regiões diferen-
tes. Fonte: (WINKLER, 2005). . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 65
6.17 Resultados da sequência de teste “Foreman” para as métricas utilizadas no codificador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
6.18 Resultados da sequência de teste “Soccer” para as métricas utilizadas no codificador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 66
6.19 Resultados da sequência de teste “Sunflower” para as métricas utilizadas no codificador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 67
6.20 Resultados da sequência de teste “Ducks Take Off ” para as métricas utilizadas no codificador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 68
6.21 Resultados da sequência de teste “In to the Tree” para as métricas utilizadas no codificador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 69
6.22 Resultados da sequência de teste “Park Joy” para as métricas utilizadas no codificador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 69
6.23 Resultados da sequência de teste “Big Buck Bunny” para as métricas utilizadas no codificador
(JVT, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 70
6.24 Resultados da sequência de teste “Riverbed” para as métricas utilizadas no codificador (JVT,
2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 71
7.1 Esquema geral bloco responsável pelas subtrações 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 Possível mapeamento do bloco candidato e referência (A e B) para as entradas do cálculo da
SAD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 75
7.4 Comparativo dos atrasos estimados para as métricas com os somadores Carry-Lookahead
Adder (CLA) e Carry-Ripple Adder (CRA). . . . . . . . . . . . . . . . . . . . . . p. 77
7.5 Comparativo do consumo de potência para as métricas com os somadores CLA e CRA. . . p. 77
7.6 Comparativo dos custos de área para as métricas com os somadores CLA e CRA. . . . . . p. 78
7.7 Comparativo do Produto Atraso-Potência - 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 estática em software. . . . . . . . . . p. 86
A.2 SSIM de cada uma das métricas em estudo para o teste “0”. . . . . . . . . . . . . . . . p. 93
A.3 SSIM de cada uma das métricas em estudo para o teste “1”. . . . . . . . . . . . . . . . p. 93
A.4 SSIM de cada uma das métricas em estudo para o teste “2”. . . . . . . . . . . . . . . . p. 94
A.5 SSIM de cada uma das métricas em estudo para o teste “3”. . . . . . . . . . . . . . . . p. 94
A.6 SSIM de cada uma das métricas em estudo para o teste “4”. . . . . . . . . . . . . . . . p. 95
A.7 SSIM de cada uma das métricas em estudo para o teste “5”. . . . . . . . . . . . . . . . p. 95
A.8 SSIM de cada uma das métricas em estudo para o teste “6”. . . . . . . . . . . . . . . . p. 96
A.9 SSIM de cada uma das métricas em estudo para o teste “7”. . . . . . . . . . . . . . . . p. 96
A.10 SSIM de cada uma das métricas em estudo para o teste “8”. . . . . . . . . . . . . . . . p. 97
A.11 SSIM de cada uma das métricas em estudo para o teste “9”. . . . . . . . . . . . . . . . p. 97
A.12 SSIM de cada uma das métricas em estudo para o teste “10”. . . . . . . . . . . . . . . p. 98
A.13 SSIM de cada uma das métricas em estudo para o teste “11”. . . . . . . . . . . . . . . p. 98
A.14 SSIM de cada uma das métricas em estudo para o teste “12”. . . . . . . . . . . . . . . p. 99
A.15 SSIM de cada uma das métricas em estudo para o teste “13”. . . . . . . . . . . . . . . p. 99
A.16 SSIM de cada uma das métricas em estudo para o teste “14”. . . . . . . . . . . . . . . p. 100
A.17 PSNR de cada uma das métricas em estudo para o teste “0”. . . . . . . . . . . . . . . p. 101
A.18 PSNR de cada uma das métricas em estudo para o teste “1”. . . . . . . . . . . . . . . p. 101
A.19 PSNR de cada uma das métricas em estudo para o teste “2”. . . . . . . . . . . . . . . p. 102
A.20 PSNR de cada uma das métricas em estudo para o teste “3”. . . . . . . . . . . . . . . p. 102
A.21 PSNR de cada uma das métricas em estudo para o teste “4”. . . . . . . . . . . . . . . p. 103
A.22 PSNR de cada uma das métricas em estudo para o teste “5”. . . . . . . . . . . . . . . p. 103
A.23 PSNR de cada uma das métricas em estudo para o teste “6”. . . . . . . . . . . . . . . p. 104
A.24 PSNR de cada uma das métricas em estudo para o teste “7”. . . . . . . . . . . . . . . p. 104
A.25 PSNR de cada uma das métricas em estudo para o teste “8”. . . . . . . . . . . . . . . p. 105
A.26 PSNR de cada uma das métricas em estudo para o teste “9”. . . . . . . . . . . . . . . p. 105
A.27 PSNR de cada uma das métricas em estudo para o teste “10”. . . . . . . . . . . . . . . p. 106
A.28 PSNR de cada uma das métricas em estudo para o teste “11”. . . . . . . . . . . . . . . p. 106
A.29 PSNR de cada uma das métricas em estudo para o teste “12”. . . . . . . . . . . . . . . p. 107
A.30 PSNR de cada uma das métricas em estudo para o teste “13”. . . . . . . . . . . . . . . p. 107
A.31 PSNR de cada uma das métricas em estudo para o teste “14”. . . . . . . . . . . . . . . p. 108
A.32 Resíduo de cada uma das métricas em estudo para o teste “0”. . . . . . . . . . . . . . . p. 109
A.33 Resíduo de cada uma das métricas em estudo para o teste “1”. . . . . . . . . . . . . . . p. 109
A.34 Resíduo de cada uma das métricas em estudo para o teste “2”. . . . . . . . . . . . . . . p. 110
A.35 Resíduo de cada uma das métricas em estudo para o teste “3”. . . . . . . . . . . . . . . p. 110
A.36 Resíduo de cada uma das métricas em estudo para o teste “4”. . . . . . . . . . . . . . . p. 111
A.37 Resíduo de cada uma das métricas em estudo para o teste “5”. . . . . . . . . . . . . . . p. 111
A.38 Resíduo de cada uma das métricas em estudo para o teste “6”. . . . . . . . . . . . . . . p. 112
A.39 Resíduo de cada uma das métricas em estudo para o teste “7”. . . . . . . . . . . . . . . p. 112
A.40 Resíduo de cada uma das métricas em estudo para o teste “8”. . . . . . . . . . . . . . . p. 113
A.41 Resíduo de cada uma das métricas em estudo para o teste “9”. . . . . . . . . . . . . . . p. 113
A.42 Resíduo de cada uma das métricas em estudo para o teste “10”. . . . . . . . . . . . . . p. 114
A.43 Resíduo de cada uma das métricas em estudo para o teste “11”. . . . . . . . . . . . . . p. 114
A.44 Resíduo de cada uma das métricas em estudo para o teste “12”. . . . . . . . . . . . . . p. 115
A.45 Resíduo de cada uma das métricas em estudo para o teste “13”. . . . . . . . . . . . . . p. 115
A.46 Resíduo de cada uma das métricas em estudo para o teste “14”. . . . . . . . . . . . . . p. 116
Lista de Tabelas
1.1 Tabela comvalores de taxa de bits e espaço ocupado para alguns padrões usados emBlu-rays.
Adaptado de: (BENNETT, 2011) . . . . . . . . . . . . . . . . . . . . . . . . . . . p. 24
5.1 Tabela com resultados da análise dinâmica da Joint Model (JM)(JVT, 2011) para a sequência
“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 métricas estudadas, estimadas com somadores CLA e CRA. Valores
estimados a partir de (MONTEIRO, 2011). . . . . . . . . . . . . . . . . . . . . . . p. 78
A.1 Tabela de resultados para a figura A.1 (a). . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.2 Tabela de resultados para a figura A.1 (b). . . . . . . . . . . . . . . . . . . . . . . . p. 87
A.3 Tabela de resultados para a figura A.1 (c). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.4 Tabela de resultados para a figura A.1 (d). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.5 Tabela de resultados para a figura A.1 (e). . . . . . . . . . . . . . . . . . . . . . . . p. 88
A.6 Tabela de resultados para a figura A.1 (f). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.7 Tabela de resultados para a figura A.1 (g). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.8 Tabela de resultados para a figura A.1 (h). . . . . . . . . . . . . . . . . . . . . . . . p. 89
A.9 Tabela de resultados para a figura A.1 (i). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.10 Tabela de resultados para a figura A.1 (j). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.11 Tabela de resultados para a figura A.1 (k). . . . . . . . . . . . . . . . . . . . . . . . p. 90
A.12 Tabela de resultados para a figura A.1 (l). . . . . . . . . . . . . . . . . . . . . . . . p. 91
A.13 Tabela de resultados para a figura A.1 (m). . . . . . . . . . . . . . . . . . . . . . . p. 91
A.14 Tabela de resultados para a figura A.1 (n). . . . . . . . . . . . . . . . . . . . . . . . p. 91
A.15 Tabela de resultados para a figura A.1 (o). . . . . . . . . . . . . . . . . . . . . . . . p. 92
Lista de Acrônimos
3 CCD Three-CCD
A1CSA Add-One Carry-Select Adder
A1CSAH Hierarchical Add-One Carry-Select Adder
AVCHD Advanced Video Codec High Definition
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 Vídeo Digital - Digital Video Disc -
FFT Transformada Rápida de Fourier - Fast Fourier Transform -
FR Taxa de Quadros - Frame Rate -
GCC GNU Compiler Collection
GNU “GNU’s Not Unix!”
GPL General Public License
HD-DVD High Definition Digital Video Disc
HD Alta Definição - High Definition -
HVS Sistema Visual Humano - Human Visual System -
18
ITU-T International Telecommunication Union Telecommunication Standardization Sector
JM Joint Model
JVT Joint Video Team
ME Estimação 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-Potência - Power-Delay Product -
PMV Vetor de Movimento Predito - Predicted Motion Vector -
PSNR Relação Sinal-Ruído de Pico - Peak signal-to-noise ratio -
RD Taxa-Distorção - Rate-Distortion -
RDO Otimização Taxa-Distorção - Rate-Distortion Otimization -
RGB Vermelho, Verde e Azul - Red, Green and Blue -
SAD Soma das Diferenças Absolutas - Sum of Absolute Differences -
SATD Soma das Diferenças Transformadas Absolutas - Sum of Absolute Transformed Differ-
ences -
SBTVD Sistema Brasileiro de Televisão Digital
SL Camada Simples - Single Layer -
SSD Soma das Diferenças Quadráticas - 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 Variável - 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 padrões de subamostragem de pixels como entrada de
métricas de custo durante a fase de estimação de movimento em um codificador de vídeo digi-
tal. A subamostragem de pixels (pel decimation) é largamente utilizada e propicia implemen-
tações em hardware eficientes e com alto desempenho. Inicialmente foram propostos padrões
de amostragem e o erro gerado pelas métricas consideradas foram avaliado utilizando-se o soft-
ware de referência do padrão H.264/AVC, bem como uma implementação inicial sobre ima-
gens estáticas para uma pré-avaliação. Serão analisadas algumas arquiteturas Very-large-scale
Integration (VLSI) para uma métrica comumente utilizada na literatura, e foram estimados os
resultados da subamostragem em tais arquiteturas. Assim é possível ter uma visão geral de
como fazer tal amostragem, suas vantagens sobre as demais em termos de custo (área), desem-
penho (atraso crítico) e eficiência energética (produto atraso-potência), bem como em relação
às diferenças da qualidade da predição.
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 efficient 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 efficiency (power-delay product), as well
as differences in relation of the prediction quality.
22
1 Introdução
A compressão de imagens estáticas e de vídeo exige alto desempenho, principalmente em
aplicações em que a compressão deve ocorrer em tempo real (uma transmissão ao vivo, por
exemplo). Além disso, é cada vez mais frequente o uso de compressão de imagens em equipa-
mentos portáteis operados a bateria (câmeras, telefones celulares, smartphones, etc). Nestes
casos, o processo de compressão deve ocorrer com máxima eficiência energética, a fim de pro-
longar a carga e a vida útil das baterias.
Baseando-se principalmente na redução de informação redundante, segundo Richardson
(2003), a compressão de vídeo digital (imagem dinâmica) traz pelo menos dois importantes
benefícios. O primeiro deles é tornar possível o uso de vídeo digital para armazenamento e
transmissão em meios que não suportariam vídeo não comprimido (“raw”). O segundo é possi-
bilitar o uso mais eficiente dos recursos de armazenamento e transmissão.
Este trabalho investiga padrões de amostragem para o algoritmo de pel decimation (KUHN,
1999), como forma de acelerar a etapa de codificação conhecida como Estimação de Movimento
- Motion Estimation - (ME), que é um passo fundamental nos compressores de vídeo. Para
tanto serão estudadas as principais métricas de similaridade com especial atenção à Soma das
Diferenças Absolutas - Sum of Absolute Differences - (SAD), por ser esta a mais utilizada. Além
disso, uma nova métrica é proposta e foi batizada de Direct Current (DC).
A busca por novos padrões de amostragem a serem usados no cálculo de similaridade tem
por objetivo reduzir o custo do cálculo sem comprometer a qualidade da compressão. A re-
dução do custo do cálculo conduz a implementações em hardware com menor custo, maior
desempenho e menor consumo de energia.
Este trabalho se concentra em dois aspectos:
• Análise da qualidade da predição com o uso das métricas estudadas, as quais foram im-
plementadas apenas em software. Esta avaliação usa inicialmente imagens estáticas, pas-
sando então a sua avaliação para vídeos no padrão H.264/AVC (ITU-T, 2009), com sua
inclusão no software de referência do padrão, a Joint Model (JM) (JVT, 2011).
23
• Análise de arquiteturas Very-large-scale Integration (VLSI) para tais métricas (e padrões)
em termos de custo (área), desempenho (atraso crítico) e eficiência energética (produto
atraso-potência).
1.1 Justificativa
1.1.1 Compressão de Vídeo
Há muito, na cultura popular, se comenta que “uma imagem vale por mil palavras”. Um
vídeo nada mais é do que uma sequência de imagens rapidamente apresentadas, gerando assim
a ilusão de movimento. Desde o início do cinema como forma de arte e como tecnologia, nos
anos 1890s
1
, a ideia de imagem dinâmica atrai a atenção de empreendedores, artistas, cien-
tistas e políticos (Nowell-Smith, 1999). Não só o cinema exerce essa atração, mas também o
vídeo nos mais diversos tipos de mídia e formas de transmissão (TV, Disco de Vídeo Digital -
Digital Video Disc - (DVD), Blu-Ray, Celulares, Internet, etc). No princípio as câmeras eram
analógicas, com vários padrões definindo seus formatos de gravação. Posteriormente, com uma
resolução maior que a do formato analógico, surge o vídeo digital, facilitando a manipulação
dos dados (por exemplo a edição e a transmissão) (MANZATO, 2004).
Figura 1.1: Matriz de pixels de diversos padrões de imagens. Mostrando as dimensões em altura e largura.
Fonte:(POYNTON, 2003)
Representar vídeo em forma digital requer uma grande quantidade de bits (RICHARDSON,
2002). Usando fórmulas matemáticas simples, pode-se verificar a dificuldade de transmissão e
1
No princípio do cinema, muitas pessoas acreditavam que as imagens que estavam assistindo fossem reais.
Em 1896, de acordo com um comentarista, o filme 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 floods 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 vídeo digital em sua forma descomprimida. Em um vídeo, há o “conceito”
de taxa de quadros (frame rate), que é o número de quadros exibidos em um segundo de vídeo
(essa alternância de quadros é o que causa a impressão de movimento, e segundo (VIJAYAKU-
MAR, 2008), são necessários pelo menos 24 quadros por segundo para que o olho humano
tenha a sensação de movimento). Levando-se a Taxa de Quadros - Frame Rate - (FR) em con-
sideração, 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 vários
padrões de imagens e suas dimensões), têm-se que
bitrate = x ∗w∗h∗ f r (1.1)
Este valor é chamado de taxa de bit (bitrate). Considerando a Equação 1.1, para um filme em
DVD com w*h = 720x480
2
, x = 24 bits/pixel, fr = 29.97 quadros/segundo, são necessários
24∗720∗480∗29.97 = 248583168bits/s = 29.63MiB/s.
Mesmo não parecendo um valor muito alto, ao se considerar um filme 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 compressão que torna
possível o uso de umDVDcomessa capacidade. Alémdisso, há de ser considerado que também
serão armazenados no DVD as faixas de áudio para cada idioma, legendas, menus, extras, etc.
Ao se analisar, por exemplo, um vídeo em Alta Definição - High Definition - (HD) e “full-HD”,
como mostrado na Tabela 1.1, nota-se claramente a necessidade de uma grande compressão.
Afinal, poucos usuários poderiam armazenar um filme com, por exemplo, 750 GiB.
Tabela 1.1: Tabela com valores de taxa de bits e espaço ocupado para alguns padrões 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
vídeo
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 padrão Moving Pictures Expert Group - 2 (MPEG-2) é usado para a
codificação do vídeo. Já para as necessidades atuais, como o Sistema Brasileiro de Televisão
Digital (SBTVD), Blu-ray, High Definition Digital Video Disc (HD-DVD), Advanced Video
2
Considerando linhas visíveis para o padrão National Television System Committee (NTSC), embora este
padrão tenha no total 525 linhas. Há uma certa variação para os tamanhos. (TAYLOR, 2011)
25
Codec High Definition (AVCHD), foi adotado o padrão H.264/AVC(ITU-T, 2009), que melhora
a compressão em até 50% em relação ao MPEG-2. Mesmo sendo o estado da arte em eficiência,
emalguns casos ainda é inviável seu uso devido ao custo de processamento e ao limite da largura
de banda disponível para algumas aplicações (MORAES, 2010).
1.2 Objetivos
1.2.1 Objetivos gerais
O objetivo deste trabalho é analisar métricas e padrões de amostragem para o cálculo de
similaridade entre blocos, buscando-se identificar a existência de um padrão de amostra que
não resulte em grandes degradações na estimação de movimento (ME).
1.2.2 Objetivos específicos
• Avaliar padrões de amostragem para o algoritmo conhecido na literatura por pel deci-
mation (KUHN, 1999), em imagens estáticas e dinâmicas (vídeo), com foco no padrão
H.264/AVC.
• Fazer estimativa em termos de atraso crítico, potência, área e eficiência energética com
vistas à sintese de arquiteturas VLSI apropriadas para os cálculos propostos.
1.3 Escopo deste Trabalho
Os padrões de amostragem deste trabalho foram primeiramente implementados em lin-
guagem Java, de modo a permitir sua avaliação com imagens estáticas. Posteriormente, o soft-
ware de referência (JVT, 2011) foi modificado a fimde permitir a avaliação dos mesmos padrões
de amostragem quando aplicados a vídeos. Finalmente, foram feitas estimativas em termos de
atraso crítico, potência, área e eficiência energética para uma arquitetura VLSI capaz de re-
alizar esses cálculos. Tais estimativas se basearam nos resultados no Trabalho de Conclusão de
Curso feito por Monteiro (2011), o qual utilizou as ferramentas disponíveis no Laboratório de
Computação Embarcada - Embedded Computing Lab. (LCE) do Departamento de Informática
e Estatística (INE), na Universidade Federal de Santa Catarina (UFSC).
26
1.4 Organização deste Trabalho
Este trabalho está organizado em 8 capítulos e 3 anexos. O Capítulo 1 justifica o trabalho,
demonstrando por que é necessário comprimir vídeo. Também mostra o escopo do trabalho e
os objetivos gerais e específicos. O Capítulo 2 apresenta conceitos de codificação/compressão
de vídeo digital, bem como o padrão de codificação estado da arte, o H.264/AVC. O Capítulo
3 revisa as métricas de similaridade utilizadas na codificação. O Capítulo 4 aprofunda um
pouco mais as métricas a serem estudadas, assim como propõe padrões de amostragem para o
algoritmo de pel decimation com possível bom desempenho. No Capítulo 5 há uma descrição
do software de referência do padrão H.264/AVC (JM) (JVT, 2011), e uma breve avaliação do
impacto da estimação de movimento no tempo de execução de um codificador de vídeo. No
Capítulo 6 são apresentados e discutidos os resultados dos testes implementados em software.
O Capítulo 7 mostra algumas possíveis arquiteturas VLSI para implementação das métricas de
custo, e faz estimativas de custo dos padrões de amostragem propostos. Finalmente o Capítulo
8 apresenta as conclusões deste trabalho, assim como os trabalhos futuros.
27
2 Conceitos de Compressão de Vídeo
Digital
Neste Capítulo estão descritos os conceitos básicos de compressão de vídeo digital, usados
na maioria dos padrões de codificação de vídeo. Também são comentados os padrões mais
utilizados, dando ênfase ao padrão H.264/AVC. Os conceitos de codificação de vídeo, bem
como as novidades do H.264/AVC são explicadas de forma simples, tendo por base o texto de
Richardson (2003) e a recomendação do padrão pela ITU-T (2009).
2.1 Conceitos Básicos
Um vídeo nada mais é do que uma sequência de amostras espaciais e temporais capturadas
eletricamente por uma câmera. Estas amostras são organizadas e armazenadas em matrizes
de tamanho definido, sendo que cada elemento de uma matriz corresponde a uma informação
específica da amostra. Estas matrizes, arranjadas em sequência, conforme foram capturadas,
formam o vídeo. Cada uma dessas matrizes pode ser entendida como uma imagem. Assim, um
vídeo é uma sequência de imagens amostradas rapidamente
1
.
A compressão acontece ao se eliminar informações redundantes dessa sequência de ma-
trizes. As redundâncias em um vídeo podem ser classificadas em quatro tipos:
1. Entrópica: Relativa à repetição estatística dos símbolos amostrados (bits por exemplo);
2. Frequencial: Relativa ao conjunto de frequências de cada quadro as quais o Sistema Vi-
sual Humano - Human Visual System - (HVS) não é muito sensível;
3. Temporal: Relativa à repetição de informação no decorrer do tempo;
4. Espacial: Relativa à repetição da informação 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 técnicas usadas na compressão de vídeo, dispostas na forma
de linha do tempo. É interessante notar o quanto a área é antiga e que muitos dos conceitos usa-
dos há várias décadas são válidos até hoje, como por exemplo, o uso da Transformada Discreta
dos Cossenos (Transformada Discreta dos Cossenos - Discrete Cosine Transform - (DCT)),
quadros de referência preditos (quadros-P), bi-preditos (quadros-B), etc. Estes e outros con-
ceitos serão melhor detalhados nas próximas subseções.
Figura 2.1: Criação e uso de técnicas de compressão de vídeo ao longo do tempo. Adaptado de: (READER,
2002)
2.1.1 Captura da Imagem
A imagem é capturada pela câmera usando-se, por exemplo, um Charge-Coupled De-
vice (CCD), o qual armazena cargas dos fótons capturados durante um período de tempo (ex-
posição). O CCD é um componente eletrônico feito de material semicondutor, como o Silício, e
é manufaturado para ser sensível à incidência da luz sobre sua superfície (JUNIOR; KANAAN;
GOMES, 2002). Ele é composto por uma matriz, onde cada elemento é responsável por cap-
turar a informação de um pixel da imagem final. Quanto maior o tamanho da matriz, maior é o
tamanho da imagem, e quanto menor o tamanho de cada pixel, maior a resolução da imagem.
Em suma, o CCD tem o seguinte funcionamento: quando um fóton incide sobre um dos elemen-
tos da matriz este elemento libera um elétron. Cada elemento tem um capacitor que acumula
a carga gerada pela incidência de luz. Ao final do tempo de exposição, a carga acumulada em
cada elemento é medida, fornecendo assim a informação referente à luz que incidiu sobre cada
elemento.
Costuma-se usar sobre o CCD um filtro de Bayer, comumente GRGB, permitindo a pas-
sagem de duas componentes verdes para uma componente vermelha e uma componente azul.
Apesar de refletir a sensibilidade do olho humano (BROWN, 2004), o uso do filtro de Bayer
causa diminuição da resolução, uma vez que cada pixel do filtro deixa passar luz apenas de um
29
dos canais Vermelho, Verde e Azul - Red, Green and Blue - (RGB). Uma alternativa ao uso
do filtro de Bayer é o uso de Three-CCD (3 CCD), um CCD por canal (WOOTTON, 2005).
Diversos modelos de câmeras profissionais 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 própria (a
Figura 2.2 resume a ideia da captura da imagem e a separação 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 representação digital de imagens coloridas,
com menos ou mais bits por canal, entretanto o mais conhecido e utilizado é o RGB 24 bits.
2.1.2 Conversão do Espaço de Cor
Outro passo do processo de codificação de imagens/vídeos digitais é a conversão do espaço
de cor. O padrão 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 não levam em consideração as
redundâncias na percepção humana. Outros espaços de cor podem ser mais adequados para a
representação da imagem. Atualmente, o espaço de cor mais utilizado durante o processo de
codificação é o Y - luma CB e CR “blue-difference” e “red-difference” dos componentes de
cor (YCbCr). A Figura 2.3 mostra a representação espacial dos dois espaços de cor, RGB e
YCbCr. Durante o processo de codificação, a imagem em formato RGB é convertida para o
formato YCbCr.
Figura 2.3: Conversão do espaço de cor RGB para o espaço YCbCr.
30
No formato YCbCr, o canal Y representa a luminosidade, ou seja, a intensidade de luz no
ponto. O canal Cb representa a diferença da luminosidade com o canal azul do RGB e o canal
Cr representa a diferença da luminosidade com o canal vermelho. O YCbCr não é um espaço de
cor absoluto, mas sim uma forma de codificar RGB. A Figura 2.4 mostra as três componentes
do formato YCbCr. Este espaço de cor é adotado no padrão H.264/AVC por conter menos cor-
relação entre suas componentes e possibilitar a operação denominada “subamostragem croma”,
descrita na próxima Seção.
Figura 2.4: Componentes do formato YCbCr.
2.1.3 Subamostragem Croma
O Sistema Visual Humano (HVS) é mais sensível à luminosidade do que às cores. Dessa
forma, é possível utilizar resoluções menores nas matrizes de crominância (Cb e Cr), com pouco
prejuízo para a qualidade subjetiva da imagem. De acordo com a subamostragem efetuada,
linhas horizontais ou verticais são eliminadas das matrizes de crominância e, quando deco-
dificadas, as amostras mantidas serão interpoladas para a geração de matrizes com a mesma
resolução. Alguns exemplos de subamostragem comumente utilizadas em codificação de vídeo
são 4:4:4, no qual não há subamostragem; 4:2:2, no qual a resolução das matrizes de crominân-
cia são reduzidas à metade na horizontal ou vertical; e 4:2:0, na qual as matrizes de crominância
são reduzidas à metade tanto na horizontal quanto na vertical.
Figura 2.5: Exemplo de subamostragem 4:4:4, 4:2:2 e 4:2:2 reconstruído por interpolação.
31
2.1.4 Transformada Discreta dos Cossenos
Pode-se dizer que a DCT (AHMED; NATARAJAN; RAO, 1974) é uma simplificação da
Transformada Rápida de Fourier - Fast Fourier Transform - (FFT), sendo computacionalmente
mais simples e mais efetiva para compressão multimídia. A transformada ocorre depois da
estimação de movimento, sobre o resíduo a ser mantido (ver Subseção 2.1.6). A fórmula da
DCT bidimensional é a seguinte:
G
i j
=
1

2n
C
i
C
j
n−1

x=0
n−1

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

2
, f = 0
1, f > 0
Existem várias otimizações comumente aplicadas para melhorar o desempenho no cálculo
da DCT como, por exemplo, a redução dos quadros em blocos, pré-cálculo de cossenos, etc.
2.1.5 Quantização
Durante o fluxo de compressão de vídeo, a quantização é a grande responsável pela perda na
qualidade e também compressão. Resumidamente, o passo de quantização consiste em dividir a
matriz de pixels por uma matriz chamada matriz de quantização. A quantização ocorre sobre os
coeficientes transformados pela DCT, gerando então uma matriz de coeficientes quantizados.
Quanto maiores os coeficientes da matriz de quantização, maior a compressão e também maior a
perda. As perdas ocorrem nesse passo principalmente em razão das diferentes implementações
de ponto flutuante e por erros de arredondamento.
2.1.6 Estimação de Movimento
A estimação de movimento (ME) é um dos grandes responsáveis pela alta taxa de com-
pressão em vídeos, sendo por isso um dos passos mais importantes na codificação. A ideia e o
funcionamento são bastante simples, mas a detecção de movimento pode ser bastante complexa.
A ME ocorre buscando em blocos candidatos o melhor casamento, usando alguma métrica de
similaridade. O bloco com o melhor casamento (escolhido), ou seja, com a maior semelhança
(similaridade) com o bloco atual (a ser codificado) é então 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 referência para o quadro atual
(mais à direita). A seta vermelha representa o MV, cujo valor armazenado é a coordenada, no
caso “(2,C)”. O resíduo
2
é mostrado, na Figura 2.6, sob a coordenada do MV.
Figura 2.6: Exemplo de ME.
A ME visa eliminar a redundância temporal, guardando apenas o MV e o resíduo por bloco,
ao invés de armazenar completamente a informação de cada bloco. Durante o processo de
codificação, a estimação de movimento ocorre antes do passo da transformada e quantização,
de forma que apenas o resíduo é transformado e quantizado.
2.1.7 Codificação Aritmética
A codificação aritmética é o passo final da codificação de vídeo e responsável por reduzir
a redundância entrópica. Após a redução dos outros tipos de redundâncias presentes em um
vídeo, algoritmos bastante conhecidos, como a codificação de Huffmann (SALOMON, 2007),
são aplicados para diminuir a repetição de símbolos. Este tipo de compressão não traz perdas
nos dados, portanto não influencia a qualidade final do vídeo.
2.2 Padrões de Compressão
Como o desafio da compressão de vídeo acompanha o crescimento da digitalização e dis-
tribuição de conteúdos pela internet, TV digital e outros meios, é importante buscar soluções
que garantam os requisitos de desempenho, qualidade, disponibilidade e manutenção dessas
aplicações (MORAES, 2010).
2
Resíduo: diferença entre a referência e o bloco a ser codificado. Ao reconstruir o bloco, esse resíduo é somado
ao bloco de referência, obtendo assim uma boa aproximação do bloco que foi codificado, exceto pelo erro causado
pela quantização desse resíduo.
33
Diversos são os padrões de codificação de vídeo até hoje criados. Estes padrões são regu-
lamentados pela International Telecommunication Union Telecommunication Standardization
Sector (ITU-T). Na Figura 2.7 são amostrados alguns dos padrões de codificação de vídeo cria-
dos ao longo do tempo. Estes padrões são listados a partir da década de 1980, e ao compará-los
com os da Figura 2.1, onde diversas técnicas de compressão ao longo do tempo estão ano-
tadas, se perceberá que os padrões listados na Figura 2.7 já contavam com muitas das técnicas
de compressão até hoje utilizadas, como a codificação de entropia (Codificação de Huffmann
(SALOMON, 2007)), a transformada discreta dos cossenos (DCT) e a estimação de movimento
(ME).
Figura 2.7: Padrões de codificação de vídeo ao longo do tempo. Adaptado de:(SULLIVAN, 2005)
2.2.1 H.264/AVC
De forma a abranger o estado da arte em compressão de vídeo, foi estudado mais a fundo o
padrão de compressão de vídeo 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, além de ser o formato de vídeo adotado no Brasil
para TV digital. É atualmente o estado da arte em compressão de vídeo, devido a seu aumento
em taxa de compressão, em comparação com padrões anteriores. É, portanto, alvo de muitos
estudos, de forma que é muito importante projetar hardware para codificação/decodificação de
vídeo nesse padrão, visando melhorar seu desempenho para que sejam capazes de cumprir suas
tarefas com baixo custo energético e, em muitas aplicações, em tempo real.
34
2.3 Conceitos no H.264/AVC
O padrão H.264/AVC teve ganhos de até 50% em eficiência sobre seu predecessor, o
MPEG-2 (MORAES, 2010). E segundo Manoel (2007):
“Não há uma característica que se destaque isoladamente – todas as novas ca-
racterísticas trazem pequenas melhorias que, conjuntamente, provêm um grande
impacto na taxa-distorção do H.264 relativamente a seus antecessores”
Nas próximas subseções serão abordadas algumas dessas novas melhorias acima citadas.
2.3.1 Aritmética Inteira
De acordo com Manoel (2007), “anteriormente ao padrão H.264 era necessário utilizar
operações com palavras de no mínimo 32-bits, além de uma aritmética de ponto flutuante. O
H.264 especifica as transformadas utilizando apenas operações simples de adição, subtração e
deslocamento, necessitando apenas de uma aritmética de 16-bits de ponto fixo. Isso reduz a
complexidade do hardware necessário para computar a transformada e a carga computacional,
bem como permite alocar o processamento para outras etapas, por exemplo, predição ou decod-
ificação.”
2.3.2 DCT
A DCT do H.264 é simplificada para uma operação de multiplicação de matrizes (matriz
da transformada - T), com inversa exata. A matriz de coeficientes 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 Estimação de Movimento
Esta Subseção mostra, com auxílio de figuras, algumas das novidades no processo de esti-
mação de movimento do padrão H.264/AVC. Vale a pena relembrar que a ME é um dos passos
da codificação responsável pelo maior ganho em compressão. Além disso, durante a ME são
utilizadas as métricas de similaridade para obter o casamento entre blocos similares.
No padrão H.264/AVC existe a possibilidade de um vetor de movimento (MV) apontar para
fora do quadro. Essa modificação 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
Predição Intra (Subseção 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: Predição de movimento com uso de vetores que apontam para fora do quadro.
Outra proposta do padrão é a precisão de 1/4 de pixel na ME. Isso significa mais can-
didatos na busca, mas, em compensação, movimentos mais sutis podem ser capturados na ME,
reduzindo possivelmente o resíduo. Assim, para os blocos candidatos são gerados novos blocos
através de interpolação, com precisão de primeiramente 1/2 pixel e estes são novamente inter-
polados para precisão de 1/4 de pixel. A Figura 2.10 mostra de maneira simplificada um MV
apontando para uma posição de 1/4 de pixel.
36
Figura 2.10: Simplificação da ME com precisão de 1/4 de pixel.
Mais uma novidade é que, ao invés de manter apenas uma referência fixa para blocos do
tipo Predito (P) e duas referências para os do tipo Bipredito (B) (como em padrões anteriores), o
H.264/AVC utiliza uma lista de referências passadas (lista 0) e uma lista com referências futuras
(lista 1). Dessa forma, um bloco pode apontar para qualquer uma das referências de qualquer
das duas listas. As listas “0” e “1”, bem como um quadro apontando para múltiplas referências,
podem ser vistas na Figura 2.11. O tamanho das listas vai requerer um maior ou menor tamanho
no buffer de codificação/decodificação.
Figura 2.11: Representação de múltiplas referências de um quadro no padrão H.264/AVC.
A grande maioria dos filmes faz transições suaves entre suas cenas. Normalmente, essa
suavidade é atingida utilizando-se de técnicas de “fade in”, “fade out” e “cross-fade”
3
. O
H.264/AVC otimiza a compressão deste tipo de técnica, pois implementa a chamada predição
com peso. Neste tipo de predição, após detectar que existe uma mudança gradativa na cena,
utiliza os blocos já codificados aplicando a eles um “peso”, ou seja, multiplica-os por um fator,
dessa forma diminuindo o resíduo para estes blocos. A Figura 2.12 mostra simplificadamente
uma predição com peso em uma cena com “fade-out”.
3
Fade in/Fade out: Recursos de edição de vídeo que permite transições 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 vídeo e aumentar de outro, em um movimento simultâneo.
Adaptado de (JACK; TSATSULIN, 2002).
37
Figura 2.12: Uso da predição com peso em uma cena com “fade out”.
Há também predição de vetores de movimento, usando os vetores de movimento de blocos
vizinhos. Calcula-se a partir dos vetores vizinhos de um bloco um vetor médio, chamado de
Vetor de Movimento Predito - Predicted Motion Vector - (PMV). Então, para o bloco o qual se
está armazenando o vetor é calculado o resíduo do vetor, que é a subtração do PMV pelo vetor
de movimento do bloco atual. A Figura 2.13 mostra um exemplo deste tipo de predição.
Figura 2.13: Exemplo da predição de vetores de movimento.
2.3.4 Predição Intra
Figura 2.14: Início da predição intra 4x4. Adaptado de:(MANOEL, 2007)
O padrão H.264/AVC também prevê a possibilidade de predições intra-quadro, explorando
assim a redundância espacial (MANOEL, 2007). São 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 vídeo
a ser codificado, do qual se tem um macrobloco e se buscará para um bloco 4x4, a melhor
combinação intra para este bloco. A Figura 2.15 mostra essa busca. O melhor casamento, dado
por uma métrica de similaridade, neste caso a SAD, é o candidato “7”.
Figura 2.15: Bloco original e os nove possíveis candidatos intra 4x4. Adaptado de:(MANOEL, 2007)
A predição 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 codificador gera amostras a
partir destas bordas, e através de alguma métrica de similaridade, o bloco mais parecido poderá
ser substituído pelo predito e seu resíduo. A Figura 2.15 mostra os nove modos (direções) da
predição intra 4x4 e a Figura 2.16 mostra os quatro modos (direções) da predição intra 16x16.
Figura 2.16: Quatro possíveis direções da predição intra 16x16.
39
3 Métricas de Similaridade
As métricas de similaridade, também chamadas de métricas de distorção, podem ser, a
grosso modo, classificadas em duas abordagens (MORAES, 2010):
• métricas baseadas em modelos matemáticos usados em processamento de sinais;
• métricas psicovisuais que usam características do HVS.
As primeiras são modelos puramente matemáticos derivados da teoria de sinais e não con-
sideram características do HVS. Entretanto, por questões de desempenho são as mais usadas. Já
as métricas psicovisuais exploram modelos do HVS. As poucas existentes sofrem de baixo de-
sempenho e exploram apenas um pequeno conjunto de características. Um exemplo é o Índice
de Similaridade Estrutural - Structural Similarity Index - (SSIM), que explora a capacidade do
olho humano de identificar estruturas. Por sofrerem de baixo desempenho (alta complexidade
computacional para seu cálculo), além de não explorar por completo o HVS, não são muito
usadas nem mesmo muito aceitas (WU; RAO, 2005). Exemplos de métricas de similaridade
comumente utilizadas são a SAD, a Soma das Diferenças Quadráticas - Sum of Squared Differ-
ences - (SSD) e a Soma das Diferenças Transformadas Absolutas - Sumof Absolute Transformed
Differences - (SATD). objetivamente e avaliadas de forma automática por um programa de com-
putador. São modelos matemáticos e incluem métricas da teoria de sinais e também métricas
psicovisuais. Assim há uma grande confusão nessas duas formas de classificação. As métricas
subjetivas tem por objetivo aproximar a opinião de um usuário, e podem incluir o esforço de
avaliadores.
3.1 Métricas Objetivas
As métricas de distorção objetivas mais usadas são apresentadas a seguir:
SAD - Soma das Diferenças Absolutas: Métrica de distorção constituída pela soma do
valor absoluto das diferenças entre cada amostra original e a amostra correspondente, após o
40
processo de reconstrução. Devido à sua baixa complexidade computacional é adequada para
implementação direta em hardware (MANOEL, 2007) .
SAD =
M

i=0
N

j=0
|Ori
i, j
−Dec
i, j
|
SSD - Soma das Diferenças Quadráticas: Corresponde à soma do quadrado das diferenças
entre cada amostra original e a amostra após o processo de reconstrução. Sua característica
principal é evidenciar os erros significativos (MANOEL, 2007).
SSD =
M

i=0
N

j=0
(Ori
i, j
−Dec
i, j
)
2
SATD - Soma das Diferenças Transformadas Absolutas: Baseada na SAD, mas usa a trans-
formada Hadamard (H) em uma partição 4x4 de diferenças antes de efetuar a soma absoluta dos
coeficientes. Apresenta maior custo que a SAD, com melhor qualidade por operar no domínio
das frequências (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 Quadrático Médio: Corresponde à média do quadrado das diferenças entre
cada amostra original e a amostra correspondente, após o processo de codificação/decodificação
(MANOEL, 2007) calculada em um bloco com tamanho M por N.
MSE =
SSD
MxN
PSNR - Razão Sinal-Ruído de Pico: Métrica de distorção objetiva de vídeo mais ampla-
mente usada. Seu valor é dado em decibéis para amostras de n bits (MANOEL, 2007) .
PSNR = 10log
10
(2
n
−1)
2
MSE
SSIM - Índice de Similaridade Estrutural: Valor máximo 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 média de x;
• µ
y
a média de y;
• σ
2
x
a variância de x;
• σ
2
y
a variância de y;
• σ
xy
a covariância de x e y;
• c
1
= (k
1
L)
2
, c
2
= (k
2
L)
2
variáveis para estabilizar a divisão por denominador fraco;
• L a gama dinâmica do pixel, 2
#bits pixel
−1);
• k
1
= 0.01 e k
2
= 0.03 por padrão.
3.2 Métricas Subjetivas
Métricas Subjetivas estão relacionadas à percepção do observador do vídeo, para uma se-
quência de um vídeo em particular. Testes de qualidade subjetivos são bastante complexos para
ser executados em termos de tempo e recursos humanos.
42
4 Contribuição às Métricas de
Similaridade
O objetivo deste trabalho é analisar métricas de similaridade e padrões de amostragem,
buscando identificar se existe um padrão de amostra que não resulte em grandes degradações na
ME. Por este motivo, e também buscando implementações VLSI com alto desempenho e baixo
consumo energético, as métricas escolhidas para serem estudadas foram as com implementação
simples e com baixo número de operações aritméticas. É ainda proposta uma métrica com
tendência a ter bom desempenho, não encontrada na literatura. Estas métricas serão avaliadas
em relação à qualidade da predição em comparação com métricas conhecidas.
(a) Bloco original (b) Bloco candidato
(referência)
(c) Módulo do resí-
duo entre original e
referência
Figura 4.1: Exemplo de blocos utilizados durante a ME.
Para ilustrar as métricas, será utilizado o exemplo da predição intra, descrita na Seção
2.3.4, sendo que a Figura 4.1 mostra o bloco original, ou seja, aquele para o qual se busca
uma boa predição, e o bloco de referência, que é um possível candidato como referência ao
bloco original. No exemplo, o quadro de referência é o modo intra 7 (down-left) para blocos
4x4. Nesta mesma imagem também é mostrado o módulo do resíduo entre o bloco referência e
o original
1
. No exemplo é considerado um bloco luma
2
4x4, portanto representados com 255
variações de cinza (entre 0 e 254), sendo 0 totalmente preto e 254 totalmente branco. Os valores
1
Como a SADutiliza a soma das diferenças absolutas, o módulo do resíduo corresponde às diferenças absolutas.
Portanto, ao se somarem todos os pixels deste bloco, têm-se o valor numérico correspondente à SAD entre o bloco
original e a referência. Assim, o uso do bloco com o módulo do resíduo facilita na apresentação das métricas 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 são mostrados na Figura 4.1 de forma a facilitar a interpretação.
Uma forma menos visual de representar os três blocos é em forma de matriz, como apre-
sentado nas matrizes na Equação 4.1. As matrizes A, B e C correspondem, respectivamente aos
blocos original, candidato e módulo do resíduo.
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 métrica mais simples da literatura, a SAD foi escolhida como base dos experi-
mentos, e também como comparação em relação à qualidade para as outras métricas. Além de
ser a mais simples, também é uma das métricas mais utilizadas. Como visto no Capítulo 3, a
SAD é calculada de acordo com a Equação 4.2, na qual os índices i e j são a localização de cada
pixel na matriz de pixel original e de referência (“Ori” e “Ref ”, respectivamente). Como pode
ser observado na Equação 4.2, são utilizados todos os pixels das matrizes dos dois blocos. De
forma a comparar com as demais métricas, a Figura 4.3 mostra em destaque os pixels utilizados
no cálculo 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 módulos
dos resíduos 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 subtração e uma extração de módulo.
Existem trabalhos correlatos, com propostas de arquiteturas para o cálculo da SAD assim
como sua síntese para “Standard-Cells”, com foco também em alta performance e baixa dissi-
pação de potência. Tais propostas serão abordadas no Capítulo 7.
44
4.2 DC
Durante estudos sobre a DCT e o padrão H.264/AVC, bem como a própria DCT do H.264
(ITU-T, 2009), percebeu-se que existe uma alta relação entre o bloco remontado de pela inversa
da DCT com o coeficiente DC da transformada. Observou-se assim que existe uma alta cor-
relação entre o coeficiente DC e o bloco. Surgiu então a idéia de usar o coeficiente DC como
parte de uma métrica de similaridade simplificada, a qual foi chamada de DC. A métrica DC
então é o módulo da diferença entre o coeficiente DC da DCT do bloco candidato e do bloco
original. Isso significa medir o quão diferentes são os coeficientes DCs das DCTs dos blocos.
A SAD toma pixel a pixel do bloco e calcula a diferença, somando o módulo das diferenças
pixel a pixel, gerando assim um coeficiente de semelhança entre as imagens. Quanto menor a
SAD, mais semelhantes as imagens. Já, observando a forma como o coeficiente DC é calculado
no H.264/AVC (ITU-T, 2009), percebe-se que são feitas apenas as somas dos pixels do bloco,
o que tende a ser mais simples do que a SAD. Assim, como existe uma alta correlação entre
o bloco com seu coeficiente DC, o casamento de blocos durante a ME pode aproveitar essa
correlação para tornar-se mais rápido.
Seu cálculo é descrito na Equação 4.3, sendo que os índices i e j são a localização de cada
pixel na matriz de pixel original e de referência (“Ori” e “Ref ”, respectivamente). Assim
como a SAD, esta métrica utiliza todos os pixels do bloco para o cálculo 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 começo do capítulo, basta somar os valores de cada uma das
matrizes de pixel (na Equação 4.1 as matrizes A e B) e então fazer a diferença entre estas
somas, tirando por fim o módulo. 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 fim |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 Seção 4.1, a SAD é considerada na literatura como a métrica mais
simples, e é largamente empregada durante o processo da ME. Meios de acelerar a ME são
bastante explorados na literatura. Lee et al. (2004) afirma que dentre os algoritmos de busca de
vetores de movimento, o que provém os melhores resultados é a busca completa (full-search).
Este tipo de busca utilizando, por exemplo, como métrica de similaridade a SAD, faz o cálculo
da mesma para todos os possíveis blocos candidatos, buscando por fim o menor valor dentre
eles. Este processo é bastante custoso, pois num ciclo para a codificação de vídeo, pode ser
necessário o cálculo da métrica de similaridade umelevado número de vezes
3
. Para resolver este
problema, outros algoritmos de busca foram propostos, que têm por base a diminuição da área
de busca. Ou seja, diminuem-se os possíveis candidatos. Dessa forma, a complexidade diminui,
mas os resultados alcançados não são tão 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 consideração no cálculo da métrica 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 são tomados uniformemente sobre a área de busca, fazendo uma amostragem destes.
Esta técnica, por possuir alta regularidade, além de diminuir a complexidade do cálculo de
similaridade, é bastante utilizada em implementações VLSI. Devido ao fato de não se ter mais a
correlação completa de cada pixel no bloco, espera-se uma diminuição da qualidade na predição
e, como consequência, na qualidade visual da mesma.
A amostragem dos pixels costuma ser feita nas proporções 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 padrão mostrado na Figura 4.2, mas a escolha do padrão de amostragem não está definida no
algoritmo. Tal escolha pode influenciar positiva ou negativamente a qualidade final da codifi-
cação. Dessa forma, pode-se fazer um estudo do quanto a ausência do cálculo de parte da SAD
influencia na predição e principalmente, quais padrões de amostragem tem menores perdas.
Nas próximas subseções serão descritos alguns algoritmos simplificados de cálculo parcial
da SAD (padrões de amostragem para o método de pel decimation). Para cada padrão foi
estipulado um nome para facilitar a organização deste trabalho e também dos testes e resultados.
A Figura 4.3 mostra em destaque os pixels utilizados no cálculo de cada um dos padrões, no
3
Como pode ser visto na Seção 5.1.1, o número de chamadas da SAD é bastante elevado, ainda mais ao se
considerar a resolução do vídeo e o pequeno número de quadros utilizados no teste.
46
Figura 4.2: Padrão 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 padrões, como por
exemplo do tabuleiro
4
, utilizam apenas 50% dos pixels do bloco (amostragem 2:1), dessa forma,
fazendo aproximadamente 50% menos operações durante seu cálculo, se comparado com uma
SAD completa. Isso, como já mencionado, trará consequências, principalmente em termos de
qualidade e resíduo, o que será avaliado primeiramente com testes em software, cuja descrição
e resultados serão mostrados no Capítulo 6.
(a) SADe DC (b) Diagonal
Principal
- (Main
Diagonal)
(c) Núcleo -
(Kernell)
(d) Bordas -
(Border)
(e) Cruzado -
(Cross)
(f) Tabuleiro
Par - (Even
Checker)
(g) Tabuleiro
Ímpar - (Odd
Checker)
Figura 4.3: Os pixels utilizados no cálculo das métricas estão marcados.
4.3.1 Diagonal Principal - (Main Diagonal SAD)
Esta é uma métrica 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 Equação 4.4 mostra seu cálculo.
Main Diagonal =
M

i=0
N

j=0
|Ori
i, j
−Re f
i, j
|, quando i = j (4.4)
4
Tal padrão é o comumente adotado na técnica 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 métrica 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 módulo dos resíduos, a operação aparenta ser bem mais simples,
como já comentado sobre a SAD.
4.3.2 Núcleo - (Kernell SAD)
Faz o cálculo da SAD apenas do núcleo
5
da matriz, ou seja a parte mais central. No caso
dos blocos 4x4, os quatro elementos mais centrais da matriz equivalem ao núcleo e os demais
elementos são pertencentes às bordas. Assim, utilizando também 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 padrão de amostragem foge do comumente utilizado na técnica de pel
decimation, a qual normalmente utiliza proporções 2:1 ou 4:1 (ou ainda menores). Como este
padrão inclui mais informação sobre o bloco, pode vir a ser mais preciso e ainda economizar
aproximadamente 1/4 de operações. 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 secundária da matriz de pixel e sobre
estas efetua o cálculo da SAD. É possível notar que utiliza, no caso de blocos 4x4, os pixels do
núcleo do bloco, e dos 4 cantos. Dessa forma, usa 50% dos pixels do bloco, equivalente então
à proporção 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 padrão utilizado no algoritmo de pel decimation, portanto pode servir de
base para comparações. Neste caso a proporção é 2:1 e as perdas são pouco significativas em
5
Esta nomenclatura não deriva da álgebra linear. É apenas utilizada neste trabalho para identificar a região
central da matriz de pixels.
48
termos de qualidade e taxa de bit. Por outro lado, há uma grande economia na complexidade da
computação da métrica. A abordagem do tabuleiro está subdividida nos testes em dois grupos,
par e ímpar (Checker Even e Checker Odd). Uma das possíveis vantagens da utilização destes
dois padrões ao mesmo tempo é uma organização de memória onde um bloco de memória de
256 bits (4 linhas, 4 colunas e 8 bits por elemento) pode conter o necessário para 2 blocos 4x4
de forma intuitiva e fácil gerência.
Par - (Even) Começa na posição 0 do bloco, utilizando os valores das posições pares nas
linhas pares e os valores das posições ímpares nas linhas ímpares. É o padrão adotado no
pel decimation na maioria das implementações. Para o exemplo, o valor de Checker Even é
12+1+1+18+4+40+14+16 = 106.
Ímpar - (Odd) Começa na posição 1 do bloco, utilizando os valores das posições ímpares
nas linhas pares e os valores das posições pares nas linhas ímpares. É o complemento do padrão
adotado no pel decimation na maioria das implementações. 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 padrões de amostragem foram apresentados para blocos 4x4. Os mesmos po-
dem ser estendidos para blocos com outros tamanhos, como é possível de acordo com o padrão
H.264/AVC (ITU-T, 2009). Por exemplo, a métrica 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 implementação
usada em 4x4, por exemplo, utilizando 2 cálculos de Main Diagonal SAD em setores especí-
ficos do bloco maior, como ilustrado na Figura 4.4. A mesma ideia pode ser aplicada para as
métricas com tabuleiro.
Tal método não se aplica ao cálculo de SAD apenas do centro (núcleo) e bordas, necessi-
tando assim de implementações específicas de acordo com o tamanho. Podem ser utilizadas
implementações genéricas, mas serão mais custosas pois é necessária uma lógica maior para a
separação dos valores de pixels a serem utilizados no cálculo. Apesar de economizarem muito
mais em recursos, tais abordagens quase certamente irão causar uma grande diminuição na
qualidade (testes passíveis de serem implementados como trabalhos futuros).
A saída então é considerar a soma dos resultados parciais para blocos 4x4, uma vez que
49
Figura 4.4: Exemplo de aplicação da métrica Main Diagonal sobre um bloco 8x8, coletando apenas os elementos
da diagonal principal.
as outras possibilidades de subdivisões de blocos previstos no padrão são todos múltiplos de
blocos 4x4. Isto é bastante adotado, inclusive no software de referência (JVT, 2011). Para essa
solução, a Figura 4.5 mostra também um exemplo de seu uso.
Figura 4.5: Exemplo de aplicação da métrica Main Diagonal sobre um bloco 8x8, obtendo a diagonal principal
de cada sub-bloco 4x4.
50
5 O Software de Referência do H.264
A primeira implementação do padrão H.264/AVC é chamada Joint Model (JM) (JVT,
2011). Esta implementação de referência nasceu de versões do Test Model Long-Term desen-
volvido pelo MPEG em Agosto de 1999 (MORAES, 2010). Trocou de nome para JM quando
o VECG uniu esforços com o MPEG criando o JVT. Assim, a JM (JVT, 2011) é um software
de referência projetado pelo JVT, escrito em linguagem C. Neste software estão contidas todas
as funcionalidades citadas na Seção 2.3.
Para as primeiras análises, estre trabalho utilizou a versão 17.2 do software de referencia
(JVT, 2011). Porém durante o desenvolvimento do presente trabalho, uma nova atualização da
JM foi divulgada. Dessa forma, os estudos foram conduzidos utilizando-se a versão 18.0 da JM
(JVT, 2011).
5.1 Ambiente
Para as implementações em software das métricas estudadas, foi configurado o ambiente de
desenvolvimento Eclipse (2011) para gerenciar todo o projeto da JM (JVT, 2011). Criou-se um
projeto separado para cada versão de teste (uma versão para cada métrica proposta), e manteve-
se uma versão original para comparações. Para facilitar o uso dos arquivos de configuração da
JM, as métricas originais de cada versão de teste foram substituídas pelas métricas propostas.
5.1.1 Análise
No âmbito de melhor compreender a complexidade envolvida durante a estimação de movi-
mento, foi usado uma ferramenta de análise dinâmica (profiler tool), bastante usada que é o
Gprof (2007). O propósito da análise dinâmica é verificar os recursos utilizados por cada parte
do código, podendo assim otimizar tempo de execução e memória das partes críticas na exe-
cução. O Gprof (2007) é um projeto “GNU’s Not Unix!” (GNU), sob licença 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 flag -pg, liga-se (linkage)
tambémcom-pg. Então o programa deve ser executado, gerando durante a execução umarquivo
gmon.out. Após gerado, o Gprof é usado passando como parâmetro o programa a ser analisado
e como segundo parâmetro o arquivo gerado. O resultado pode ser redirecionado para um
arquivo. Por exemplo:
$gcc -pg -o program.exe file01.c file02.c ...
$./program.exe
$gprof program.exe gmon.out > out-file
O resultado de uma análise dinâmica da JM, configurada para utilizar apenas a SAD como
métrica de similaridade na estimação de movimento, fazendo teste exaustivo (“full-search”) é
apresentado na Tabela 5.1. A configuração da máquina usada para executar os experimentos
foi um Intel R Core
TM
2 Duo CPU T6500 @ 2.10GHz com 4GB de memória RAM, rodando
Ubuntu Linux 10.10 x86_64 2.6.35-28-generic.
Para tal teste o vídeo utilizado foi a sequência “Foreman”, a qual também será utilizada
nos experimentos com vídeo, detalhados no Capítulo 6. O único parâmetro modificado no
arquivo de configuração da JM (JVT, 2011) foi o método de busca, que passou do padrão
(fast fullsearch) para o fullsearch, que é a busca exaustiva. Os demais parâmetros utilizados
são os que vêm como exemplo junto com o download da JM. A saber, as informações mais
importantes cabem à resolução do arquivo, 176x144, o número de quadros a serem codificados,
cinco quadros, e a taxa de quadros, 30fps. Os valores da Tabela 5.1 estão de acordo com tais
configurações.
Tabela 5.1: Tabela com resultados da análise dinâmica da JM(JVT, 2011) para a sequência “Foreman”.
%
tempo
segundos
(cumula-
tivo)
segundos chamadas função
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 análise dinâmica mostram que o cálculo das métricas de similaridade para
a estimação de movimento são fator de grande impacto na execução da codificação de vídeo.
Muito disso se deve ao fato do uso do teste exaustivo, portanto mais experimentos devem ser
feitos para uma melhor análise do impacto das métricas de similaridade.
52
5.2 Arquivo de configuração
No software de referência do H.264/AVC (JVT, 2011) um arquivo de configuração é uti-
lizado para a configuração das suas diversas opções. Por exemplo, para a configuração da
métrica de distorção a ser a ser utilizada, o seguinte trecho do arquivo de configuração 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 parâmetros, é selecionado como métrica
de distorção a SAD. O primeiro parâmetro indica a métrica a ser utilizada para a ME de pixel
inteiro, e os seguintes são, respectivamente, de meio e quarto de pixel, como mostrado na Seção
2.3.3.
53
6 Resultados Experimentais
Com objetivo de avaliar primariamente o desempenho das métricas estudadas (descritas no
Capítulo 4) e, principalmente, de avaliar a qualidade do uso de tais métricas, são propostas
duas formas de avaliação. A primeira delas é uma avaliação simples para imagens estáticas,
utilizando apenas nove candidatos por bloco (4x4), mantendo assim um maior controle sobre a
execução da avaliação, e podendo demonstrar com as próprias imagens resultantes da escolha
de cada métrica a qualidade final obtida. Já para uma melhor adaptação ao contexto de com-
pressão de vídeo, também foi efetuada uma avaliação das métricas, quando utilizadas no padrão
H.264/AVC (Subseção 2.2.1 e Seção 2.3). Neste Capítulo serão descritos os resultados de tais
avaliações das métricas estudadas em software.
6.1 Imagens Estáticas
Devido à simplicidade de implementação de testes em software com imagens estáticas,
foi desenvolvida usando a linguagem Java uma aplicação para avaliar a qualidade de imagens
usando as métricas em estudo. Uma vez que não há outras otimizações do codificador de vídeo,
como por exemplo a Otimização Taxa-Distorção - Rate-Distortion Otimization - (RDO), a dis-
torção gerada deve-se apenas à escolha do bloco pela métrica avaliada.
Cada imagem analisada é dividida em blocos e para cada um destes são gerados, utilizando
os algoritmos de geração de blocos intra 4x4 (ver Subseção 2.3.4) do software de referência do
H.264/AVC (JVT, 2011), nove candidatos similares. Então, aplica-se cada uma das métricas
em estudo para avaliar o melhor casamento entre o bloco em questão e os nove candidatos
gerados. O melhor candidato gerado ocupará o lugar do candidato em questão, formando uma
nova imagem. Essa nova imagem será comparada com a sua original para cada métrica de
similaridade em estudo, em termos de resíduo, qualidade em SSIM e Relação Sinal-Ruído de
Pico - Peak signal-to-noise ratio - (PSNR).
Com o objetivo de não poluir o trabalho com excesso de gráficos e tabelas, foram seleciona-
dos apenas três 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 resolução (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 resolução de 512x512 pixels.
Todos os testes operaram sobre a amostra de luminância das imagens. O código fonte de gera-
ção das amostras, assim como a macro criada para testar a qualidade da imagem com a métrica
SSIM estão também 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 métrica de distorção. Observa-se que visivelmente não
há muitas diferenças nas imagens (remontadas). A grande semelhança se encontra nas partes
menos complexas da imagem (a), no caso o céu. Para esta imagem as maiores diferenças se
encontram nos contornos da casa, onde é mais perceptível a diferença entre as escolhas de cada
métrica. Vê-se claramente a perda ao se utilizarem amostras intra principalmente na parede da
casa, onde não é mais possível identificar os detalhes dos tijolos.
Tabela 6.1: Tabela de resultados para a Figura 6.1.
Métrica PSNR (dB) SSIM Resíduo (%)
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 número 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 resíduo(%) (Equação 6.1). Observa-se
que a melhor métrica, 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 três padrões
(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 são apresentados gráficos onde cada uma das
métricas está disposta lado a lado a fim de serem comparadas com as demais para SSIM, PSNR
e resíduo.
Na Figura 6.3 torna-se visível o fato das métricas Border, Cross e Checker Even terem re-
2
Ao se analisar apenas em software, sem contar a análise de tempo. Parte da implementação em software
levou em consideração a análise de tempo, mas a execução dos testes sofreu pela flutuação 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 métricas em estudo para o teste “4”.
sultados similares entre si e próximos ao valor da SAD. Ainda, há uma boa diferença entre os
valores de Checker Even e Checker Odd, mostrando que, mesmo para padrões bastante simi-
lares, pode-se deixar de lado partes importantes da imagem, não importando o padrão usado, ao
se utilizar a técnica de pel decimation.
Figura 6.4: PSNR de cada uma das métricas em estudo para o teste “4”.
Já a Figura 6.4 mostra que, com resultados de PSNR, o padrão Border chega muito próximo
à SAD e para os padrões 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 padrão faça 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 resíduo nos testes indica a quantidade de dados que restou da subtração da imagem ori-
ginal com a imagem reconstruída. Seu percentual foi calculado de acordo com a Equação 6.1.
Intuitivamente, observa-se que há uma grande correlação entre os resultados de resíduo e qua-
lidade (SSIM e PSNR) para a grande maioria dos casos
3
, de forma que quanto maior o resíduo,
menor a qualidade. Deve-se notar que, tanto pela qualidade quanto pela taxa de compressão, é
importante ter um valor baixo de resíduo
4
.
Figura 6.5: Resíduo de cada uma das métricas em estudo para o teste “4”.
A Figura 6.5 mostra o resíduo das métricas para o teste “4” e a Figura 6.6 mostra os resíduos
de cada métrica sobre o teste “4”. Nesta última, deve-se notar que onde se concentra o resíduo
a métrica em questão teve um resultado não muito bom. Isso pode ser devido à dois fatores:
baixo número de candidatos (nove para este teste) ou escolha de um candidato que não seja tão
similar ao que se está tentando comparar, ou seja, para estes casos a influência da métrica é
bastante importante.
A próxima imagem de teste (teste “11”) é conhecida por Lena, Figura 6.7, e é muito usada
na área de imagem digital. Sua resolução, 512x512, é o dobro da imagem cujos resultados
foram apresentados até aqui. Dessa forma, os pontos tendem a carregar menos informação. A
Tabela 6.2 mostra os resultados precisos de cada métrica para este teste. Novamente a SAD
obteve os melhores resultados, enquanto a DC obteve os piores. Pode-se notar também que os
resultados são próximos (em comportamento) com os resultados do teste “4”. Tal fato fica mais
claro ao se analisar os gráficos.
Na Figura 6.8 pode-se observar o comportamento da SSIM para a imagem Lena. Tais valo-
3
Mesmo não tendo apresentado até este ponto todos os resultados, os mesmos podem ser também observados
no Anexo A.
4
Nestes testes, uma vez que independem de vetores de movimento e outros valores que influenciam no bitrate
final em, por exemplo, um vídeo.
58
(a) Original
(Luma)
(b) Resíduo SAD (c) Resíduo DC
(d) Resíduo Main-
Diagonal
(e) Resíduo
Kernell-SAD
(f) Resíduo
Border-SAD
(g) Resíduo Cross-
SAD
(h) Resíduo
Kernell-SAD
(i) Resíduo
Border-SAD
Figura 6.6: Resíduos sobre o teste “4”.
Figura 6.7: Segunda imagem de teste, “teste 11” (Lena).
res têm comportamento um pouco diferente do teste “4”, sendo que dessa vez o pior resultado
não é mais da Kernell, mas sim da DC. A diferença entre os padrões Checker já não é mais
tão grande, sendo pouco perceptível no gráfico. Novamente, com exceção da SAD, o melhor
resultado é do padrão Border. Tal comportamento é observado também na Figura 6.9.
Os valores de PSNRtambém diferemum pouco dos resultados do teste “4”, onde se percebe
uma diferença maior entre Kernell e Main Diagonal. Também as diferenças entre as quatro
últimas colunas do gráfico da Figura 6.9 são menores que as diferenças presentes no gráfico da
Figura 6.4. Com a redução da diferença entre grande parte das métricas, destaca-se a diferença
da métrica DC, a qual mesmo utilizando todos os dados do bloco obteve os pior resultado. Outro
fato a se notar nos gráficos é que há uma grande proximidade entre os valores das métricas que
59
Tabela 6.2: Tabela de resultados para a Figura 6.7 (Lena).
Métrica PSNR (dB) SSIM Resíduo (%)
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 métricas em estudo para o teste “11”.
utilizam proporções de amostragem iguais. Tal fato é de causa conhecida, uma vez que ao se
amostrar menos valores a estimação fica menos precisa. Mas por outro lado, a forma como os
valores são utilizados também influi bastante, o que é bem visível ao se conhecer que a métrica
DC está utilizando todos os valores do bloco e tem piores resultados.
Sobre os resultados do resíduo da estimação (os quais podem ser observados na Figura
6.10), DC é a métrica de similaridade com maior resíduo, e novamente os padrões com resíduo
mais próximos à SAD são Border e Cross. Kernell e Main Diagonal, que utilizam apenas 25%
dos pixels dos blocos, resultando assim em estimações com menores resíduos do que DC, que
utiliza todo o bloco, reforçando o comentário em relação aos resultados de PSNR.
A Figura 6.11 mostra a imagem utilizada como teste “10”. Também é 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 são
muito interessantes, uma vez que grande parte da imagem contém grande complexidade (bem
60
Figura 6.9: PSNR de cada uma das métricas em estudo para o teste “11”.
Figura 6.10: Resíduo de cada uma das métricas em estudo para o teste “11”.
visível na pelagem do babuíno). Tal fato reflete em um maior resíduo e muito provavelmente
pior qualidade. Uma vez que a PSNR não é própria para comparações entre imagens diferentes
(como é comentado na Seção 6.2), pode-se apenas fazer uma análise comparativa entre os testes
através do percentual de resíduo de cada um destes e SSIM.
Figura 6.11: Segunda imagem de teste, “teste 10” (Baboon).
Sendo assim, como a SSIM também pode ser utilizada para comparações, percebe-se que
seus valores para o teste “10” (Figura 6.12) são 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).
Métrica PSNR (dB) SSIM Resíduo (%)
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 são 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” são entre ≈
0.65 e 0.75, tendo portanto menor qualidade. Apesar das diferenças, os melhores resultados se
mantém, e os piores variam mais. Comportamentalmente se aproximam mais os resultados dos
testes “10” e “11”, principalmente no que concerne às métricas com pior aproveitamento.
Figura 6.12: SSIM de cada uma das métricas 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 variação um pouco maior do que o teste “11”, e um pouco
menor do que no teste “4”.
Já o resíduo do teste Baboon é bastante maior que nos testes anteriores. Os dois primeiros
tinham resíduo de ≈ 4% em ambos, e para o teste “10” tal valor subiu para próximo de 11%,
ou seja, aumentou quase três vezes. Como já citado, isso se deve ao fato do aumento da com-
plexidade na imagem. A variação de resíduo entre as métricas também é maior, mas o compor-
tamento continua similar, apenas com uma diferença comportamental entre os padrões Checker
62
Figura 6.13: PSNR de cada uma das métricas em estudo para o teste “10”, Baboon.
entre os testes “10” e “4”, ou “11” e “4”.
Figura 6.14: Resíduo de cada uma das métricas em estudo para o teste “10”, Baboon.
6.2 Vídeo
Para a avaliação de qualidade em vídeo foi usado o software de referência do H.264/AVC
(JVT, 2011) (JM), modificado para utilizar as métricas em estudo. São comparados os valores
de bitrate, qualidade em SSIM e PSNR. O software de referência 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 Capítulo 5, bem como o ambiente de desenvolvimento
usado para alterações no código da mesma. Embora tenha baixo desempenho, por ser referência,
seu código busca implementar à risca o padrão. Os fontes modificados do software de referência
encontram-se no Anexo B.5.
63
Para os testes com vídeos, foram selecionados vídeos que correspondem à um mix de re-
solução e qualidade, também utilizados por Moraes (2010). Os vídeos utilizados foram obtidos
no repositório da Xiph.org (2011), tendo sido selecionado um quadro por vídeo, os quais são
mostrados na Figura 6.15.
Figura 6.15: Vídeos de teste utilizados para avaliação de qualidade em vídeo das métricas de similaridade
estudadas. Fonte: (XIPH.ORG, 2011)
Como visto na Seção 5.2 , o software de referência é configurado através de um arquivo.
Para os testes executados, optou-se por utilizar um arquivo de configuração para cada modo
de busca
5
, e todos eles com métricas de distorção com SAD selecionada. Esta decisão se
deve ao fato de não criar muitas modificações no código, procurando escapar de referências não
encontradas. Cada uma das métricas então é uma modificação na função computeSAD
6
. Assim,
não é necessário encontrar todos os pontos do código onde a função é chamada, nem mesmo
modificar a inicialização do software de referência para que este tenha o novo ponteiro de cada
função para o cálculo da distorção. Então cada métrica é implementada em um novo ambiente,
e a escolha da métrica é em tempo de programação. Outras possibilidades poderiam ser em
tempo de compilação ou mesmo em tempo de execução (usando o arquivo de configuração), e
está previsto como trabalho futuro (Capítulo 8). As demais configurações selecionadas podem
ser conferidas no Anexo B.6.
5
Modos de busca podem ser, de acordo com o arquivo de configuração: Full Search, Fast Full Search (default),
UMHexagon Search, Simplified UMHexagon Search e Enhanced Predictive Zonal Search (EPZS); sendo que para
os testes foi deixada de lado a busca Simplified UMHexagon Search.
6
Encontra-se no arquivo “me_distortion.c”.
64
Os testes de vídeo foram extensivos e a execução destes ocorreu sob as seguintes
7
configu-
rações:
• Dual Intel R Xeon R CPU E5620 12288 KB Cache @ 2.40GHz com 12GB de memória
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 memória RAM,
rodando Linux 2.6.38-11-generic #50-Ubuntu SMP:
– DC e Border;
Devido ao alto tempo de processamento de cada vídeo
8
, limitou-se à 25 o número de
quadros a serem codificados por amostra. Dessa forma, cada cena de curta duração tem al-
gumas características a serem notadas:
• Big Buck Bunny - Cena de fade-in e computação gráfica.
• Ducks Take Off - Alta complexidade, com movimentação de água não transparente (ondas
em uma lagoa).
• Foreman - Baixa resolução e pouco movimento.
• In to Tree - Cena de zoom, com árvores (alta complexidade para manter a naturalidade
das folhas).
• Park Joy - Alta movimentação, folhas e água. Elementos próximos (troncos logo em
frente à câmera) e elementos distantes (outras árvores).
• Riverbed - Ondas em água transparente, bastante complexo e texturas das pedras no fundo
do rio.
• Soccer - Baixa resolução, um pouco mais movimentado do que Foreman, mas com mais
elementos.
• Sunflower - Bastante detalhado, alguma movimentação, mas com pouca variação de ilu-
minação e cores.
7
Os testes foram feitos paralelamente em dois computadores para acelerar a obtenção dos resultados, mas as
diferentes configurações não influenciam os resultados de qualidade.
8
Aproximadamente 30 minutos por quadro para um vídeo 1080p.
65
Os gráficos foram gerados a partir dos dados coletados da saída de estatísticas do codifi-
cador de referência (JVT, 2011) do padrão H.264/AVC. Os valores foram amostrados para as
métricas de similaridade apresentadas, algoritmos de busca disponíveis no codificador e vídeos
de teste. Cada um dos gráficos apresenta para um vídeo os valores de custo em Kbytes (R) por
dB (D), contra os algoritmos de busca, para cada métrica. Tal abordagem (R/D) foi adotada
para que haja uma noção de Taxa-Distorção - Rate-Distortion - (RD), e também por não existir
meios de controlar o codificador de referência(JVT, 2011) para adotar determinada taxa.
Figura 6.16: As duas imagens possuem o mesmo PSNR, mas o ruído está distribuído em regiões diferentes.
Fonte: (WINKLER, 2005).
A métrica de distorção utilizada para a comparação foi a PSNR. Tal métrica é utilizada
comumente para medir a diferença entre os quadros fontes e os quadros codificados em uma
sequência de vídeo. É bastante conhecido o problema da PSNR quando se trata de correlacionar
tal erro (diferença) com a percepção 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 sequências de vídeo diferentes, o PSNR
tem pouco valor. Por outro lado, duas medidas de PSNR para uma mesma sequência demonstra
muito bem o potencial de dois codificadores
9
(LARBIER, 2011).
Os gráficos das Figuras 6.17 até 6.24 demonstram os resultados alcançados com cada
métrica em cada algoritmo de busca, para os vídeos 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-
bém o melhor no algoritmo fastfullsearch. Para este último, os padrões Checker Even e Border
e SAD tem resultados bastante próximos, e inclusive, melhores do que os demais resultados em
fullsearch. Os demais padrões 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 codificador é o mesmo, mas as métricas são diferentes, sendo válido utilizar o PSNR para compara-
ção e demonstração dos resultados.
66
Figura 6.17: Resultados da sequência de teste “Foreman” para as métricas utilizadas no codificador (JVT, 2011).
Figura 6.18: Resultados da sequência de teste “Soccer” para as métricas utilizadas no codificador (JVT, 2011).
67
No gráfico da Figura 6.18 o resultado foi mais próximo ao esperado, sendo que os melhores
resultados foram no algoritmo de fullsearch. Mas no algoritmo fastfullsearch, o melhor ganho
não foi da SAD como esperado, mas sim do padrão Border. No algoritmo epzs o padrão Cross
teve resultado melhor do que os padrões Checker.
Figura 6.19: Resultados da sequência de teste “Sunflower” para as métricas utilizadas no codificador (JVT,
2011).
Também no gráfico 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 também que para o algoritmo fastfullsearch o comportamento do padrão Border
deixou de ser melhor que a SAD (no caso do fullsearch) e, excetuando o padrão Main Di-
agonal, teve os piores resultados. No algoritmo epzs, o resultado de Checker Odd foi muito
próximo 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
padrão Checker Even, bastante próximo 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 gráficos pode ser percebido: no algoritmo fullsearch a
métrica DC obteve o melhor custo R sobre a distorção. Seguido por Kernell, o qual também
68
Figura 6.20: Resultados da sequência de teste “Ducks Take Off ” para as métricas utilizadas no codificador (JVT,
2011).
teve bons resultados para o algoritmo uhmhexagonsearch. Já neste último algoritmo DC e
Border obtiveram os piores resultados.
Também no gráfico da Figura 6.21 os resultados de fullsearch não 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 métrica DC teve os melhores resultados para o fullsearch, em conjunto
com Border, e nos demais algoritmos também teve bons resultados, sendo praticamente igual
ao resultado de Main Diagonal para fastfullsearch e muito próximo à SAD no algoritmo epzs.
É interessante notar tal comportamento da métrica 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 quão
próximos foram os resultados de Main Diagonal, Kernell e DC nos algoritmos fullsearch e epzs.
Em todos os algoritmos os melhores resultados foram da métrica SAD, seguidos pela métrica
Border, a qual utiliza mais informação do bloco.
Na Figura 6.23, os resultados foram quase todos muito próximos, o que é interessante para
69
Figura 6.21: Resultados da sequência de teste “In to the Tree” para as métricas utilizadas no codificador (JVT,
2011).
Figura 6.22: Resultados da sequência de teste “Park Joy” para as métricas utilizadas no codificador (JVT, 2011).
70
Figura 6.23: Resultados da sequência de teste “Big Buck Bunny” para as métricas utilizadas no codificador (JVT,
2011).
ser analisado. Uma vez que a cena codificada era um "fade-in", havia pouca diferença entre os
blocos em um mesmo quadro, e entre os quadros também a variação era pouca. Além disso,
o padrão H.264/AVC prevê predição com peso, adequada exatamente para tais casos. E como
a cena não tinha muito movimento, a predição pôde ser bastante localizada, existindo assim
pouca diferença no acerto dos padrões. Também pelo fato de existir pouca informação (a maior
parte da cena era escura), métricas como a Main Diagonal (que utiliza apenas 25% dos pixels
do bloco) tiveram precisão bastante próxima às demais.
No caso da Figura 6.24, também o resultado foi bem próximo do esperado, apenas no
algoritmo fullsearch o melhor resultado foi do padrão Checker Odd. Fora estes caso, SAD
obteve os melhores resultados para cada algoritmo de busca. Também a diferença dos resultados
do algoritmo umhexagonsearch não é mais tão grande como nas demais Figuras.
Percebe-se, entre as Figuras 6.18 e 6.17, certa afinidade entre as buscas fullsearch e umhexagon-
search. Tais arquivos de testes tem similaridade em relação à resolução (ambos de baixa reso-
lução). Muito possivelmente, a diferença perceptível entre os algoritmos fastfullsearch e epzs
são devidos à maior movimentação da cena para o arquivo de teste "Soccer".
71
Figura 6.24: Resultados da sequência de teste “Riverbed” para as métricas utilizadas no codificador (JVT, 2011).
6.3 Conlusão Sobre os Resultados Experimentais
Resumidamente, a respeito dos resultados experimentais sobre imagem e vídeo, pode-se
afirmar que:
• Para imagemestática os padrões de subamostragemcommelhores resultados foramCross
e Border;
• O melhor padrão de subamostragem a ser utilizado depende do conteúdo do vídeo e do
algoritmo de busca utilizado;
• O padrão de subamostragem usado atualmente (Checker) para pel decimation não é sem-
pre o melhor;
• Até mesmo o uso do bloco completo não resulta necessariamente na melhor escolha;
• Cenas com pouca informação não perdem qualidade com o uso de subamostragem.
72
7 Estimativa de custos de Hardware
Este Capítulo destina-se à uma rápida análise sobre a literatura no que concerne às arquite-
turas para o cálculo da SAD para a estimação de movimento, visando o padrão H.264/AVC.
Também são estimados os custos de uma arquitetura totalmente paralela para o cálculo das
métricas emestudo, utilizando os resultados de síntese lógica apresentados por Monteiro (2011).
As arquiteturas existentes na literatura são várias, e neste trabalho o foco é a eficiência
energética das mesmas. Em (CHEN et al., 2006) é apresentada uma arquitetura de um co-
dificador H.264/AVC para resolução 720p. Nesta proposta, apenas o cálculo da SAD ocupa
aproximadamente 33% do total de portas (gate-count). Outro exemplo de implementação com
grande número de portas para o cálculo da SAD é apresentado por Liu et al. (2007), onde tal
número corresponde a cerca de 79% do total do codificador. Vê-se aí a importância de imple-
mentações de métricas de similaridade com baixo consumo energético. Infelizmente, alguns
trabalhos com propostas diferenciadas para a SAD, como o proposto no artigo sobre o codifi-
cador 720p (CHEN et al., 2006) e também em (VANNE et al., 2006) e (YUFEI; XIUBO; QIN,
2007) apenas otimizam quanto à área e atraso crítico, mas deixam de lado aspectos de potência
e eficiência energética.
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 então sin-
tetizadas logicamente com a ferramenta Design Compiler
1
da Synopsys (2011). No processo
de síntese lógica foi utilizada a biblioteca de células 45nm da Taiwan Semiconductor Manu-
facturing Company Limited (TSMC). Os resultados para atraso crítico, potência e área foram
reportados pelo Design Compiler no modo chamado Topographical que, segundo os manuais
de seu desenvolvedor (SYNOPSYS, 2011), utiliza os dados da simulação elétrica das células
ao sintetizar e reportar os dados de um projeto, levando em conta informações de roteamento e
posicionamento.
A partir de tais resultados, percebeu-se que, para dados de até 12 bits (máximo alcançável
1
O qual é uma ferramenta comercial amplamente utilizada no fluxo Standard-Cells.
73
pela SAD), os somadores CRA e CLA são os com melhor trade-off de velocidade e potência.
Dentre estes, o CLA possui menor atraso crítico. Por outro lado, o CRA tem menor consumo de
potência. Nas próximas Seções são estimados os custos para cada uma das métricas utilizando
os resultados de Monteiro (2011) considerando estes dois somadores. Como Monteiro (2011)
faz a síntese para estes somadores de 2 até 8 bits e como serão necessários somadores de até 11
bits, os demais valores (de 9 até 11 bits) foram calculados através de uma regressão não-linear
dos dados existentes. Tal regressão foi obtida através do software LABFit (2011), o qual busca
o menor erro em sua base de aproximadamente 280 funções. Assim, para cada conjunto de
valores de área, atraso e potência, e para cada somador (CLA e CRA), foi buscada a melhor
função de ajuste nos dados existentes. Destas funções foram calculados os demais valores,
buscando minimizar os erros da estimativa.
7.1 SAD
Propõe-se aqui a utilização de um bloco operativo (datapath) totalmente paralelo para o
cálculo da SAD. Na Figura 7.1 há o projeto de um bloco básico de soma de diferenças abso-
lutas, nominado EP
2
. Este processa paralelamente 2 pixels de cada bloco da imagem (bloco
original e bloco referência). Na Figura 7.2 mostra-se um bloco operativo totalmente paralelo
para o cálculo 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 são necessários 128
bits para cada bloco 4x4 de pixel. A abordagem com tal paralelismo mostrou ser bastante efi-
ciente energeticamente por Walter, Diniz e Bampi (2011), no qual os melhores resultados são
da abordagem com 16 entradas e 1 estágio de pipeline apenas.
Para a realização do bloco operativo de SAD da Figura 7.2, são necessários 16 subtratores,
16 extratores de valor absoluto, e 15 somadores. O caminho crítico pode ser aproximado pela
passagem por um subtrator, um extrator de valor absoluto e quatro somadores. Transformando
tais fatos em funções do tamanho da entrada “n”
3
temos as seguintes Equações aproximadas de
potência e de atraso crítico:
potencia
SAD
(n) = n∗ potencia
subtrator
+n∗ potencia
abs
+(n−1) ∗ potencia
somador
(7.1)
2
Elemento de Processamento.
3
Pixels de um bloco. E considerando n como potência de 2. No caso de um bloco 4x4 são 16 entradas.
74
Figura 7.1: Esquema geral bloco responsável pelas subtrações 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
n∗atraso
somador
(7.2)
Ao se levar em consideração que a cada nível de soma há o crescimento das entradas dos
somadores do próximo nível em um bit, a Equação 7.1 pode ser refinada, conduzindo a Equação
7.3. Uma vez que só há resultados de síntese lógica para somadores, parte-se para uma apro-
ximação dos valores de consumo para os demais blocos necessários, ou seja, subtração e valor
75
Figura 7.3: Possível mapeamento do bloco candidato e referência (A e B) para as entradas do cálculo da SAD.
absoluto. Aproxima-se aqui o subtrator ao somador, deixando de lado a potência gerada pelo
número 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 potência podem ser calculados de acordo
com a Equação simplificada 7.4.
potencia
SAD
(n) = n∗ potencia
subtrator
+n∗ potencia
abs
+
log
2
n−1

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

i=0
(2
i
potencia
somador(7+log
2
n−i)
) +erro (7.4)
Também o atraso crítico deve levar em consideração o crescimento do número de bits na
cadeia de somas e a substituição dos valores de atraso dos subtratores e extratores de valor
absoluto por somadores. Logo a Equação 7.2 pode ser descrita nessa forma através da Equação
7.5.
atraso
SAD
(n) = 3∗atraso
somador(8))
+
log
2
n−2

i=0
atraso
somador(9+i)
+erro (7.5)
A partir das equações 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 crítico estimado é de ≈ 2045,37 ps e sua potência total estimada é de ≈ 1755,5
µW para o somador CLA. Para o somador CRA os valores são de ≈2513,45 ps e de ≈1129,99
4
Sendo uma estimativa, deixou-se de lado a parcela “erro” das Equações 7.4 e 7.5. Este erro na estimativa surge
ao se considerar que as implementações de somadores, subtratores e extratores de módulo terão, para um mesmo
número de bits, os mesmos valores de potência e atraso. Também há certo erro da interpolação, uma vez que os
dados interpolados podem não ter na realidade a tendência apresentada pelos dados que foram obtidos através de
simulação.
76
µW.
7.2 Pel Decimation 2:1
Todos os padrões que utilizam 50% de informações do bloco são padrões de amostragem
do algoritmo de pel decimation 2:1. Dentre as métricas em estudo, as que fazem parte deste
conjunto são a Cross e Checker
5
. Uma vez que neste trabalho o estudo dos padrões está dirigido
sobre a SAD, o projeto proposto na Seção 7.1 é válido 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 memórias, deveria ser considerado uma variação na emissão
de endereços ou no carregamento de memórias intermediárias.
Todavia, para esta abordagem mais simplista é considerado apenas o bloco operativo e, ao
utilizar apenas esta quantidade da informação do bloco (de pixels), pode ser feita uma análise
também da redução do atraso crítico e consumo, podendo utilizar as equações 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 crítico
estimado do circuito totalmente paralelo é de ≈ 1654,49 ps e sua potência é ≈ 845,9 µW. Já
utilizando para a estimativa o somador CRA, os valores de atraso e potência são de ≈ 2087,02
ps e ≈ 549,14 µW, respectivamente.
7.3 Pel Decimation 4:1
Assim como nos padrões de pel decimation 2:1, os padrões de pel decimation 4:1
6
também
podem utilizar da mesma arquitetura paralela da Figura 7.2. Utilizando apenas 25% da infor-
mação do bloco, pode-se estimar atraso e consumo também pelas equações 7.5 e 7.4, sendo n
igual a 4. Portanto, a estimativa para atraso é de ≈ 1288,90 ps e a estimativa de potência é 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 potência e atraso
são ≈ 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 crítico é o mesmo da SAD completa, assim seu
5
Odd e Even.
6
a saber: Kernell e Main Diagonal.
77
atraso crítico é o mesmo. Já o número de somadores necessários será reduzido, reduzindo assim
também sua potência.
7.5 Comparação
Figura 7.4: Comparativo dos atrasos estimados para as métricas com os somadores CLA e CRA.
No gráfico presente na Figura 7.4 são comparados os valores de atraso crítico para cada
uma das quatro propostas: SAD completa, Border, Pel Decimation 2:1 e Pel Decimation 4:1.
As estimativas de potência apresentadas primeiramente no gráfico da Figura 7.5 são as já apre-
sentadas nas Seções específicas de cada métrica, assim como os valores de atraso crítico do
gráfico na Figura 7.4.
Figura 7.5: Comparativo do consumo de potência para as métricas com os somadores CLA e CRA.
78
Os valores de área, apresentados primeiramente na forma de gráfico(Figura 7.6) foram
derivados através da Equação 7.4, substituindo os valores de consumo dos somadores pelos
respectivos valores de área.
Figura 7.6: Comparativo dos custos de área para as métricas com os somadores CLA e CRA.
A Tabela 7.1 mostra os valores comparativos das estimativas de atraso crítico, potência e
área para cada uma das métricas e cada um dos somadores utilizados para estimativa. Também
é incluído na tabela o valor do Produto Atraso-Potência - Power-Delay Product - (PDP) para
uma estimativa de eficiência energética das métricas. Tal valor é a multiplicação do atraso pelo
consumo de potência do circuito, e assim como esta, varia conforme a atividade de chavea-
mento do circuito. Assim, seus valores estão de acordo com os experimentos realizados em
(MONTEIRO, 2011).
Tabela 7.1: Tabela comparativa das métricas estudadas, estimadas com somadores CLA e CRA. Valores estima-
dos a partir de (MONTEIRO, 2011).
Métrica Atraso Crítico (ps) Potência (µ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 versão de métrica de custo feita com somadores CLA são
os mais rápidos, e que o decréscimo do uso de valores do bloco de pixels não muda muito tal
valor, assim como no caso do CRA. O atraso crítico da implementação com CRAs são ≈ 1,24x
79
vezes maior que o da implementação com CLAs. Já no caso da potência, o CRA obtém os
melhores resultados (também em área e eficiência energética). E o decréscimo do uso de pixels
do bloco resulta em grande redução de potência, também em ambas as implementações com os
dois somadores. As implementações com o CLA apresentam ≈ 1,54x mais potência 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 gráfico da Figura 7.7 os valores de PDP são mostrados, de acordo com a Tabela 7.1.
As diferenças de PDP vão decrescendo entre as implementações conforme diminui o padrão de
amostragem. Sendo que a implementação com CRA é ≈ 1,22x mais eficiente energeticamente
que a implementaçao com CLA. Percebe-se que o padrão mais eficiente é o da pel decimation
4:1, como era esperado, afinal utiliza apenas 25% da informação 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 Seção
4.4. Ou seja, utilizar cálculos parciais de alguma das métricas, e depois somar os resultados.
Em questão de hardware então, utilizariam alguns somadores a mais, com maiores larguras
de bits. Há também na literatura propostas de aproveitar o cálculo de SADs parciais para as
possibilidades de Tamanho de Bloco Variável - Variable Block Size - (VBS), o que é previsto
no padrão H.264/AVC. Assim pode-se acelerar o processo da ME.
80
7.7 DC
A métrica DC utiliza o mesmo número de coeficientes da SAD, com a vantagem de extrair
módulo apenas uma vez. Outra vantagem é que cada um dos elementos da matriz é sempre
somado um ao outro, não necessitando por exemplo utilizar complemento de dois na entrada de
um somador para obter a subtração. Uma nova estratégia de ME pode ser definida a partir da
ideia de função hash. Considerando a DC função hash de cada bloco, cada qual será mapeado
em um valor, o que pode ser feito poucas vezes no processo de ME, ao contrário do modo usual,
que é calcular a cada bloco (afinal é necessário fazer isso, pois é encontrada a diferença 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 posição de cada pixel é deixada de lado, acumulando apenas
sua “energia”. Mas o processo pode se tornar mais rápido e mais eficiente. Tal abordagem
(cálculo de função hash para cada bloco) faz parte dos trabalhos futuros.
81
8 Conclusões e trabalhos futuros
Neste trabalho foram apresentados conceitos básicos de codificação de vídeo digital, com
ênfase em alguns aspectos do padrão H.264/AVC. Foram apresentadas métricas de similaridade,
para comparação de imagens. A métrica SAD foi explorada através de amostragens (algoritmo
conhecido na literatura como pel decimation) e foram expostos padrões para a amostragem de
pontos em um bloco de pixels da entrada desta.
Tais padrões e também uma nova proposta de métrica (DC) foram testadas para saber o
impacto das mesmas, principalmente em questão de qualidade, uma vez que grande parte delas
têm boas perspectivas de implementação em hardware. Tais perspectivas e alguns ganhos foram
descritos de forma aproximada com resultados de Monteiro (2011) para hardware.
A partir da compilação de resultados apresentados neste trabalho viu-se que a melhor forma
de fazer subamostragem (para o algoritmo de pel decimation) nos blocos 4x4 não é necessaria-
mente a atualmente utilizada (Checker), sendo que modificações nos padrões de subamostragem
geram diferentes resultados, podendo ser melhores ou piores do que o utilizado, dependendo do
caso. Tornou-se claro também que há uma variação grande nos resultados, de acordo com a
complexidade do vídeo, o que abre a possibilidade de melhorias neste sentido. Infelizmente,
tais abordagens são bastante custosas, por exemplo, para a identificação prévia de parte da
complexidade para a busca se adequar ao conteúdo. Em um vídeo com pouca complexidade, no
caso a cena de “fade-in” do teste Big Buck Bunny, a qualidade não sofreu com o uso de menos
informação 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 são bastante pequenas. De acordo com o padrão a ser utilizado e com
a complexidade do vídeo a ser codificado, os resultados podem ser inclusive melhores do que
com a SAD. Também pôde 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 métricas nem
sempre refletem as melhores escolhas futuras de RD, algoritmos mais rápidos, com menor área
de busca, atingem resultados melhores.
82
Também neste trabalho abriu-se um leque de trabalhos futuros, os quais podem ser explo-
rados, como por exemplo os seguintes:
• Incluir as novas métricas como possíveis de serem selecionadas em tempo de execução
(através do arquivo de configuração) no software de referência do padrão H.264/AVC
(JVT, 2011);
• Testar padrões de amostragem para o algoritmo de pel decimation em blocos com ta-
manhos diferentes de 4x4 (usando a definição exata do padrão, diminuindo assim mais
ainda a complexidade do cálculo). Com tal estudo pode-se determinar com mais clareza
o impacto da subamostragem nas entradas das métricas de decisão;
• Testar os mesmos padrões apresentados neste trabalho utilizando outras métricas diferen-
tes da SAD, como por exemplo a SSD;
• Verificar a possibilidade de fazer ME utilizando funções hash para cada bloco, econo-
mizando em muito operações aritméticas. Analisar o impacto da qualidade da predição e
o custo-benefício de tal abordagem;
• Implementar tal subamostragem e os variados padrões no codificador x264 (MERRITT
et al., 2004), o qual é muito mais rápido que o software de referência (JVT, 2011), possi-
bilitando testes mais longos e permitindo uma análise mais apurada de curvas de RD;
• Implementação em hardware dos padrões de pel decimation.
83
Referências Bibliográficas
AHMED, N.; NATARAJAN, T.; RAO, K. R. Discrete cosine transform. IEEE Transactions on
Computers, C-23, n. 1, p. 90–93, jan 1974. ISSN 0018-9340.
BENNETT, H. Hugh’s News. 2011. Disponível em: <http://www.hughsnews.ca/faqs-
/authoritative-blu-ray-disc-bd-faq/4-physical-logical-and-application-specifications4.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. Disponível
em: <http://www.eclipse.org/>.
GPROF. GNU Binutils. 2007. Disponível 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 Astrônomo:
O que medimos, como medimos e o que aprendemos. 2002. Disponível em: <http://www-
.telescopiosnaescola.pro.br/ferramentas.pdf>.
JVT. JM JOINT VIDEO TEAM Reference Software. 2011. Disponível em: <http://iphome.hhi-
.de/suehring/tml/>.
KUHN, P. M. Fast mpeg-4 motion estimation: Processor based and flexible vlsi
implementations. The Journal of VLSI Signal Processing, Springer Netherlands, v. 23, p.
67–92, 1999. ISSN 0922-5773. 10.1023/A:1008192719838. Disponível em: <http://dx.doi-
.org/10.1023/A:1008192719838>.
LABFIT. LAB Fit Curve Fitting Software. 2011. Disponível em: <http://zeus.df.ufcg.edu.br-
/labfit/>.
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. Disponível em:
<http://extranet.ateme.com/download.php?file=1114>.
LEE, K. et al. QME: an efficient 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– 305–8 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. 675–680. ISBN 978-1-4244-1222-8.
MANOEL, E. T. M. Codificação de Vídeo H.264 - Estudo de Codificação Mista de
Macroblocos. Dissertação (Monografia) — UFSC, 2007.
MANZATO, M. G. Técnicas e Padrões de Codificação de Vídeo. Dissertação (Trabalho de
Conclusão de Curso) — UEL, 2004.
MATHEWS, N. M.; MUSSER, C.; ART, W. C. M. of. Moving pictures: American art and
early film, 1880-1910. [S.l.]: Hudson Hills, 2005. ISBN 9781555952280.
MERRITT, L. et al. Projeto x264. 2004. Disponível em: <http://developers.videolan.org/x264-
.html>.
MONTEIRO, J. L. Hierarchical Add-One Carry-Select Adder: Um Somador Select-Adder com
Cadeia de Carry Logarítmica. Dissertação (Trabalho de Conclusão de Curso) — UFSC, 2011.
MORAES, B. G. de. Uma métrica para Taxa de Distorção voltada à codificação de vídeo
perceptiva. Dissertação (Trabalho de Conclusão 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. Investigação de Algoritmos e Desenvolvimento Arquitetural para Estimação de
Movimento em Compressão de Vídeo Digital. Dissertação (Trabalho de Conclusão 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. Disponível em:
<http://www.random.org/>.
READER, C. Video Coding IPR Issues. 2002. Disponível 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. Synopsys’s Design Compiler User Guide, Version C-2009.06. 2011.
TAYLOR, J. DVD Frequently Asked Questions (and Answers). 2011. Disponível em:
<http://www.dvddemystified.com/dvdfaq.html3.4.1>.
85
TAYLOR, J.; JOHNSON, M. R.; CRAWFORD, C. G. DVD demystified. [S.l.]: McGraw-Hill
Professional, 2006. ISBN 9780071423960.
THE USC SIPI Image Database. 1977. Disponível 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.
876–883, 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. 1–4. 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. Disponível 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. 535–541, may 2007. ISSN
0098-3063.
86
ANEXO A -- Resultados da avaliação em software
das métricas 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 estática em software.
As imagens mostradas na Figura A.1 mostram as imagens utilizadas para os testes em
software de imagens estáticas. As imagens são todas conhecidas da área de imagem digital,
87
e foram obtidas em (THE. . . , 1977). Os resultados dos testes estão mostrados nas próximas
Seções deste Anexo.
A.2 Resumo dos Resultados
Nesta Seção 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.
Também é apresentado o percentual de resíduo mantido em cada imagem após a escolha dos
blocos substitutos, de acordo com a Equação 6.1.
Tabela A.1: Tabela de resultados para a figura A.1 (a).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (b).
Métrica PSNR (dB) SSIM Resíduo (%)
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 gráficos são melhor detalhados na seção 6.1.
88
Tabela A.3: Tabela de resultados para a figura A.1 (c).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (d).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (e).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (f).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (g).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (h).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (i).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (j).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (k).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (l).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (m).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (n).
Métrica PSNR (dB) SSIM Resíduo (%)
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 figura A.1 (o).
Métrica PSNR (dB) SSIM Resíduo (%)
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 gráficos nesta seção correspondem aos valores amostrados de SSIM para cada imagem
de teste, apresentados na seção anterior.
Figura A.2: SSIM de cada uma das métricas em estudo para o teste “0”.
Figura A.3: SSIM de cada uma das métricas em estudo para o teste “1”.
94
Figura A.4: SSIM de cada uma das métricas em estudo para o teste “2”.
Figura A.5: SSIM de cada uma das métricas em estudo para o teste “3”.
95
Figura A.6: SSIM de cada uma das métricas em estudo para o teste “4”.
Figura A.7: SSIM de cada uma das métricas em estudo para o teste “5”.
96
Figura A.8: SSIM de cada uma das métricas em estudo para o teste “6”.
Figura A.9: SSIM de cada uma das métricas em estudo para o teste “7”.
97
Figura A.10: SSIM de cada uma das métricas em estudo para o teste “8”.
Figura A.11: SSIM de cada uma das métricas em estudo para o teste “9”.
98
Figura A.12: SSIM de cada uma das métricas em estudo para o teste “10”.
Figura A.13: SSIM de cada uma das métricas em estudo para o teste “11”.
99
Figura A.14: SSIM de cada uma das métricas em estudo para o teste “12”.
Figura A.15: SSIM de cada uma das métricas em estudo para o teste “13”.
100
Figura A.16: SSIM de cada uma das métricas em estudo para o teste “14”.
101
A.4 PSNR
Os gráficos nesta seção correspondem aos valores amostrados de PSNR para cada imagem
de teste, apresentados na seção anterior.
Figura A.17: PSNR de cada uma das métricas em estudo para o teste “0”.
Figura A.18: PSNR de cada uma das métricas em estudo para o teste “1”.
102
Figura A.19: PSNR de cada uma das métricas em estudo para o teste “2”.
Figura A.20: PSNR de cada uma das métricas em estudo para o teste “3”.
103
Figura A.21: PSNR de cada uma das métricas em estudo para o teste “4”.
Figura A.22: PSNR de cada uma das métricas em estudo para o teste “5”.
104
Figura A.23: PSNR de cada uma das métricas em estudo para o teste “6”.
Figura A.24: PSNR de cada uma das métricas em estudo para o teste “7”.
105
Figura A.25: PSNR de cada uma das métricas em estudo para o teste “8”.
Figura A.26: PSNR de cada uma das métricas em estudo para o teste “9”.
106
Figura A.27: PSNR de cada uma das métricas em estudo para o teste “10”.
Figura A.28: PSNR de cada uma das métricas em estudo para o teste “11”.
107
Figura A.29: PSNR de cada uma das métricas em estudo para o teste “12”.
Figura A.30: PSNR de cada uma das métricas em estudo para o teste “13”.
108
Figura A.31: PSNR de cada uma das métricas em estudo para o teste “14”.
109
A.5 Resíduo
Os gráficos nesta seção correspondem aos valores amostrados de resíduo para cada imagem
de teste, de acordo com a equação 6.1.
Figura A.32: Resíduo de cada uma das métricas em estudo para o teste “0”.
Figura A.33: Resíduo de cada uma das métricas em estudo para o teste “1”.
110
Figura A.34: Resíduo de cada uma das métricas em estudo para o teste “2”.
Figura A.35: Resíduo de cada uma das métricas em estudo para o teste “3”.
111
Figura A.36: Resíduo de cada uma das métricas em estudo para o teste “4”.
Figura A.37: Resíduo de cada uma das métricas em estudo para o teste “5”.
112
Figura A.38: Resíduo de cada uma das métricas em estudo para o teste “6”.
Figura A.39: Resíduo de cada uma das métricas em estudo para o teste “7”.
113
Figura A.40: Resíduo de cada uma das métricas em estudo para o teste “8”.
Figura A.41: Resíduo de cada uma das métricas em estudo para o teste “9”.
114
Figura A.42: Resíduo de cada uma das métricas em estudo para o teste “10”.
Figura A.43: Resíduo de cada uma das métricas em estudo para o teste “11”.
115
Figura A.44: Resíduo de cada uma das métricas em estudo para o teste “12”.
Figura A.45: Resíduo de cada uma das métricas em estudo para o teste “13”.
116
Figura A.46: Resíduo de cada uma das métricas em estudo para o teste “14”.
117
ANEXO B -- Código fonte do teste em software
B.1 Aplicação Java - Imagens Estáticas
Devido à grande quantidade de código, a organização do mesmo se dará por pacotes, e
dentro de cada pacote as classes. A classe com o método “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 - Avaliação 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 Verificação da implementação 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 estatísticas e Geração de Gráficos 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 Modificações na JM
B.5.1 SAD
A métrica SAD já possui implementação 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 configuração utilizado
As linhas que seguem mostram a configuração utilizada nos testes em software utilizado-se
o software de referência do padrão H.264/AVC (JVT, 2011). Deve-se notar que conforme expli-
cado na seção 5.2, cada modo de busca terá um arquivo de configuração diferente no parâmetro
SearchMode, de acordo com o modo de busca selecionado. Também existirão diferenças de
acordo com a amostra de vídeo a ser codificada
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 à seção #Files do arquivo de configuração. À 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 obrigatório
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 Estat´ıstica (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 efficient
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 codificador de v´ıdeo digital. A subamostragem de pixels
(pel decimation) ´ e largamente utilizada e propicia implementac¸ ˜ oes em hard-
ware eficientes 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 v´ıdeo 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 eficiˆ encia en-
erg´ etica, a fim 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 codificac¸ ˜ ao conhecida como Estimac¸ ˜ ao
de Movimento (ME), que ´ e um passo fundamental nos compressores de v´ıdeo. 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 Diferenc¸as 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 poss´ıvel 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 identificar 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-
nificativas 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
poss´ıveis 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) Comec¸a 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) Comec¸a 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 poss´ıvel 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 espec´ıficos 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 espec´ıficas 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 pass´ıveis de serem implementados como
trabalhos futuros).
A sa´ıda 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 final obtida. J´ a para uma melhor adaptac¸ ˜ ao ao con-
texto de compress˜ ao de v´ıdeo, tamb´ em foi efetuada uma avaliac¸ ˜ ao das m´ etricas, quando
utilizadas no padr˜ ao H.264/AVC. Neste Cap´ıtulo 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 codificador de
v´ıdeo, 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 res´ıduo, qualidade em SSIM e PSNR.
Table 1. Tabela de resultados com imagem est ´ atica.
M´ etrica PSNR (dB) SSIM Res´ıduo (%)
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 res´ıduo(%) (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´ aficos onde cada uma das m´ etricas est´ a disposta lado a lado a fim de serem
comparadas com as demais para SSIM, PSNR e res´ıduo.
Figure 3. SSIM de cada uma das m´ etricas em estudo para o teste “4”.
Na Figura 3 torna-se vis´ıvel 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 flutuac¸ ˜ 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.
diferenc¸a 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 fac¸a 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 res´ıduo nos testes indica a quantidade de dados que restou da subtrac¸ ˜ ao da
imagem original com a imagem reconstru´ıda. 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 res´ıduo e qualidade (SSIM e PSNR) para a grande maioria dos casos, de
forma que quanto maior o res´ıduo, menor a qualidade. Deve-se notar que, tanto pela
qualidade quanto pela taxa de compress˜ ao, ´ e importante ter um valor baixo de res´ıduo
3
.
4.2. V´ıdeo
Para a avaliac¸ ˜ ao de qualidade em v´ıdeo foi usado o software de referˆ encia do H.264/AVC
[JVT ] (JM), modificado 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 influenciam no
bitrate final em, por exemplo, um v´ıdeo.
Figure 5. Res´ıduo de cada uma das m´ etricas em estudo para o teste “4”.
Para os testes com v´ıdeos, foram selecionados v´ıdeos que correspondem ` a um mix
de resoluc¸ ˜ ao e qualidade, tamb´ em utilizados por [de Moraes 2010]. Os v´ıdeos 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 codificador [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 codificador [JVT ].
No gr´ afico 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 “Sunflower” para as m´ etricas uti-
lizadas no codificador [JVT ].
Tamb´ em no gr´ afico 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 modificac¸ ˜ 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 v´ıdeo, o que abre a possibilidade de mel-
horias neste sentido. Infelizmente, tais abordagens s˜ ao bastante custosas, por exemplo,
para a identificac¸ ˜ ao pr´ evia de parte da complexidade para a busca se adequar ao conte´ udo.
Em um v´ıdeo 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 codificac¸ ˜ ao de v´ıdeo
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 flex-
ible vlsi implementations. The Journal of VLSI Signal Processing, 23:67–92.
10.1023/A:1008192719838.
Xiph.org. Xiph.org test media repository.