compressão digital: um estudo comparativo entre codecs padrão

Transcrição

compressão digital: um estudo comparativo entre codecs padrão
FACULDADE FARIAS BRITO
CIÊNCIA DA COMPUTAÇÃO
VILKER SILVA BEZERRA
COMPRESSÃO DIGITAL: UM ESTUDO COMPARATIVO
ENTRE CODECS PADRÃO MPGE-4 AVC/H.264
Fortaleza – CE
2009
VILKER SILVA BEZERRA
COMPRESSÃO DIGITAL: UM ESTUDO COMPARATIVO
ENTRE CODECS PADRÃO MPGE-4 AVC/H.264
Monografia apresentada para obtenção dos
créditos da disciplina Trabalho de Conclusão do
Curso da Faculdade Farias Brito, como parte das
exigências para graduação no Curso de Ciência
da Computação.
Orientadora: Prof. Dra. Wietske Ineke Meyering.
Fortaleza – CE
2009
COMPRESSÃO DIGITAL: UM ESTUDO COMPARATIVO
ENTRE CODECS PADRÃO MPGE-4 AVC/H.264
Vilker Silva Bezerra
NOTA:
FINAL (0 – 10): _______
Data: ____/____/_________
BANCA EXAMINADORA:
___________________________________
Profa. Dra. Wietske Ineke Meyering
(Orientadora)
___________________________________
Prof. Me. José Belo Aragão Júnior
(Examinador)
__________________________________
Prof. Me. José Helano Matos Nogueira
(Examinador)
AGRADECIMENTOS
Primeiramente a Deus, senhor de minha vida, o centro de nossa existência.
Aos meus pais e irmãos, orgulhos e formadores do meu caráter, pelo total apoio, confiança e
pelos momentos de felicidade.
Aos amigos, pela descontração e companheirismo.
Aos meus professores por proporcionarem minha formação, através de seus conhecimentos.
A minha namorada Maria das Graças Leite pela inspiração.
“Critica o tolo, e ele te odiará, critica o sábio, e ele te amará”
Provérbios 9:8
RESUMO
“Compressão digital: um estudo comparativo entre codecs padrão MPGE-4 AVC/H.264” é
uma monografia inserida numa linha de pesquisa que retrata como utilizar melhor a
capacidade de armazenamento e os meios de transmissão de dados existentes. Recentemente,
a implantação da Televisão Digital Brasileira tem influenciado pesquisas sobre a utilização da
transmissão das informações de forma que possa usufruir plenamente dos recursos oferecidos
por essa tecnologia. Nessa monografia são analisadas as etapas no processo de compressão de
imagens e vídeos compatíveis com o formato adotado pelo padrão escolhido para a Televisão
Digital Brasileira. Para isso, foi desenvolvida uma ferramenta de comparação, capaz de
identificar diferenças entre imagens. Outro aspecto verificado foi o tempo entre métodos de
compressão e o tamanho final do vídeo. Tal comparação torna-se muito vantajosa no aspecto
em que as inovações tecnológicas estão mudando o perfil de negócio tradicional de um dos
principais meios de comunicação do país.
SUMÁRIO
LISTA DE FIGURAS ...................................................................................... 9
LISTA DE TABELAS .................................................................................... 10
LISTA DE ABREVIAÇÕES ......................................................................... 11
INTRODUÇÃO .............................................................................................. 12
1 COMPRESSÃO DE IMAGENS E VIDEO DIGITAL......................... 14
1.1 Definições iniciais............................................................................. 14
1.2 Compressão de dados ...................................................................... 15
1.2.1 Redundância ............................................................................. 15
1.3 Modelos de compressão ................................................................... 18
1.4 Métodos de compressão de imagens ............................................... 20
1.5 Técnicas para redução de codificação ............................................ 21
1.6 Fidelidade ......................................................................................... 23
1.7 Padronizações de compressão de Imagens ..................................... 24
2 CODECS H.264 E A TV DIGITAL BRASILEIRA ............................. 27
2.1 TV Digital Brasileira ....................................................................... 27
2.2 H.264/AVC ....................................................................................... 28
2.2.1 Predição Intra-quadro .............................................................. 30
2.2.2 Codificação por transformadas................................................ 30
2.2.3 Codificação de Entropia ........................................................... 31
2.3 Perfis do H.264/AVC ........................................................................ 31
2.4 Codecs H.264 .................................................................................... 32
3 PROPOSTA DE CODIFICAÇÃO DE VÍDEOS .................................. 35
3.1 Comparador de Imagens ................................................................. 35
3.1.1 Estrutura do programa ............................................................ 35
3.1.2 Detecção de diferenças .............................................................. 37
3.1.3 Interface .................................................................................... 39
3.2 Casos de Testes ................................................................................ 43
3.3 Resultados ........................................................................................ 45
4 CONCLUSÃO ........................................................................................ 56
REFERÊNCIAS ............................................................................................. 58
APÊNDICE A – CLASSE COMPARADOR ................................................ 60
APÊNDICE B – CLASSE IMAGEM ............................................................ 64
APÊNDICE C – CLASSE FORMPRINCIPAL ........................................... 65
APÊNDICE D – DIAGRAMA DE CLASSES .............................................. 67
LISTA DE FIGURAS
Figura 1 - Sistema genérico de codificação e compressão de dados.
Figura 2 - Modelo de (a) codificador fonte e (b) decodificador fonte.
Figura 3 - Esquema do codificador H.264.
Figura 4 - Classe ImagemResultante.
Figura 5 - Classe Comparador.
Figura 6 - Algoritmo para detecção de pixels diferentes.
Figura 7 - Aba Imagem Original.
Figura 8 - Aba Imagem Comparação.
Figura 9 - Aba Imagem Resultado.
Figura 10 - Aba Histogramas.
Figura 11 - Quadro 00 codificado com o MainConcept H.264.
Figura 12 - Quadro 00 codificado com o x264.
Figura 13 - Quadro 290 codificado com o MainConcept H.264.
Figura 14 - Quadro 290 codificado com o x264.
Figura 15 - Histogramas x264 do quadro 00.
Figura 16 - Histogramas MainConcept H.264 do quadro 00.
Figura 17 - Histogramas x264 do quadro 290.
Figura 18 - Histogramas MainConcept H.264 do quadro 290.
19
19
30
36
36
38
40
41
42
43
46
47
48
49
51
52
53
54
LISTA DE TABELAS
Tabela 1: Imagem 4x8 pixels em escala de cinza para efeito do cálculo.
17
Tabela 2: Probabilidade de nível de cinza.
18
Tabela 3: Notas para um critério de avaliação subjetivo usando HDTV.
24
Tabela 4: Marcos na evolução da TV.
27
Tabela 5: Softwares para codecs MPEG-4 AVC/H.264.
32
Tabela 6: Softwares OPEN-SOURCE para codecs H.264.
33
Tabela 7: Diferença entre tamanhos e taxa média entre os codec.
45
Tabela 8: Diferença entre níveis RGB do quadro 00 das imagens comparadas.
50
Tabela 9: Diferença entre níveis RGB do quadro 10 das imagens comparadas.
50
Tabela 10: Diferença entre níveis RGB do quadro 100 das imagens comparadas.
50
Tabela 11: Diferença entre níveis RGB do quadro 200 das imagens comparadas.
50
Tabela 12: Diferença entre níveis RGB do quadro 290 das imagens comparadas.
50
LISTA DE ABREVIAÇÕES
ABNT
Associação Brasileira de Normas e Técnicas
ASCII
American Standard Code for Information Interchange
AVC
Advanced Video Coding
CABAC
Context-Based Adaptive Binary Arithmetic Coding
CAVLC
Context-Based Adaptive Variable Length Coding
CCITT
Consultative Comittee of International Telephone em Telegraph
CODEC
Codificador/Decodificador
DCT
Discrete Cosine Transform
DFT
Transformada discreta de Fourier
EQM
Erro Quadrático médio
HDTV
High Definiton TV
ISO
International Organization for Standardization
ITU-T
International Telecommunication Union
JVT
Joint Video Team
KLT
Karhunen-Loève Team
LZ
Abraham Lempel e Jacob Ziv
LZW
Abraham Lempel, Jacob Ziv e Terry Welch
MPEG
Moving Picture Experts Group
REL
Run-Lenght Encoding
RGB
Red, Green and Blue
SBTV
Sistema Brasileiro de Televisão Digital Terrestre
VCEG
Vídeo Coding Experts Group
WHT
Walsh-Hadamard
INTRODUÇÃO
A rápida evolução tecnológica exige uma crescente melhora dos aspectos
relacionados à comunicação. A televisão é um meio de comunicação presente em cerca de
90% dos lares brasileiros e recentemente uma mudança no panorama de transmissão das
imagens tem influenciado pesquisas relacionadas ao usufruto pleno de uma nova tecnologia: a
TV digital.
A tecnologia digital permite uma transmissão maior de dados e consequentemente
uma melhor exibição final. Além disso, esses dados que estão sendo transmitidos ainda
podem ser reduzidos sem causar impacto na qualidade da informação. A compressão digital
diminui o volume dos dados a serem trafegados, buscando a preservação do conteúdo
original.
Compressão digital tem sido um tema estudado por especialistas há muitos anos,
principalmente após a popularização da Internet Banda Larga e das câmeras de vídeos digitais
que utilizam programas de compressão de vídeo.
A correta utilização desse recurso permite a exibição de imagens e vídeos ricos
em detalhes, o que antes só seria possível a um alto custo de armazenamento e transmissão.
Trazer essa realidade para a TV digital não se trata de “reinventar a roda”, mas sim de buscar
um meio de aplicação para as vantagens que a compressão digital proporciona.
Essa monografia apresenta informações pertinentes à compressão de vídeos e
imagens digitais, bem como os formatos de compressão de vídeo compatíveis com o padrão
adotado para a TV Digital Brasileira. Provendo um estudo comparativo dos compressores de
vídeo através de análise entre o resultado final dos métodos de compressão.
13
Para realizar a comparação entre os diversos formatos de vídeo existentes, foi
criado um software capaz de apontar e quantificar as diferenças entre imagens de uma mesma
resolução. O percurso desde a revisão bibliográfica até uma análise comparativa entre codecs
(Codificador/Decodificador), feito através da construção do software, está compreendido da
forma como se segue abaixo.
O primeiro capítulo dessa monografia destina-se a apresentação de conceitos
fundamentais sobre compressão digital.
O segundo capítulo explana os aspectos dos codecs compatíveis com o formato
H.264/AVC, que é o padrão definido para a compressão de vídeo e imagens digitais para a
TV Digital Brasileira.
No terceiro capítulo serão analisadas propostas de implementações para
codificação de imagens e vídeos, comparando as etapas no processo de compressão entre
codecs que atendam ao padrão MPEG-4 AVC/H.264. Nesse capítulo também será
apresentado o software desenvolvido para avaliar os codecs.
Por fim, no quarto capítulo, serão analisados e discutidos os resultados obtidos na
comparação entre os codecs.
1 COMPRESSÃO DE IMAGENS E VIDEO DIGITAL
Neste capítulo serão abordados conceitos relacionados à compressão digital. A
abordagem aqui estabelecida tratará desde definições iniciais até uma explicação específica
(modelo, algoritmos, metodologias e padrões) necessária para distinção entre as etapas no
processo de compressão de imagens e vídeos digitais.
1.1 Definições iniciais
Para que se possa iniciar o estudo aqui pretendido, faz-se necessário a
diferenciação entre dados e informação. Valdemar Setzer (2001) e Ida Pu (2006) definem
dados como uma sequência de símbolos quantificados ou quantificáveis e informação como
uma abstração informal que está na mente de alguém e representa algo significativo que
acrescenta conhecimento para essa pessoa.
Em concordância, Luciano Floridi (2005) define dados como tudo que pode ser
processado e as informações como dados que descrevem um domínio físico ou abstrato. De
posse dessas definições, atribui-se ao computador a função de uma máquina que processa
dados. Ao trabalhar com tais conceitos, pode-se verificar em que medida os dados podem ser
eliminados sem que para isso se altere a estrutura informacional estabelecida na imagem com
a qual se quer trabalhar.
Segundo Ida Pu (2006) existem três tipos básicos de fonte de dados no
computador: texto, imagem e som. O estudo da compressão nesse trabalho envolve solucionar
o problema de como despender dados redundantes especificamente em imagens.
15
1.2 Compressão de dados
No contexto da informática, segundo Ida Pu (2006, p.42), compressão de dados é:
“A ciência (e arte) de representar as informações de forma compacta. Esta tem sido uma das
habilidades tecnológicas críticas para a revolução digital multimídia em curso há décadas”. Já
para Cliff Wootton (2005), o termo compressão é análogo à tentativa de colocar um grande
piano numa caixa de correio ou passar um elefante através do buraco de uma agulha. Apesar
das maneiras bastante distintas para apresentarem o mesmo conceito, ambos fazem referência
à importância e a dificuldade necessária para diminuir o volume utilizado para armazenar
informações.
O objetivo da compressão de dados é eliminar os bits desnecessários (dados) para
a representação da informação contida em uma fonte. Dessa forma, a melhor taxa de
compressão possível será aquela que permita a melhor interpretação da informação
comprimida, comparando-a a fonte original (REED, 2007). Para cumprir com o objetivo
descrito por Reed (2007), é imprescindível descobrir elementos desnecessários em uma
informação.
Gonzalez e Woods (2000) comentam sobre as diversas formas de transmitir uma
mesma informação. Quando em um conjunto de dados é percebido que, em uma determinada
forma de transmissão, existem dados não essenciais, por serem irrelevantes ou simplesmente
por repetirem algo conhecido, caracteriza-se, então, uma transmissão de dados redundante.
1.2.1 Redundância
“A redundância de dados é um tema central em compressão de imagens digitais”
(GONZALEZ; WOODS, 2000, p.219). Sobre diversos aspectos, a compressão de imagens é a
redução da quantidade de dados necessários para a representação de uma informação.
Basicamente, para a identificação de bits desnecessários em uma determinada
imagem, quatro redundâncias podem ser exploradas. São elas: redundância de codificação,
redundância inter-pixels, redundância espectral e redundância psicovisual (GONZALEZ;
WOODS, 2000).
A primeira delas, redundância de codificação, revela que uma grande parte da
informação sobre a aparência de uma imagem pode ser obtida de um histograma dos níveis de
16
cinza dessa imagem. Quando os níveis de cinza são codificados usando mais símbolos de
codificação do que o necessário, diz-se que a imagem contém redundância de codificação
(GONZALEZ; WOODS, 2000). As imagens normalmente são compostas por objetos que
possuem forma previsível e regular e, por conseguinte, alguns níveis de cinza são mais
prováveis do que outros.
Redundância de codificação também pode ser referenciada como redundância de
codificação de tons ou cor. Um bom exemplo seria uma imagem que contém apenas oito
cores que necessitaria de apenas três bits em compartimento, no entanto, ao ser codificada
usando um byte (8 bits), é reservado um espaço que poderia ser usado para definir 256 tons de
cinza (AZEVEDO; CONCI; LETA, 2008). Nesse exemplo, o espaço alocado para armazenar
a imagem é maior do que aquele realmente necessário, caracterizando um desperdício de
recurso computacional.
A segunda delas, a redundância inter-pixel, afirma que as relações entre os pixels
de uma imagem resultam das relações geométricas ou estruturais entre os objetos que a
compõem. O valor de um determinado pixel é previsível a partir dos seus vizinhos
(GONZALEZ; WOODS, 2000). O volume de informação será menor caso um objeto possa
ser representado ou identificado apenas pela descrição de seu contorno na imagem
(AZEVEDO; CONCI; LETA, 2008). Com isso, vários pixels que compõem uma imagem não
precisam estar armazenados. Eles poderão ser calculados em vez de estarem contidos na
imagem propriamente dita.
A terceira delas, a redundância espectral, ocorre em imagens com mais de uma
faixa espectral. Existe uma correlação entre as diferentes bandas espectrais de uma imagem e,
quando valores espectrais para a mesma posição na matriz de pixels estão correlacionados, é
necessário apenas um canal com informações detalhadas, em vez de vários canais como
normalmente são utilizados (AZEVEDO; CONCI; LETA, 2008). Nesse caso, a exemplo da
redundância de codificação, ocorre um desperdício de alocação de espaço para guardar
informações que podem ser computadas.
A última delas, redundância psicovisual, elimina informações não essenciais para
o processamento visual humano. O olho não responde com a mesma sensibilidade às
informações visuais de uma imagem. Fatores como o brilho, por exemplo, não depende
simplesmente da luz refletida em uma determinada região. A redundância psicovisual é
17
diferente das anteriores por estar associada a uma informação visual quantificável ou real
(GONZALEZ; WOODS, 2000). A eliminação de informações psicovisualmente redundantes
não acarreta uma perda de percepção da imagem. O ser humano não detecta ruídos no meio
das imagens ou pequenas variações de tons (AZEVEDO; CONCI; LETA, 2008). Isso
significa dizer que em um processo de redução que se utilize uma diminuição de dados sem
que haja prejuízo para a correta compreensão do conteúdo, estará presente uma otimização,
não só desejável, como imperceptível ao ser humano.
É importante existir formas de identificar se uma imagem apresenta ou não
redundância. Segundo a teoria da informação, quanto menos bits forem necessários para
conter todos os valores ou significados, sobre um sistema, menor será sua entropia. O cálculo
da entropia de uma imagem pode ser utilizado para descobrir a quantidade de redundância
baseado na utilização da seguinte relação:
Onde representa cada símbolo do alfabeto-fonte A definido como
{
, , , … , }. Para imagens o alfabeto pode ser definido como sendo o tom de cinza, a
tabela de cores ou cada um dos valores RGB (AZEVEDO; CONCI; LETA, 2008).
Considerando uma imagem de tamanho 4x8 pixels em escala de cinza conforme a
tabela 1, calcula-se a entropia dessa imagem a partir da probabilidade de cada nível de cinza
presente nela, segundo a tabela 2.
Tabela 1: Imagem 4x8 em escala de cinza para efeito do cálculo.
Fonte: (AZEVEDO; CONCI; LETA, 2008).
4
4
4
4
4
4
4
4
4
4
16
16
4
4
16
16
64
64
128
128
64
64
128
128
128
128
128
128
128
128
128
128
18
Tabela 2: Probabilidade de nível de cinza.
Fonte: (AZEVEDO; CONCI; LETA, 2008).
Cor
4
16
64
128
Total
12
4
4
12
Probabilidade
12/32 = 3/8
4/32 = 1/8
4/32 = 1/8
12/32 = 3/8
Utilizando a relação de entropia, supondo que a imagem tenha 256 níveis de cinza
e que a unidade usada seja bits, a base do logaritmo usado na relação depende da unidade
utilizada para medir a informação, temos que:
H(A) = -p(4) * log2(p(4)) – p(16) * log2(p(16)) – p(64) * log2(p(64)) – p(128) * log2(p(128))
H(A) = -[3/8 * log2 (3/8) + 1/8 * log2 (1/8) + 1/8 * log2 (1/8) + 3/8 * log2 (3/8)]
H(A) = -[3/4 * log2 (3/8) + ¼ * log2 (1/8)]
H(A) = -[3/4 * (log23- log28) + ¼ * (log21 – log28)]
H(A) = -[3/4 * (log23-3) + ¼ * (0-3)] = 0,81 bits/pixel
A entropia dessa imagem então é de 0,81 bits por pixel. No caso de uma imagem
4x8, temos: 0,81 * 32 = 25 bits de informações redundantes.
1.3 Modelos de compressão
Um sistema de compressão de dados ou imagens consiste em dois blocos: um
codificador e um decodificador. O codificador irá criar um conjunto de símbolos a partir da
imagem de entrada. A imagem é transmitida ao longo de um canal e repassada no
decodificador para gerar e reconstruir uma imagem de saída (AZEVEDO; CONCI; LETA,
2008). Essa estrutura (codificador-decodificador) é a básica para compreensão de modelos de
compressão mais complexos como aqueles que serão abordados posteriormente nesse
trabalho.
19
Fig. 1 - Sistema genérico de codificação e compressão de dados.
Fonte: (MARQUES FILHO; VIEIRA NETO, 1999).
Na figura 1, o codificador fonte é o responsável pela eliminação de qualquer
redundância existente na entrada (MARQUES FILHO; VIEIRA NETO, 1999). Os
codificadores e decodificadores de canal são responsáveis por amenizar o impacto do ruído do
canal através da inserção de uma forma controlada de redundância nos dados codificados
(GONZALEZ; WOODS, 2000). O codificador fonte e o decodificador fonte podem seguir
diversas abordagens de redundâncias modeladas em operações distintas (MARQUES FILHO;
VIEIRA NETO, 1999). Definir as operações, tanto para o codificador fonte quanto para o
decodificador, determina a abordagem de compressão para cada padrão existente.
Fig. 2 - Modelo de (a) codificador fonte e (b) decodificador fonte.
Fonte: (GONZALEZ; WOODS, 2000).
O modelo de codificador fonte na figura 2 (a), primeiramente projeta a entrada em
um formato para reduzir as redundâncias inter-pixel e facilitar nos estágios posteriores. Tal
operação é conhecida como mapeamento. Uma segunda operação seria de reduzir a
aproximação dos valores ao valor real da saída após o mapeamento pela eliminação de
redundâncias psicovisuais. Esse estágio é denominado de quantizador. Um terceiro estágio, o
codificador de símbolos, cria um código de comprimento fixo ou variável para representar a
20
saída do quantizador e mapeia a saída de acordo com o código (GONZALEZ; WOODS,
2000). Estágios semelhantes ocorrem em outros padrões de codificação existente.
O decodificador de fonte na figura 2 (b) desempenha as operações inversas do
estágio do codificador de símbolos e da operação de mapeamento (GONZALEZ; WOODS,
2000). Outras operações para padrões de compressão mais robustos são inseridas ao conjunto
que compõe todas as etapas entre o codificador e o decodificador.
O tempo para compressão e descompressão nem sempre são iguais. Quando o
tempo de compressão de vídeo é muito superior ao de descompressão, denomina-se
compressão assimétrica. Para compressão de vídeo, a compressão assimétrica permite, por
exemplo, que um vídeo possa ser armazenado em servidores e acessado por uma
decodificação mais rápida pelos usuários (AZEVEDO; CONCI; LETA, 2008). Esse tempo
para compressão e descompressão está diretamente relacionado ao nível de complexidade, ao
número de operações feitas no modelo e ao método de compressão.
1.4 Métodos de compressão de imagens
Duas são as categorias de métodos compressão: com e sem perdas. Métodos que
não mudam os valores no arquivo de imagem são descritos como técnicas de compressão sem
perdas, e as que criam mudanças nas cores são referenciadas como técnicas de compressão
com perdas (HEARN; BAKER, 2004). O padrão que será abordado nesse trabalho está
inserido na categoria de compressão com perdas.
Na compressão com perdas, são retiradas informações não significantes de acordo
com a necessidade e os critérios de fidelidade desejados. A compressão com perdas não
preserva todos os dados da informação, entretanto é mais eficiente com relação ao espaço
necessário para o armazenamento das imagens (AZEVEDO; CONCI; LETA, 2008). Nesse
caso, não preservar todos os dados, não implica em uma distorção da interpretação da
informação, mas apenas a retirada de dados dispensáveis.
Compressão sem perdas, também conhecida como compressão com preservação
da informação, explora a redundância entre os pixels na reprodução de uma imagem ou vídeo
sem que nenhum dado seja perdido durante o processo de compressão (AZEVEDO; CONCI;
21
LETA, 2008). Diferente do outro método de compressão, na compressão sem perdas todos os
dados da informação são preservados.
Técnicas de compressão sem perdas são úteis para dados e imagens especiais. Um
bom exemplo seria a análise de imagens na biomedicina. Nesses casos, a perda de qualquer
informação da imagem pode acarretar em falhas de proporções catastróficas (AZEVEDO;
CONCI; LETA, 2008). Em situações especiais, a consequência que a perda de qualquer dado
possa causar deve ser muito bem avaliada.
Os métodos de compressão com e sem perdas cumprem um papel importante no
desenvolvimento e adoção dos principais padrões de compressão de imagens atuais
(GONZALEZ; WOODS, 2000). Gonzalez e Woods se referem, neste caso, que ao adaptar o
método de compressão a cada necessidade, define-se qual o padrão de compressão será o
ideal.
Em síntese, de acordo com a técnica para redução de codificação, o método
utilizado para eliminação de dados redundantes é o que permite a informação contida na fonte
ser reconstruída após o processo de compressão e descompressão.
1.5 Técnicas para redução de codificação
Existem várias técnicas e algoritmos que se propõem a reduzir significantemente a
redundância de codificação. Os mais usados são as codificações RLE (Run-Lenght Encoding),
LZ (assim chamado devido aos seus idealizadores Abraham Lempel e Jacob Ziv), LZW (um
aperfeiçoamento do LZ feita por Terry Welch) e o algoritmo de Huffman (MARQUES
FILHO; VIEIRA NETO, 1999). É importante a identificação dos algoritmos para entender
como as operações para um determinado padrão de compressão funcionam. Abaixo pode-se
observar a explicação de algumas dessas técnicas.
“Quando aplicado à codificação de cada símbolo da fonte, individualmente, o
código de Huffman fornece o menor número inteiro possível de unidades de informação (bits)
por símbolo de fonte” (MARQUES FILHO; VIEIRA NETO, 1999, p. 180). O algoritmo ou
técnica de Huffman exemplifica de maneira simples como se conseguir uma redução de
codificação.
22
A técnica de Huffman foi um método utilizado com sucesso, inicialmente, para
compressão de textos. Em todo o texto, alguns caracteres ocorrem mais frequentemente do
que outros. Por exemplo, em textos em Inglês, as letras E, A, O, T são normalmente mais
usadas do que J, Q, X (PU, 2006). Para simular cada ocorrência de uma letra em um texto,
utiliza-se normalmente um código de comprimento fixo, como os 8 bits da tabela ASCII
(American Standard Code for Information Interchange). A ideia de Huffman era de
representar cada cadeia de caracteres com a menor quantificação de dados possível e a
frequência de ocorrência ao longo do texto. Reduzindo assim, o número total de bits para
representar o texto (PU, 2006). Em outras palavras isso significaria dizer que, de posse da
informação de quantas vezes um determinado dado ocorre, a informação poderia ser
reconstruída.
Outra perspectiva de aplicação das técnicas de compressão pode ser visualizada na
eliminação da redundância baseada na compressão por transformada (AZEVEDO; CONCI;
LETA, 2008). Compressão por transformada, assim como a técnica de Huffman, tem como
objetivo buscar os dados redundantes que podem ser eliminados. Para o foco de atenção neste
trabalho veremos sua aplicação em relação às imagens.
Nas técnicas baseadas em transformada, a imagem é mapeada para um conjunto
de coeficientes que são quantificados e codificados por uma transformação linear
“inversível”. Na maioria das imagens, existem coeficientes de pequena magnitude que podem
ser descartados sem causar distorção significativa. A meta desse processo é descorrelacionar
os pixels ou usar a correlação de forma a compactar, o máximo possível, a informação em um
número menor de coeficientes (AZEVEDO; CONCI; LETA, 2008). Os métodos que definem
o processo para o “descorrelacionamento” dos pixels serão listados abaixo.
“Sistemas de codificação por transformada com base nas transformadas de
Karhunen-Loève (KLT), Fourier discreta (DFT), cosseno discreta (DCT), Walsh-Hadamard
(WHT) e muitas outras têm sido construídos e/ou estudados extensivamente” “sic”
(GONZALEZ; WOODS, 2000, p. 267). Para efeito de estudo desse trabalho, a DCT projetase como a codificação mais importante por fazer parte do padrão que será acometido
posteriormente.
A DCT é o método de codificação por transformada mais frequentemente usada.
Algoritmos de implementação eficientes para a DCT fornecem uma melhor fidelidade na
23
reconstrução de cores da imagem, uma taxa de compressão maior, além de serem executados
rapidamente (HEARN; BAKER, 2004). Para imagens de alta resolução, como ocorre na TV
Digital, a DCT é, portanto, o método preferencial.
DCT é uma transformada ortogonal cuja propriedade de concentração de energia
em poucos coeficientes constitui um atrativo para seu uso em compressão de imagens
(LINHARES; DINIZ; CORREIA, 2007). “A concentração de energia de uma matriz de pixels
em poucos coeficientes proporciona o descorrelacionamento dos pixels vizinhos e torna
possível eliminar ou reduzir a presença das altas frequências de uma imagem durante o
processo de quantização” (LINHARES; DINIZ; CORREIA, 2007, p. 22).
A formulação matemática da DCT direta 1-D pode ser representada da seguinte
maneira:
A DCT em si não compacta os dados. A análise dos valores resultantes permite
escolher os dados que podem ser descartados sem perda visível de qualidade (MARQUES
FILHO; VIEIRA NETO, 1999). O interesse na DCT desponta por está presente diretamente
no padrão de compressão da TV Digital. A DCT foi descrita como a responsável por
identificar dados que podem ser eliminados. Depois de identificados esses dados, os fatores de
padronização e fidelidade das fontes são então questionados, tratando-se dos próximos
assuntos a serem abordados neste trabalho.
1.6 Fidelidade
A qualificação dos resultados de uma compressão de imagens pode ser avaliada
segundo a taxa de compressão, que é a razão do tamanho do dado ou imagem original pelo
tamanho após a compressão. Em uma técnica de compressão sem perdas, quanto maior a taxa,
melhor a técnica. Para técnicas com perdas, deve-se considerar a qualidade final (AZEVEDO;
CONCI; LETA, 2008). Nas técnicas com perdas é necessário comparar a imagem original
com a imagem pós-processo de compressão para identificar o quanto a qualidade entre ambas
está próxima.
24
Considerando os processos de compressão pela eliminação de redundância,
informações de interesse podem ser perdidas. Para quantificar a extensão dessas perdas, são
utilizados dois grupos gerais de critérios: critérios de fidelidade objetiva e critérios de
fidelidade subjetiva (MARQUES FILHO; VIEIRA NETO, 1999). Verificar os aspectos de
fidelidade entre imagens será a funcionalidade desempenhada pela ferramenta desenvolvida
nesse trabalho.
Critérios de fidelidade objetivos são assim denominados quando os critérios entre
os aspectos dos dados ou imagens são expressos numericamente a fim de permitir a
comparação das técnicas de compressão, através de uma função entre as imagens. Quando os
critérios são estabelecidos por um observador humano, denominam-se critérios de fidelidade
subjetivos (AZEVEDO; CONCI; LETA, 2008). Para melhor compreensão, a tabela 3
representa os critérios utilizados para a HDTV (High Definiton TV ou televisão de alta
definição).
Tabela 3: Notas para um critério de avaliação subjetivo usando HDTV.
Adaptado de: (AZEVEDO; CONCI; LETA, 2008).
Valor
Avaliação
Descrição
1
Excelente
Imagem de extrema qualidade, o máximo desejável.
2
Muito bom
Imagem de alta qualidade e visualização agradável. Interferência não é visível.
3
Passável
Imagem de qualidade aceitável. A interferência não é desagradável.
4
Marginal
Imagem de qualidade pobre. A interferência é de alguma forma desagradável.
5
Inferior
Imagem muito pobre, mas pode-se vê-la. Interferência muito presente.
6
Não usável
Imagem tão ruim que não se consegue ver.
Neste trabalho, o enfoque será dado aos critérios de fidelidade objetivos, uma vez
que a aplicação a ser desenvolvida utiliza algoritmos e cálculos matemáticos para determinar
os aspectos diferenciais entre as imagens.
1.7 Padronizações de compressão de Imagens
Para compressão de imagens biníveis (binárias), por exemplo, os padrões do
Grupo 3 e 4 do Consultative Committee of International Telephone en Telegraph (CCITT) são
amplamente usados. Esses padrões foram originalmente projetados para transmissão de
documentos em redes de telefone, mas existe uma grande variedade aplicada em
computadores (GONZALEZ; WOODS, 2000). Para entender como funciona a padronização
25
que é foco de interesse para o trabalho, será descrito o funcionamento dos padrões do Grupo 3
e 4.
Na padronização do Grupo 3 é aplicada uma técnica não-adaptativa por código de
corrida unidimensional, em que pelo menos K-1 linhas de cada grupo de K linhas (para K=2
ou 4) são codificadas otimamente de uma maneira bidimensional. A padronização do Grupo 4
é uma simplificação do Grupo 3, em que apenas codificação bidimensional não-adaptativa é
permitida (GONZALEZ; WOODS, 2000). Os padrões são normalmente evolutivos, as
experiências anteriores são reutilizadas para aprimorar os novos padrões.
Para compressão de imagens de tons contínuos, a CCITT e a ISO (International
Organization for Standardization) definiram várias padronizações que tratam de imagens
monocromáticas, coloridas, aplicações de imagens estáticas e as de sequência de quadros
(vídeo) (GONZALEZ; WOODS, 2000). A CCITT foi responsável pela difusão de padrões de
vídeos mais utilizados atualmente.
Seguindo uma breve linha cronológica, a padronização H.261 (também chamada
de Px64) criada pela CCITT e desenvolvida pela ITU-T (International Telecommunication
Union, Telecommunication Standardization Sector), foi o primeiro padrão de codificação de
vídeo difundido com sucesso, projetado para aplicações de teleconferência por vídeo, capaz
de comprimir vídeos para as taxas de transmissão mais comuns na época (entre 80 e 320
kbit/s para comunicações em vídeo digital) (GONZALEZ; WOODS, 2000; FONSECA,
2008). O padrão que será avaliado nesse trabalho é a versão mais atual do padrão H.261.
As padronizações MPEG I e MPEG II, desenvolvidas pelo Moving Picture
Experts Group (MPEG), propunham uma padronização de compressão de vídeo com
“qualidade de entretenimento” para o armazenamento de imagens comprimidas em meios
digitais (GONZALEZ; WOODS, 2000). Tanto a padronização MPEG como a H.261
estendem abordagens bastante semelhantes.
O ITU-T, inicialmente, focou-se na compressão de vídeo digital priorizando
aplicações em telefonia, enquanto o MPEG considerou outros aspectos como a codificação de
áudio, sincronização e “multiplexação” de áudio e vídeo mais relevantes (MANUEL, 2007).
Atualmente o ITU-T e o ISO/IEC MPEG são os principais órgãos responsáveis pela definição
de tais padronizações.
26
As diferenças entre as padronizações MPEG e a H.261 estão na maneira como são
estimados os movimentos. A padronização H.261 especifica que cada quadro seja comparado
apenas com o quadro anterior, enquanto a padronização MPEG não define quantos quadros
podem ser usados para estimação de movimento (GONZALEZ; WOODS, 2000). Ambos os
padrões utilizam a DCT descrita na seção 1.5.
Inserido nesse contexto, sobre informações pertinentes aos padrões de compressão
de imagens atuais, o H.264/AVC (Advanced Video Coding), evolução dos padrões citados,
será o padrão analisado nesse trabalho.
2 CODECS H.264 E A TV DIGITAL BRASILEIRA
O presente capítulo aborda como os equipamentos de vídeo digital necessitam de
uma padronização de técnicas de codificação para que possam se comunicar. Aqui serão
esclarecidos a definição e o comportamento do padrão de codificação H.264/AVC, bem como
o seu relacionamento com a TV Digital Brasileira.
2.1 TV Digital Brasileira
“Estamos presenciando a implantação de uma nova geração de sistemas de TV: a
Televisão Digital e a TV de Alta Definição” (STOLFI, 2004). A TV Digital ao longo dos
próximos anos irá substituir a TV analógica.
Segundo Stolfi (2004) a introdução do modelo de TV a cores, ocorreu em 1953.
Entretanto, o formato da TV manteve-se praticamente inalterado até os dias atuais.
Tabela 4: Marcos na evolução da TV.
Adaptado de: (STOLFI, 2004).
Ano
1884
1900
1925
1928
1940
1941
1948
1952
1953
1965
1986
1989
Marco
Varredura de Imagens por discos rotativos (Paul Nipkov)
Conceito de “Televisão” (Constantin Persky)
Primeiras transmissões de TV (J. Baird, C. Jenkins)
Transmissões comerciais de TV (Hugo Gernsback)
Testes de transmissão de TV a cores
Transmissões no padrão “M” (CBS)
Padrão de 50 Hz / 625 linhas é adotado na Europa
Transmissão de TV em UHF
TV a Cores padrão NTSC (RCA)
Sistema PAL de transmissão de TV a Cores
Transmissão de som estéreo na TV (BTSC)
Sistema Hi-Vision (NHK)
28
A HDTV possibilita a transmissão em uma resolução superior a tradicional. A TV
analógica tem 480 linhas verticais e normalmente 640 linhas horizontais, enquanto a HDTV
chega a uma resolução de até 1080 linhas verticais por 1920 linhas horizontais (BENOIT,
2008). O aproveitamento dos recursos da TV em alta definição deverá trazer à população
brasileira a possibilidade real de interatividade.
Os equipamentos vídeo digital necessitam de uma padronização de técnicas de
codificação de vídeo para se comunicarem. Durante o final da década de 80 e o início da
década de 90, os primeiros esforços para a padronização aconteceram através do ITU-T Vídeo
Coding Experts Group (VCEG), com a criação do padrão H.261 (MANUEL, 2007).
A norma ABNT (Associação Brasileira de Normas e Técnicas) NBR 15602-1
especifica a codificação de vídeo em alta definição, resolução-padrão e resolução reduzida,
incluindo os parâmetros para os sinais na entrada do codificador e as restrições ao processo de
codificação, aplicáveis ao sistema brasileiro de televisão digital terrestre (SBTVD). Ela
especifica que a ferramenta de compressão de vídeo do sistema de televisão digital terrestre
brasileiro deve obrigatoriamente estar de acordo com a ITU-T Recommendation H.264.
2.2 H.264/AVC
H.264/AVC é o mais novo padrão de compressão de vídeo, resultante da
colaboração entre as equipes ISO/IEC Moving Picture Experts Group (MPEG) e ITU-T Video
Coding Experts Group (VCEG) sob a agregação denominada Joint Video Team (JVT)
(FONSENCA, 2008; HANZO; CHERRIMAN; STREIT, 2007). O H.264 é uma evolução dos
padrões de vídeos mais difundidos.
O H.264/AVC oferece elevada eficiência de compressão de uma classe específica
de sinais de vídeo resultantes da captura de cenas reais (e não sintéticas), além de
proporcionar representação de vídeo conveniente à transmissão tanto para aplicações
interativas quanto não-interativas (FONSENCA, 2008). Em vista disso, é notável sua grande
aceitação nos meios de comunicação digital.
O interesse pelo padrão H.264 tem sido crescente com relação ao seu uso em
novos sistemas de armazenamento e de transmissão de vídeo digital por possuir um ótimo
desempenho com taxas de bits 50% menor do que seu antecessor MPEG-2, mantendo a
29
mesma qualidade (MANUEL, 2007). O H.264, comparado aos outros padrões, torna-se mais
eficiente por diminuir a relação de distorção causada no processo de compressão.
Como Manuel (2007, p.09) explica:
A compressão sem perdas limita-se a um pequeno nicho de aplicações que não
toleram qualquer distorção, como vídeos médicos ou sistemas de arquivamento. Por
sua vez, a compressão com perdas é a mais usada e difundida, já que certas
distorções podem ser imperceptíveis ao olho humano, ou mesmo toleradas – é este o
tipo de compressão que trata o padrão H.264.
“O H.264 possui uma série de vantagens em relação a seus antecessores, com
respeito às etapas de predição, transformação e codificação” (MANUEL, 2007, p. 4). Cada
etapa na compressão H.264 possui melhoramentos que serão listados posteriormente.
O codec H.264 oferece substancialmente uma codificação com melhor eficiência
na mesma qualidade de vídeo comparado ao MPEG-4 ou H.263 (HANZO; CHERRIMAN;
STREIT, 2007). Esses padrões citados são os antecessores imediatos do H.264/AVC.
A evolução do H.264 será alcançada com o investimento em diferentes pontos do
codificador, resultando provavelmente em um conjunto de “pequenas melhorias” nos
processos de predição, transformação e codificação (MANUEL, 2007). Ainda segundo
Manuel (2007), provavelmente em 2010 o padrão será denominado H.265.
Um dos conceitos fundamentais de H.264 é a separação do vídeo em duas
camadas distintas: camada de codificação e camada de adaptação de rede. A camada de
codificação do vídeo é responsável pela codificação eficiente representando o conteúdo do
vídeo, enquanto a camada de adaptação de rede é responsável pelo empacotamento dos dados
codificados de forma adequada para transmissão através da rede (HANZO; CHERRIMAN;
STREIT, 2007). Significando dizer que, além da abordagem de eliminação de redundância, o
H.264/AVC também busca um melhor desempenho a reprodução do vídeo.
O processo de transformação é aplicado para transformar valores de um bloco
visando transformar o sinal para o domínio de frequência espacial para reduzir as
redundâncias espaciais e descorrelacionar a concentração de informação nos coeficientes
(MANUEL, 2007). Manuel (2007) explica ainda que o H.264 utiliza uma transformada
simples que utiliza apenas números inteiros cujos resultados se aproximam muito da
transformada DCT 4×4 .
30
Fig. 3 - Esquema do codificador H.264.
Fonte: (HANZO; CHERRIMAN; STREIT, 2007).
A figura 3 representa o esquema do codificador H.264. O fluxo de dados pelo
codificador é formado por dois caminhos, um caminho "Direto" orientado da esquerda para a
direita e um caminho evolutivo de "Reconstrução" da direita para a esquerda (HANZO;
CHERRIMAN; STREIT, 2007).
Manuel (2007) lista algumas vantagens do H.264 com relação às transformadas:
predição intra-quadro, codificação por transformada e sua codificação por entropia.
2.2.1 Predição Intra-quadro
A estrutura do H.264/AVC é definida por uma técnica de predição Intra-quadro
em que amostras do sinal de vídeo agrupadas em macroblocos de 16×16 pixels. A predição
existe para como unidade básica para identificar informações de macroblocos já codificados e
pertencentes ao mesmo quadro (MANUEL, 2007). Predição, neste contexto, tem o mesmo
significado de prognóstico.
2.2.2 Codificação por transformadas
Fonseca (2004) descreve como o H.264/AVC emprega a codificação por
transformadas para viabilizar a codificação do sinal residual. Essa melhora é efetuada por
meio da redução da redundância espacial existente no erro de predição.
31
O H.264/AVC não aplica a DCT bidimensional em blocos de 8×8 pixels, como
nos padrões MPEG-1 e MPEG-2. No H.264/AVC são usadas transformadas inteiras
reversíveis com tamanhos variados de 8×8, 4×4 a 2×2 amostras. Por conseguir utilizar
transformadas menores que a DCT de 8×8, isso acaba permitindo ao compressor codificar
melhor o resíduo de predição no caso em que são selecionadas partições de tamanhos menores
que 8×8 (MANUEL, 2007). Isso explica a garantia de uma melhor compactação do sinal
devido à menor variação encontrada em pequenas regiões de um quadro digital.
2.2.3 Codificação de Entropia
O padrão H.264/AVC possui um alto grau adaptativo às fontes por incorporar um
modelamento de contextos do sistema de codificação de entropia. Esse sistema analisa a
hipótese de que a estatística dos sinais seria estacionária e levanta, de antemão, códigos de
comprimento variável de tamanho excelente para os elementos sintáticos normatizados
(MANUEL, 2007). Como essa hipótese nem sempre era verificada em outros padrões, o
H.264 é então mais hábil na remoção da redundância do sinal.
2.3 Perfis do H.264/AVC
O H.264/AVC foi desenvolvido para ser o mais genérico possível e capaz de
atender uma vasta gama de aplicações, taxas, resoluções, qualidades e serviços (FONSECA,
2008). Entretanto, as demandas das aplicações podem ser bastante diferentes. Em vista disso,
a especificação do H.264/AVC define perfis e níveis de forma a maximizar a
interoperabilidade e proporcionar uma maior aceitação do padrão.
Nas palavras de Manuel (2007) um perfil é definido como sendo um subconjunto
da sintaxe completa do bitstream (método de conversão Digital/Analógica que emprega a
leitura bit por bit em vez do método convencional de 16 bits por vez) ou um subconjunto de
ferramentas de codificação.
Um perfil deve operar elementos sintáticos específicos para indicar a presença ou
ausência de elementos sintáticos que venham a ser aproveitados em seguida no bitstream
(MANUEL, 2007). Isso significa dizer que os decodificadores compatíveis com um mesmo
perfil suportam as mesmas ferramentas de codificação. Várias implementações, tanto em
32
softwares quanto em hardware, para codecs H.264 foram desenvolvidas desde o final do ano
de 2003, quando o padrão foi lançado.
2.4 Codecs H.264
A implementação de codecs existem para exibição de vídeos em formatos
próprios para o computador. Das aplicações de softwares desenvolvidas para o padrão H.264,
até julho de 2007, pode-se citar várias dezenas (31 itens segundo o departamento The
Graphics & Media Laboratory de Ciência da Computação do MSU) compostas tanto por
softwares pagos, como também softwares com código fonte aberto (MSU, 2009).
Tabela 5: Softwares para codecs MPEG-4 AVC/H.264.
Fonte: (MSU, 2009).
1. Ateme H.264/MPEG-4 AVC Codec (Ateme)
http://www.ateme.com/BB_encoder_pc.php
2. Elecard Elecard Mobile Converter v 2.0 with AVC support (Elecard)
http://elecard.com/products/products-pc/consumer/video-converter/
3. Mainconcept H.264 (MainConcept AG)
http://www.mainconcept.com/site/?id=4786
4. QuickTime 7 H.264 (Apple Computer, Inc.)
http://www.apple.com/quicktime/technologies/h264/
5. Intel IPP H.264 codec (Intel Corporation)
http://www.intel.com/cd/software/products/asmo-na/eng/perflib/ipp/index.htm
6. VSS H.264 Video Codec (Vanguard Software Solutions, Inc.)
http://www.vsofts.com/h264/
7. Sorenson AVC Pro (part of Sorenson Squeeze 4) (Sorenson Media, Inc.)
http://www.sorensonmedia.com/pages/?pageID=2
8. SONY Video Editor Vegas 6c with AVC support (Sony Corp.)
http://www.sonymediasoftware.com/products/showproduct.asp?PID=965
9. FastVDO H.264 (FastVDO LLC)
http://www.fastvdo.com/H.264.html
10. LEAD H.264 Video codec (LEAD Technologies)
http://www.leadcodecs.com/Codecs/LEAD-H264.htm
11. PowerEncoder MPEG-4 AVC (CyberLink Corp.)
http://www.cyberlink.com/multi/products/main_43_ENU.html
12. AMD ATI Avivo H.264 (ATI Technologies Inc. - now part of Advanced Micro Devices Inc.)
http://ati.amd.com/technology/avivo/h264.html
13. Mpegable AVC Codec (dicas digital image coding GmbH)
http://www.mpegable.com/mpegableDSsuite
14. Expert H.264 (PixelTools Corporation)
http://www.pixeltools.com/experth264.html
15. MPEG-2/HDV/H.264 software (KDDI R&D Labs. Inc.)
33
http://avs.kddilabs.jp/en/mpeg/mpfs/41/index.html
16. MiraVid Inc. H.264 decoder (MiraVid Inc.)
http://www.miravid.com/product_avcDec.html
17. bSoft ltd MPEG-X/H.26X Encoder and Decoder (bSoft ltd.)
http://www.bsoft.info/products/video.html
18. Fraunhofer IIS H.264 Codec (Fraunhofer IIS)
http://www.iis.fraunhofer.de/fhg/iis/EN/bf/amm/projects/video/index.jsp
19. Scientific Atlanta - UBLive-264-C64 (Scientific Atlanta (was UB Video Incorporated))
http://www.scientificatlanta.com/products/customers/UBvideo.htm
20. Roxio Popcorn with AVC encoder (Sonic Solutions)
http://www.roxio.com/enu/products/popcorn/standard/features.html
21. NEX VISION H.264 (NEX VISION)
http://www.nexvision.fr/html/products.htm
22. Video Labs H.264/AVC (Video Laboratories Ltd was Imagicity, UK)
http://www.vid-labs.com/products/products.htm
23. SPIRIT H.264 Video Codec (SPIRIT)
http://www.spiritdsp.com/products/components/video_codecs/h264/
24. CoreAVC H.264 Video Codec (CoreCodec, Inc.)
http://www.coreavc.com/
25. CINEMA CRAFT HD encoder (Omni Communications.)
http://www.omnidvdmedia.com/products_cinemacrafthde.shtml
A tabela 5 é uma lista de vinte e cinco implementações para o codec H.264
desenvolvidas por empresas com finalidades comerciais.
Tabela 6: Softwares OPEN-SOURCE para codecs H.264
Fonte: (MSU, 2009).
1. x264 HP encoder (free, supported by VideoLAN)
http://developers.videolan.org/x264.html
2. JM 9.6 reference H.264 encodec (free, supported by Joint Video Team ISO&ITU-T)
http://bs.hhi.de/~suehring/tml/
3. libavcodec H.264 Decoder (Project FFMPEG)
http://ffmpeg.mplayerhq.hu/
4. Minimal H.264 decoder (by Martin Fiedler)
http://keyj.s2000.ws/?page_id=41
5. Hdot264 Pre-Alpha (Project Hdot264)
http://sourceforge.net/projects/hdot264/
6. t264 (Project t264)
http://sourceforge.net/projects/t264
A tabela 6 exibe seis implementações para o padrão H.264 cujos códigos estão
abertos para usuários e desenvolvedores. Esses últimos codecs são de utilização livre, não
34
necessitando de uma licença para utilização. Desenvolvedores podem contribuir na correção
de erros e na documentação, desde que a condição de liberdade seja mantida.
Com a finalidade de avaliar os codecs do padrão H.264, as implementações
MainConcept H.264 da tabela 5 e o x264 da tabela 6 foram escolhidas para serem
comparadas. Aliado a isso, uma pesquisa, sobre aplicativos que pudessem quantificar a
qualidade entre os vídeos, foi efetuada. Devido ao déficit para encontrar tais ferramentas,
criou-se a necessidade de desenvolvimento de uma aplicação que atendesse essa premissa.
3 PROPOSTA DE CODIFICAÇÃO DE VÍDEOS
Este capítulo apresenta o desenvolvimento de uma aplicação que utiliza conceitos
de Computação Gráfica para comparar imagens. Sua utilização nesse trabalho será aplicada
sobre vídeos codificados a partir de codecs relacionados no capítulo 2.
3.1 Comparador de Imagens
A aplicação foi desenvolvida usando a linguagem de programação C# sob a
plataforma de desenvolvimento Microsoft© Visual Studio 2005. O principal objetivo dessa
ferramenta é apontar os pixels distintos entre as imagens e fornecer subsídios para quantificar
as diferenças entre elas.
3.1.1 Estrutura do programa
O programa é constituído basicamente por duas classes. A primeira classe contém
as funções para controle e processamento das imagens. A segunda representa uma entidade
para armazenamento das informações conseguidas após o processamento dos algoritmos de
varredura. Ambas as classe serão apresentadas abaixo e suas utilizações descritas na seção
3.1.2.
36
Fig. 4 - Classe ImagemResultante.
A figura 4 representa a classe ImagemResultante. Essa classe é a responsável por
armazenar informações sobre a comparação entre a imagem original e a imagem após o
processo de compressão. Nela são registrados valores que representam as quantidades de
níveis azuis, vermelhos e verdes não coincidentes, bem como o total de pixels que possuem
qualquer diferenciação nas imagens que forem comparadas. Os resultados guardados nessa
classe são exibidos posteriormente ao usuário da aplicação.
A exibição dos resultados calculados é exposta de duas formas distintas: através
de valores em forma de porcentagem e na forma de uma imagem resultante. A segunda forma
é uma imagem na qual os pixels distintos entre as imagens são realçados.
Fig. 5 - Classe Comparador.
A figura 5 representa a principal classe da aplicação. Nela estão implementadas as
funções Comparar, CalcularHistogramaRGB e a função PorcentagemDiferença.
A função Comparar executa um algoritmo desenvolvido para buscar os pixels
distintos entre imagens. A função CalcularHistogramaRGB calcula o histograma das imagens
e a PorcentagemDiferença a porcentagem de distinção entre as imagens.
37
3.1.2 Detecção de diferenças
A aplicação processa as diferenças entre as imagens analisando pixel a pixel. A
distinção dos pixels considera uma margem de distinção definida pelo usuário. Essa margem é
identificada na aplicação como “nível de comparação”.
O nível de comparação é um valor compreendido entre um e dez, utilizado para
definir o máximo e mínimo para considerar um pixel como diferente entre as imagens que
forem comparadas. Por exemplo, quando o valor assinalado for 10, um pixel que na escala de
cor vermelha possua um valor correspondente a 200, apenas será considerado diferente de um
com a mesma coordenada na imagem original e que esteja com o nível de vermelho acima de
210 ou abaixo de 190. Quanto maior for esse valor de comparação, menor será o critério para
distinguir os pixels.
Além disso, foi implementada uma função para calcular o Erro Quadrático Médio
(EQM). Dessa forma, pode-se obter um valor médio para as variações entre todos os níveis de
comparação e imagem original. O EQM é calculado seguindo a formula abaixo:
erms = e 2 sendo que e 2 =
1
N2
N −1 N −1
∑∑ e2 ( x, y) =
x =0 y =0
1
N2
N −1 N −1
2
∑∑[ g ( x, y) − f ( x, y)]
x =0 y =0
Outra opção para localizar alterações aborda a diferenciação entre os histogramas
das imagens. Para cada imagem selecionada a aplicação se encarregará de criar o histograma
RGB (Red, Green e Blue em português Vermelho, Verde e Azul) e exibi-lo para o usuário.
Os histogramas calculados são comparados e, assim como acontece com as
imagens, um terceiro histograma (HistogramaResultante) é criado ressaltando as diferenças
encontradas.
Apesar de trazer informações bastante pertinentes sobre as imagens, os
histogramas não serão utilizados como precursores para qualificar a compressão de uma
imagem. Eles serão significantes para validar o outro método de comparação.
Para os casos de teste a serem efetuados nesse trabalho, não se está interessado em
comparar mudanças nas tonalidades de cores, mas em identificar pontos com ruídos e
distorções além da média estabelecida pelo nível de comparação.
38
Quando o grau de diferenciação entre os histogramas for muito elevado (acima de
10%), significa dizer que a imagem sofreu grande alteração em um ou mais dos seus níveis de
cores. Em vista disso, segundos os critérios descritos, a imagem se tornou potencialmente
inapropriada para ser avaliada.
As funções de Comparar e CalcularHistograma foram implementadas com a
finalidade de criar formas para quantificar a diferença entre imagens e comparar os codecs no
padrão MPGE-4 AVC/H.264 respectivamente.
Fig. 6 - Algoritmo para detecção de pixels diferentes.
A figura 6 apresenta o algoritmo para detecção das diferenças entre as imagens
selecionadas no programa. O algoritmo parte do princípio que as imagens selecionadas
possuem a mesma dimensão. Analisa-se pixel a pixel comparando as diferenças entre os
níveis de azul, verde e vermelho.
39
Para caracterizar um pixel como diferente, o algoritmo leva em consideração o
nível de precisão determinado pelo usuário. O pixel a ser analisado deve estar entre um limite
inferior e superior calculado.
Ao ser caracterizado como um pixel diferente, o pixel é computado e suas
coordenadas são armazenadas na classe ImagemResultante apresentada na seção 3.1.1.
Uma imagem resultante é gerada a partir da imagem original contendo as
coordenadas armazenadas destacadas na cor verde para serem identificadas visualmente pelo
usuário conforme a seleção na interface da aplicação.
3.1.3 Interface
A interface foi elabora para ser simples e intuitiva. A tela principal do programa é
constituída de abas onde cada uma representará uma imagem a ser comparada ou os
resultados com as funções propostas pela aplicação.
40
Fig. 7 - Aba Imagem Original.
A figura 7 apresenta a primeira aba da aplicação. Nessa aba é disponibilizado o
botão Selecionar no qual ao ser selecionado, o usuário deverá escolher a imagem original a
ser comparada.
41
Fig. 8 - Aba Imagem Comparação.
A figura 8 apresenta a segunda aba da aplicação. Nessa aba, a exemplo da
primeira, o usuário deve escolher a segunda imagem a ser comparada com a imagem
selecionada na primeira aba.
42
Fig. 9 - Aba Imagem Resultado.
A terceira aba da aplicação, apresentada na figura 9, exibe os valores resultantes
da comparação entre as imagens anteriormente selecionadas. Nessa aba a função Comparar e
o “nível de comparação” estão disponibilizados para serem disparados e definidos pelo
usuário.
43
Fig. 10 - Aba Histogramas.
Na quarta aba da aplicação, mostrada na figura 10, exibe os histogramas RGB da
primeira e da segunda imagem, juntamente com a sua comparação. Os histogramas são
exibidos após a seleção da função MostrarHistogramas disponibilizada para o usuário.
3.2 Casos de Testes
Como propósito deste trabalho, foram testadas as implementações de dois codecs
que seguem o padrão H.264. Os codecs selecionados foram:
- x264 HP encoder (livre, mantido pela VideoLAN)
- Mainconcept H.264 (pago, desenvolvido pela MainConcept AG) – versão
experimental (trial)
44
O x264 foi escolhido devido a sua alta aceitação e referência meio aos codecs
gratuitos. A possibilidade de entender melhor as suas características, tornou-o uma escolha
bastante atrativa, sendo algumas dessas listadas a seguir (VIDEOLAN, 2009):
- Transformada adaptativa 8x8 e 4x4.
- Ordenação arbitrária de quadros.
- Codificação de entropia CAVLC (Context-Based Adaptive Variable Length
Coding - redundâncias de codificação explorada pela comutação de tabelas baseada pelo uso
de contextos entre diferentes tamanhos variáveis de símbolos já codificados).
- Codificação CABAC (Context-Based Adaptive Binary Arithmetic Coding redundância de codificação explorada pelo uso de contextos entre diferentes modelos
aritméticos de probabilidade de acordo com os símbolos já codificados).
- Matrizes de quantização customizadas.
- Todos os tipos de macroblocos (16x16, 8x8, 4x4).
- Referência a múltiplos quadros.
- Controle de taxas: quantificador constante, qualidade constante.
- Paralelismo e codificação em múltiplas CPUs.
A escolha do codec MainConcept H.264 foi feita devido ao codec ser descrito por
oferecer rápida velocidade para codificação e decodificação em todos os perfis e níveis
padrões (MAINCONCEPT, 2009). Muitas de suas principais características são iguais ou
semelhantes ao x264, entretanto informações detalhando o seu funcionamento não estão
disponíveis devido ao fato do MainConcept H.264 não ser um código.
Para efeito de teste, os dois codecs foram aplicados sobre uma gravação de 10
segundos, contendo imagens de divulgação da cidade de Paris, na França. Essa gravação
estava na resolução de 1920x1080 (resolução da TV digital) e era executada a uma taxa de
29,970 quadros por segundos.
Os softwares para aplicar os codificadores sobre o vídeo eram softwares livres.
Para o x264, foi utilizado o MeGUI Modern Media Encoder versão 0.3.1.1037 e para o
MainConcept H.264 foi utilizado o MainConcept Reference v1.6.1.35781 desenvolvido pela
MainConcept GmbH.
45
Ambos os softwares foram configurados buscando preservar o máximo da
resolução (1920x1080) e taxas do vídeo original (10000kbps). Sendo os dois executados em
um computador com um processado Intel(R) Pentium(R) Dual CPU E2140 com 1,60GHz,
memória (RAM) de 2GB no sistema operacional Windows Vista™ Ultimate de 64 Bits.
3.3 Resultados
Os processos de compressão desempenhados pelos programas MeGUI (para o
x264) e MainConcept Reference (para o MainConcept H.264) tiveram uma execução bastante
rápida. O arquivo de vídeo original possuía 299 quadros e para o codec MainConcept H.264 o
processo de compressão foi finalizado numa taxa de 3,0 quadros por segundo, enquanto o
x264 manteve uma média de 1,55. Nesse caso, o x264 foi superior por terminar o processo de
compressão cerca de 51,6% mais rápido.
Inicialmente, o vídeo selecionado para os testes, ocupava um espaço de 1,73GB
para armazenamento, sendo que para o codec MainConcept H.264, nas configurações
selecionadas, o arquivo final ocupou apenas 12,2MB e para o x264 o arquivo ficou com um
tamanho de 11,5MB. Portanto, o x264 também foi superior nesse quesito por necessitar de
menos espaço físico. A tabela 7 mostra esses resultados:
Tabela 7: Diferença entre tamanhos e taxa média entre os codec.
Diferenças analisadas
Original
MainConcept H.264
x264
Quantidade de Quadros
299
299
299
Espaço para armazenamento
1,73GB
12,2MB
11,5MB
Taxa de compressão
-
3,0fps
1,55fps
Tempo total para compressão
-
1min e 39s
3min e 12s
Após o processo de compressão se utilizou a ferramenta desenvolvida para
comparar os quadros de números 00, 10, 100, 200 e 290. As figuras 7 a 14 ilustram a
comparação entre os quadros 00 e 290.
46
Fig. 11 - Quadro 00 codificado com o MainConcept H.264.
A figura 11 retrata a imagem resultante da comparação entre o quadro 00 do vídeo
comprimido pelo MainConcept H.264 com o quadro equivalente do vídeo original. O “nível
de comparação” selecionado correspondeu ao valor cinco e as porcentagens observadas na
parte inferior da figura foram utilizadas no processo de avaliação dos codecs.
47
Fig. 12 - Quadro 00 codificado com o x264.
A figura 12 retrata a imagem resultante da comparação entre o quadro 00 do vídeo
comprimido pelo x264 com o quadro 00 do vídeo original. Assim como na figura 11 o “nível
de comparação” selecionado correspondeu ao valor cinco e na parte inferior da figura estão as
porcentagens utilizadas no processo de avaliação dos codecs.
48
Fig. 13 - Quadro 290 codificado com o MainConcept H.264.
A figura 13 retrata a imagem resultante da comparação entre o quadro 290 do
vídeo comprimido pelo MainConcept H.264 com o quadro correspondente do vídeo original.
O “nível de comparação” selecionado foi o valor sete devido ao quadro selecionado possuir
mais contornos e detalhes do que o quadro 00. As porcentagens na parte inferior da figura
foram utilizadas para qualificar o processo de compressão.
49
Fig. 14 - Quadro 290 codificado com o x264.
A figura 14 retrata a imagem resultante da comparação entre o quadro 290 do
vídeo comprimido pelo x264 com o quadro correspondente do vídeo original. O “nível de
comparação” selecionado foi sete e as porcentagens na parte inferior da figura serão utilizadas
para no processo de avaliação entre os codecs.
Todas as imagens exibem diferenças entre os quadros compactados. As tabelas de
8 a 12 expõem a relação entre os níveis de cada cor possível de todos os quadros verificados
pela aplicação.
50
Tabela 8: Diferença entre níveis RGB do quadro 00 das imagens comparadas.
Erro Quadrático Médio
MainConcept H.264
x264
Níveis de azul
20,94%
17,99%
Níveis de vermelho
19,31%
18,00%
Níveis de verde
16,21%
15,92%
Todos os níveis
27,36%
24,86%
Tabela 9: Diferença entre níveis RGB do quadro 10 das imagens comparadas.
Erro Quadrático Médio
MainConcept H.264
x264
Níveis de azul
23,77%
23,93%
Níveis de vermelho
21,65%
22,18%
Níveis de verde
18,02%
19,78%
Todos os níveis
30,81%
30,67%
Tabela 10: Diferença entre níveis RGB do quadro 100 das imagens comparadas.
Erro Quadrático Médio
MainConcept H.264
x264
Níveis de azul
22,04%
21,34%
Níveis de vermelho
20,13%
19,84%
Níveis de verde
16,66%
17,61%
Todos os níveis
28,86%
27,47%
Tabela 11: Diferença entre níveis RGB do quadro 200 das imagens comparadas.
Erro Quadrático Médio
MainConcept H.264
x264
Níveis de azul
29,47%
26,18%
Níveis de vermelho
26,79%
24,02%
Níveis de verde
23,62%
21,60%
Todos os níveis
37,35%
33,12%
Tabela 12: Diferença entre níveis RGB do quadro 290 das imagens comparadas.
Erro Quadrático Médio
MainConcept H.264
x264
Níveis de azul
27,77%
28,45%
Níveis de vermelho
25,33%
26,74%
Níveis de verde
21,95%
24,21%
Todos os níveis
35,57%
36,06%
As tabelas evidenciam o grau de distinção entre as imagens que foram
comparadas com a imagem original. A informação “Todos os níveis” considera todos os
pixels que foram calculados como diferentes em qualquer uma das três cores (RGB) ou na
combinação dessas.
51
Para a comparação através de histogramas, as figuras 15 a 18 ilustram os
resultados analisados dos quadros 00 e 290.
Fig. 15 - Histogramas x264 do quadro 00.
A figura 15 exibe o histograma do quadro 00 do vídeo original, do vídeo
compactado pelo codec x264 e um terceiro histograma que é a sobreposição dos anteriores. A
diferença entre esses histogramas foi calculada em 3,0%.
52
Fig. 16 - Histogramas MainConcept H.264 do quadro 00.
A figura 16 exibe o histograma do quadro 00 do vídeo original, do vídeo
compactado pelo codec MainConcept H.264 e um terceiro histograma que é a sobreposição
dos anteriores. A diferença entre esses histogramas foi calculada em 3,0%.
53
Fig. 17 - Histogramas x264 do quadro 290.
A figura 17 exibe o histograma do quadro 290 do vídeo original, do vídeo
compactado pelo codec x264 e um terceiro histograma que é a sobreposição dos outros dois
citados. A diferença entre esses histogramas foi calculada em 1,7%.
54
Fig. 18 - Histogramas MainConcept H.264 do quadro 290.
A figura 18 exibe o histograma do quadro 290 do vídeo original, do vídeo
compactado pelo codec MainConcept H.264 e um terceiro histograma que é a sobreposição
dos outros dois citados. A diferença entre esses histogramas foi calculada em 2,7%.
Os histogramas são essenciais para identificar alterações que possam
comprometer a análise dos resultados. As informações que foram geradas pela aplicação
foram utilizadas como subsídios para avaliar os codecs.
Analisando os resultados da aplicação tanto o codec MainConcept H.264 quanto o
x264 obtiveram padrões equivalentes nas comparações. A amostra dos cinco quadros revelou
equilíbrio entre os dois codecs. Nenhuma das comparações apresentou uma discrepância
maior do que 4% em nenhum dos casos.
55
Os histogramas dos quadros também não apresentaram uma distorção
considerável (maior do que 10%). Isso legitima a comparação por dar a certeza de não ter
havido uma alteração acentuada em nenhum dos níveis de cores das imagens.
Com relação ao espaço de armazenamento final, o codec x264 gerou um arquivo
que correspondia a aproximadamente 0,65% do tamanho original, enquanto o MainConcept
H.264 gerou um equivalente a 0,69%. Nesse aspecto, o x264 foi um pouco superior ao
MainConcept H.264.
Catalogando-se os resultados de tamanho final do arquivo com os resultados
relacionados pela ferramenta desenvolvida, é possível afirmar que o codec x264 conseguiu
atingir uma qualidade equivalente ao MainConcept H.264 ocupando menos espaço para
armazenamento do vídeo.
4 CONCLUSÃO
Neste trabalho, foram avaliados codecs x264 e o MainCocept para compressão de
vídeos, de alta definição, codificados segundo as especificações do H.264/AVC. Essa
avaliação foi feita através da proposta de um método de comparação por meio do
desenvolvimento de uma nova aplicação.
A aplicação foi criada em C# sob a plataforma de desenvolvimento Microsoft©
Visual Studio 2005, cuja grande colaboração se dá na área de processamento de imagens, pois
faz comparações entre as imagens (ou sequência de imagens) fornecendo como resultados
valores quantitativos e qualitativos. Valores quantitativos obtidos através do cálculo do
número de pixels distintos e dos histogramas. Valores qualitativos observados pela
identificação de pontos nas imagens geradas como resultado.
Análises do capítulo 3, motivações deste trabalho, sugerem a utilização da
aplicação como determinante para calcular as diferenças entre imagens. Segundo os
resultados obtidos, tanto o codec MainConcept H.264 quanto o x264, obtiveram padrões de
qualidade equivalentes. Os cinco quadros analisados mantiveram um equilíbrio, nenhum deles
com uma diferença maior do que 4% em relação ao quadro original.
As implementações para o padrão H.264/AVC analisadas apresentaram vídeos
que psicovisualmente não acarretavam em perdas drásticas. Elas atenderam ao propósito de
compressão de vídeo gerando arquivos admiravelmente menores (uma taxa em torno de
1:155), preservando a resolução e a informação do vídeo original.
Os resultados acerca do espaço de armazenamento revelaram uma superioridade
do codec x264 (0,65%) em relação ao MainConcept H.264 (0,69%), inclusive se levado em
57
consideração o tempo total para compressão (1 minuto e 39 segundos para o x264 e 3 minutos
e 12 segundos para o MainConcept H.264).
Provido dos resultados, fornecidos pela aplicação e das observações acerca do
espaço físico para armazenamento dos vídeos, pôde-se concluir que o codec x264 foi melhor
do que o MainConcept H.264 por atingir uma qualidade de imagem equivalente ocupando
menos espaço.
A confirmação da equivalência entre as qualidades das imagens apenas pôde ser
comprovada graças ao comparador de imagem. O aplicativo se mostrou eficiente dentro da
sua proposta, ampliando a confiabilidade sobre o processo de comparação. Alerta-se apenas
ao fato de que a credibilidade dos resultados esta atrelada à configuração equivalente entre os
codecs e a seleção de amostras adequadas do vídeo.
Cabe ainda salientar que o capítulo 2 relaciona o padrão de compressão de vídeos
e imagens digitais com a TV Digital brasileira e os resultados obtidos confirmam então a
eficácia do padrão H.264/AVC.
A aplicação desenvolvida foi projetada inicialmente para atender a necessidade de
comparação entre processos de compressão. Entretanto, sua utilização pode ser ampliada para
diversas áreas da Computação Gráfica, como exemplo, na detecção de movimentos.
Por distinguir diferenças entre imagens, como finalidade primordial, essa
característica poderá ser aplicada para identificar, por exemplo, mudanças de padrões ou
deslocamento de objetos numa imagem. Em uma situação hipotética, fotos de florestas tiradas
por satélites poderiam ser analisadas e, a partir dos resultados encontrados, identificado locais
que sofreram alguma devastação.
A explanação sobre o padrão H.264 também oferece subsídios para a
implementação de softwares para aplicar o padrão em arquivos de vídeos. Um estudo
profundo sobre o codec pode identificar melhorias de forma a continuar sua evolução e
constituir futuramente o padrão H.265.
58
REFERÊNCIAS
ASSOCIAÇÃO BRASILEIRA DE NORMAS TÉCNICAS. NBR 15602-1:
Televisão digital terrestre — Codificação de vídeo, áudio e multiplexação
Parte 1: Codificação de vídeo. Rio de Janeiro, 2007.
AZEVEDO, Eduardo; CONCI , Aura; LETA, Fabiana R.. Computação
Gráfica. ed. 2. Rio de Janeiro: Campus, 2008.
BENOIT, Hervé. Digital Television: Satellite, Cable, Terrestrial, IPTV,
Mobile TV in the DVB Framework. 4. ed. Paris: Elsevier, 2008.
FLORIDI, Luciano. Is Information Meaningful Data?. Philosophy and
Phenomenological Research, 70 (2), pp. 351 - 370.
FONSECA, T. A. Redução de Complexidade na Compressão de Vídeo de
Alta Resolução. 2008. Dissertação (Mestrado em Engenharia Elétrica) Departamento de Engenharia Elétrica, Universidade de Brasília, 2008.
GONZALEZ , Rafael C.; WOODS, Richar E. Processamento de Imagens
Digitais. Edgard Blücher, 2000.
HANZO, L.; CHERRIMAN, P. J.; STREIT , J.. Video Compression and
Communications From Basics to H.261, H.263, H.264, MPEG4 for DVB
and HSDPA-Style Adaptive Turbo-Transceivers. 2. ed. Wiley, 2007.
HEARN, Donald; BAKER, M. Pauline. Computer Graphics with OpenGL.
3ed. Prentice-Hall International, 2004.
LINHARES, Gilmara; DINIZ, Janderson; CORREIA, Suzete. Estudo de
algoritmos para a compressão de imagens, 2007.
MAINCONCEPT, MainConcept: The Codec People®. H.264/ AVC Codec
Package. Disponível em: <http://www.mainconcept.com/site/developerproducts-6/pc-based-sdks-20974/codec-sdk-20946/h264avc-733/information4786.html>. Acesso em: 10 de Fevereiro de 2009.
MANUEL, Edson T. M. Codificação de Vídeo H.264 – Estudo de
Codificação Mista de Macroblocos. Dissertação (Mestrado em Engenharia
Elétrica) - Universidade Federal de Santa Catarina, 2008.
MARQUES FILHO, Ogê, VIEIRA NETO, Hugo. Processamento Digital de
Imagens. Rio de Janeiro: Brasport, 1999.
59
MSU, Michigan State University. Video filtering and compression. Disponível
em: <http://graphics.cs.msu.su/> Acesso em: 10 de Fevereiro de 2009.
PU, Ida Mengyi. Fundamental Data Compression. 1. ed. Elsevier, 2006.
REED, Todd R. Digital Image Sequence Processing, Compression, and
Analysis. CRC Press, 2005.
SETZER, Valdemar W. Dado, Informação, Conhecimento e Competência.
2005. Disponível em: <http://www.ime.usp.br/~vwsetzer/dado-info.html>
Acesso em: 10 de Fevereiro de 2009.
STOLFI, Guido. Televisão Digital e HDTV – TV de Alta Definição. 2004.
VIDEOLAN. x264 - a free h264/avc encoder. Disponível em:
<http://www.videolan.org/developers/x264.html> Acesso em: 10 de Fevereiro
de 2009.
WOOTON, Cliff. A Practical Guide to Video and Audio Compression: From
Sprockets and Rasters to Macroblocks. Elsevier, 2005.
60
APÊNDICE A – CLASSE COMPARADOR
using
using
using
using
using
System;
System.Collections.Generic;
System.Text;
System.Drawing;
System.Windows.Forms;
namespace ComparadorImagens
{
public static class Comparador
{
//Enumerador utilizado para identificar qual nível está sendo calculado
public enum TipoDiferenca
{
Vermelho, Verde, Azul, Total
}
public static ImagemResultante Comparar(Bitmap objImagemA, Bitmap objImagemB, int
itNivelComparacao)
{
ImagemResultante objImagemResultante = new ImagemResultante();
objImagemResultante.Imagem = new Bitmap(objImagemA);
Color ca;
Color cb;
bool blPixelDiferente;
//Verifica se o tamanho da imagem é o mesmo
if (objImagemA.Size == objImagemB.Size)
{
for (int i = 0; i < objImagemA.Size.Width; i++)
{
for (int j = 0; j < objImagemA.Size.Height; j++)
{
ca = objImagemA.GetPixel(i, j);
cb = objImagemB.GetPixel(i, j);
blPixelDiferente = false;
//Nível de Azul diferente
if (ca.B > cb.B + itNivelComparacao || ca.B < cb.B itNivelComparacao)
{
blPixelDiferente = true;
objImagemResultante.Azul++;
}
//Nível de Verde diferente
if (ca.G > cb.G + itNivelComparacao || ca.G < cb.G itNivelComparacao)
{
objImagemResultante.Verde++;
}
//Nível de Vermelho diferente
if (ca.R > cb.R + itNivelComparacao || ca.R < cb.R itNivelComparacao)
{
blPixelDiferente = true;
objImagemResultante.Vermelho++;
}
if (blPixelDiferente)
{
objImagemResultante.Imagem.SetPixel(i, j, Color.GreenYellow);
objImagemResultante.PixelsDiferentes++;
}
}
}
}
return objImagemResultante;
61
}
public static ImagemResultante CalcularEQM(Bitmap objImagemA, Bitmap objImagemB)
{
List<ImagemResultante> lstImagemResultante = new List<ImagemResultante>();
ImagemResultante objImagemResultanteRetorno = new ImagemResultante();
//Executa loop para 10 níveis
for (int itNivelComparacao = 0; itNivelComparacao < 11; itNivelComparacao++)
{
lstImagemResultante.Add(Comparar(objImagemA, objImagemB, itNivelComparacao));
}
//Somatório para todos os níveis
foreach (ImagemResultante objImagemResultante in lstImagemResultante)
{
objImagemResultanteRetorno.Azul += objImagemResultante.Azul;
objImagemResultanteRetorno.Verde += objImagemResultante.Verde;
objImagemResultanteRetorno.Vermelho += objImagemResultante.Vermelho;
objImagemResultanteRetorno.PixelsDiferentes +=
objImagemResultante.PixelsDiferentes;
}
double db = (double)1 /(11 * 11);
//Calculo do EQM
objImagemResultanteRetorno.Azul =
Convert.ToInt32(Math.Sqrt((double)objImagemResultanteRetorno.Azul *
objImagemResultanteRetorno.Azul * db));
objImagemResultanteRetorno.Verde =
Convert.ToInt32(Math.Sqrt((double)objImagemResultanteRetorno.Verde *
objImagemResultanteRetorno.Verde * db));
objImagemResultanteRetorno.Vermelho =
Convert.ToInt32(Math.Sqrt((double)objImagemResultanteRetorno.Vermelho *
objImagemResultanteRetorno.Vermelho * db));
objImagemResultanteRetorno.PixelsDiferentes =
Convert.ToInt32(Math.Sqrt((double)objImagemResultanteRetorno.PixelsDiferentes *
objImagemResultanteRetorno.PixelsDiferentes * db));
objImagemResultanteRetorno.Imagem = lstImagemResultante[0].Imagem;
return objImagemResultanteRetorno;
}
public static string ErroQuadratico(ImagemResultante objImagemResultante,
TipoDiferenca enuTipoDiferenca)
{
string stEQM = string.Empty;
float itPixelTotal = objImagemResultante.Imagem.Size.Height *
objImagemResultante.Imagem.Size.Width;
//Retorna o texto com os valores calculados
switch (enuTipoDiferenca)
{
case TipoDiferenca.Azul:
stEQM = "EQM dos pixels em níveis de azul: " + (objImagemResultante.Azul *
100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Verde:
stEQM = "EQM dos pixels em níveis de verde: " + (objImagemResultante.Verde
* 100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Vermelho:
stEQM = "EQM dos pixels em níveis de vermelho: " +
(objImagemResultante.Vermelho * 100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Total:
stEQM = "EQM total dos pixels em entre as imagens: " +
(objImagemResultante.PixelsDiferentes * 100 / itPixelTotal) + "%";
break;
}
return stEQM;
}
62
public static string PorcentagemDiferenca(ImagemResultante objImagemResultante,
TipoDiferenca enuTipoDiferenca)
{
string stPorcentagem = string.Empty;
float itPixelTotal = objImagemResultante.Imagem.Size.Height *
objImagemResultante.Imagem.Size.Width;
//Retorna o texto com os valores calculados
switch (enuTipoDiferenca)
{
case TipoDiferenca.Azul:
stPorcentagem = "Diferença entre níveis de azul: " +
(objImagemResultante.Azul * 100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Verde:
stPorcentagem = "Diferença entre níveis de verde: " +
(objImagemResultante.Verde * 100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Vermelho:
stPorcentagem = "Diferença entre níveis de vermelho: " +
(objImagemResultante.Vermelho * 100 / itPixelTotal) + "%";
break;
case TipoDiferenca.Total:
stPorcentagem = "Diferença entre as imagens: " +
(objImagemResultante.PixelsDiferentes * 100 / itPixelTotal) + "%";
break;
}
return stPorcentagem;
}
public static Bitmap CalcularHistogramaRGB(Bitmap objImagemA, ref string stFrequencia,
int itResolucaoAnterior)
{
int[] objHistograma = new int[256];
int maior = 0;
int posicaomaior = 0;
Color ca = new Color();
Bitmap bmp = new Bitmap(256, 101);
//Percorre a imagem e atribui os valores RGB para ser adicionado posteriormente no
histograma
for (int i = 0; i < objImagemA.Size.Width; i++)
{
for (int j = 0; j < objImagemA.Size.Height; j++)
{
ca = objImagemA.GetPixel(i, j);
objHistograma[ca.R]++;
objHistograma[ca.G]++;
objHistograma[ca.B]++;
}
}
//Busca o maior nível do histograma
for (int a = 0; a < objHistograma.Length; a++)
{
if (objHistograma[a] > maior)
{
maior = objHistograma[a];
posicaomaior = a;
}
}
stFrequencia = maior.ToString();
//Verifica qual dos histogramas tem o maior nível
if (itResolucaoAnterior != 0)
{
if (itResolucaoAnterior > maior)
maior = itResolucaoAnterior;
}
//Cria imagem (background) ao qual será atribuído os valores do histograma
for (int i = 0; i < bmp.Size.Width; i++)
{
for (int j = 0; j < bmp.Size.Height; j++)
63
{
bmp.SetPixel(i, j, Color.Aqua);
}
}
//Cria histograma RGB
for (int i = 255; i > -1; i--)
{
int quantidade = objHistograma[i] * 100 / maior;
for (int j = 100; j > 100 - quantidade; j--)
{
bmp.SetPixel(i, j, Color.Black);
}
}
return bmp;
}
}
}
64
APÊNDICE B – CLASSE IMAGEM
using
using
using
using
System;
System.Collections.Generic;
System.Text;
System.Drawing;
namespace ComparadorImagens
{
public class ImagemResultante
{
//Pixels totais encontrados como diferentes
int itPixelsDiferentes;
//Pixels Verde distintos
int itPixelVerde;
//Pixels Vermelho distintos
int itPixelVermelho;
//Pixels Azul distintos
int itPixelAzul;
//Imagem resultante do calculo de diferença
Bitmap imgResultante;
public int PixelsDiferentes
{
get { return itPixelsDiferentes; }
set { itPixelsDiferentes = value; }
}
public int Verde
{
get { return itPixelVerde; }
set { itPixelVerde = value; }
}
public int Vermelho
{
get { return itPixelVermelho; }
set { itPixelVermelho = value; }
}
public int Azul
{
get { return itPixelAzul; }
set { itPixelAzul = value; }
}
public Bitmap Imagem
{
get { return imgResultante; }
set { imgResultante = value; }
}
}
}
65
APÊNDICE C – CLASSE FORMPRINCIPAL
using
using
using
using
using
using
using
System;
System.Collections.Generic;
System.ComponentModel;
System.Data;
System.Drawing;
System.Text;
System.Windows.Forms;
namespace ComparadorImagens
{
public partial class FormPrincipal : Form
{
public FormPrincipal()
{
InitializeComponent();
//Inicializa a label do nível de comparação
lblNComparacao.Text = tkbNivel.Value.ToString();
}
private void btnSelecionarImgOriginal_Click(object sender, EventArgs e)
{
//Mostra a janela para selecionar a imagem
opfImgOriginal.ShowDialog();
}
private void btnSelecionarImgComparacao_Click(object sender, EventArgs e)
{
//Mostra a janela para selecionar a imagem
opfImgComparacao.ShowDialog();
}
private void opfImgOriginal_FileOk(object sender, CancelEventArgs e)
{
//Atribui a imagem do local selecionado
pcbOriginal.ImageLocation = opfImgOriginal.FileName;
}
private void opfImgComparacao_FileOk(object sender, CancelEventArgs e)
{
//Atribui a imagem do local selecionado
pcbImagemComparacao.ImageLocation = opfImgComparacao.FileName;
}
private void btnComparar_Click(object sender, EventArgs e)
{
//Inicializa a label do nível de comparação
lblNComparacao.Text = tkbNivel.Value.ToString();
//Verificação para evitar erros na aplicação
if (pcbOriginal.Image == null || pcbImagemComparacao.Image == null)
{
MessageBox.Show("Você deve selecionar as imagens antes de fazer a
comparação.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
ImagemResultante objImagemResultante = Comparador.Comparar(new
Bitmap(pcbOriginal.Image), new Bitmap(pcbImagemComparacao.Image), tkbNivel.Value);
pcbImgResultado.Image = objImagemResultante.Imagem;
//Carrega os resultados entre as imagens
lblNivelAzul.Text = Comparador.PorcentagemDiferenca(objImagemResultante,
Comparador.TipoDiferenca.Azul);
lblNivelVerde.Text = Comparador.PorcentagemDiferenca(objImagemResultante,
Comparador.TipoDiferenca.Verde);
lblNivelVermelho.Text = Comparador.PorcentagemDiferenca(objImagemResultante,
Comparador.TipoDiferenca.Vermelho);
lblPorcentagem.Text = Comparador.PorcentagemDiferenca(objImagemResultante,
Comparador.TipoDiferenca.Total);
}
}
66
private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
{
//Informações sobre o desenvolvedor do sistema
MessageBox.Show("Desenvolvido por Vilker Silva Bezerra\n Versão: 1.1", "Sobre",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void bntHistograma_Click(object sender, EventArgs e)
{
//Verificação para evitar erros na aplicação
if (pcbOriginal.Image == null || pcbImagemComparacao.Image == null)
{
MessageBox.Show("Você deve selecionar as imagens antes de fazer a
comparação.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
tbcPrincipal.SelectTab(tbHistograma);
string stfx = "0";
pcbHistograma1.Image = Comparador.CalcularHistogramaRGB(new
Bitmap(pcbOriginal.Image), ref stfx, 0);
lblFxOriginal.Text = stfx;
pcbHistograma2.Image = Comparador.CalcularHistogramaRGB(new
Bitmap(pcbImagemComparacao.Image), ref stfx, Convert.ToInt32(stfx));
lblFxComparacao.Text = stfx;
ImagemResultante objImagemResultante = Comparador.Comparar(new
Bitmap(pcbHistograma1.Image), new Bitmap(pcbHistograma2.Image), 0);
pcbHistogramaComparacao.Image = objImagemResultante.Imagem;
lblDiferencaHistogramas.Text =
Comparador.PorcentagemDiferenca(objImagemResultante, Comparador.TipoDiferenca.Total);
}
}
private void tkbNivel_Scroll(object sender, EventArgs e)
{
lblNComparacao.Text = tkbNivel.Value.ToString();
}
private void btnErroQuadratidoMedio_Click(object sender, EventArgs e)
{
//Verificação para evitar erros na aplicação
if (pcbOriginal.Image == null || pcbImagemComparacao.Image == null)
{
MessageBox.Show("Você deve selecionar as imagens antes de fazer a
comparação.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else
{
ImagemResultante objImagemResultante = Comparador.CalcularEQM(new
Bitmap(pcbOriginal.Image), new Bitmap(pcbImagemComparacao.Image));
//Atribui um "-" para label do nível de comparação
lblNComparacao.Text = "-";
pcbImgResultado.Image = objImagemResultante.Imagem;
//Carrega o EQM entre as imagens
lblNivelAzul.Text = Comparador.ErroQuadratico(objImagemResultante,
Comparador.TipoDiferenca.Azul);
lblNivelVerde.Text = Comparador.ErroQuadratico(objImagemResultante,
Comparador.TipoDiferenca.Verde);
lblNivelVermelho.Text = Comparador.ErroQuadratico(objImagemResultante,
Comparador.TipoDiferenca.Vermelho);
lblPorcentagem.Text = Comparador.ErroQuadratico(objImagemResultante,
Comparador.TipoDiferenca.Total);
}
}
}
}
67
APÊNDICE D – DIAGRAMA DE CLASSES

Documentos relacionados