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