Upload
nguyenhanh
View
216
Download
0
Embed Size (px)
Citation preview
Universidade de Aveiro 2007
Departamento de Electrónica, Telecomunicações e Informática
PEDRO MIGUEL DE JESUS FIGUEIREDO
REMOÇÃO DO EFEITO DE OLHOS VERMELHOS EM FOTOGRAFIA DIGITAL
Universidade de Aveiro
2007 Departamento de Electrónica, Telecomunicações e Informática
PEDRO MIGUEL DE JESUS FIGUEIREDO
REMOÇÃO DO EFEITO DE OLHOS VERMELHOS EM FOTOGRAFIA DIGITAL
dissertação apresentada à Universidade de Aveiro para cumprimento dos requisitos necessários à obtenção do grau de Mestre em Engenharia Electrónica e Telecomunicações, realizada sob a orientação científica do Dr. Armando José Formoso de Pinho, Professor Associado do Departamento de Electrónica, Telecomunicações e Informática da Universidade de Aveiro
o júri
presidente Doutor Tomás António Mendes de Oliveira e Silva Prof. Associado da Universidade de Aveiro
orientador Doutor Armando José Formoso de Pinho Prof. Associado da Universidade de Aveiro
Doutor Vitor Manuel Jesus Filipe Prof. Auxiliar da Universidade de Trás-os-Montes e Alto Douro
agradecimentos
Agradeço a todos que directamente, ou indirectamente, contribuíram de algummodo para este trabalho. A todos os que me deram apoio quando precisei e me incentivaram quando mais precisava. Em especial um muito obrigado ao engenheiro António J. R. Neves, sem oqual a conclusão deste trabalho não tinha sido possível.
palavras-chave
JPEG, efeito de olhos vermelhos, codificação sequencial, codificação, descodificação, algoritmo, Huffman, quantização, codificação por transformada, codificação diferencial.
resumo
Nesta dissertação apresentamos um sistema para remoção do efeito de olhosvermelhos em fotografia digital no formato JPEG. Este sistema é semi-automático e tem como principal característica apenas re-codificar os blocos de imagem correspondentes à zona modificada, deixando todos os outrosblocos inalterados. Para a sua implementação foi necessário um estudo detalhado da norma JPEG de modo a desenvolver um descodificador paraeste tipo de imagens. Para re-codificar os blocos modificados foi desenvolvido um algoritmo simples que, usando a informação contida no ficheiro, codifica osblocos modificados de uma forma eficiente. Para a eliminação do efeito de olhos vermelhos foram desenvolvidos diversos algoritmos e efectuado umconjunto de testes de modo a comparar os resultados obtidos.
keywords
JPEG, red eye effect, sequential coding, encoding, decoding, algorithm, Huffman, quantization, transform coding, differential coding.
abstract
In this dissertation we present a system to remove the red eye effect of digital photos in JPEG format. This system is semi-automatic and its principal goal is that of only encoding the modified blocks of the image, leaving all the otherblocks unchanged. For this implementation it was necessary a detailed study of the JPEG norm, in order to develop a decoder for this type of images. To re-encode the modified blocks it was developed a simple algorithm that, using the information contained in the file, encodes the modified blocks efficiently. To remove the red eye effect diverse algorithms had been developed and a set of tests were made in order to compare the results.
Conteudo
1 Introducao 1
1.1 O porque dos olhos vermelhos . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Objectivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Norma JPEG 5
2.1 Descricao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1 JPEG progressivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2 JPEG hierarquico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.3 JPEG sem perdas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.4 JPEG sequencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.5 Princıpios da codificacao JPEG no modo sequencial . . . . . . . . . . 9
2.2 Organizacao do ficheiro codificado . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Estrutura detalhada de um ficheiro JPEG . . . . . . . . . . . . . . . . . . . . 12
2.4 Compressao de imagens com multiplas componentes . . . . . . . . . . . . . . 14
3 Trabalho realizado 17
3.1 Descodificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.1.1 Descodificacao do cabecalho . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.2 Descodificacao dos dados . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.3 Marcas de controlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Copia e Codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.2.1 Copia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.2.2 Codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.3 Princıpio da codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.2.4 Exemplo de codificacao de um bloco . . . . . . . . . . . . . . . . . . . 37
3.3 Algoritmos para a Remocao do efeito de olhos vermelhos . . . . . . . . . . . . 40
3.3.1 Deteccao da zona afectada . . . . . . . . . . . . . . . . . . . . . . . . . 40
i
CONTEUDO
3.3.2 Algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3.3 Algoritmo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3.4 Algoritmo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.3.5 Algoritmo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.3.6 Algoritmo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4 Resultados 45
5 Conclusoes 57
6 Anexo 59
6.1 Manual do software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7 Referencias 63
ii
Lista de Figuras
1.1 Gato com efeito de olhos amarelos . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objectivos do trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1 Exemplo de uma imagem progressiva . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Exemplo de uma imagem hierarquica . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Pixels vizinhos (A, B e C) usados na predicao do valor do pixel que se quer
codificar (X) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Exemplo de uma imagem sequencial . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 Codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.6 Processo de codificacao mais detalhado . . . . . . . . . . . . . . . . . . . . . . 9
2.7 Compressao de imagens com multiplas componentes . . . . . . . . . . . . . . 15
3.1 Descodificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 Processo de descodificacao mais detalhado . . . . . . . . . . . . . . . . . . . . 17
3.3 Diagrama da descodificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 Formato Zig-Zag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.5 Tabela de tamanhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.6 Tabela de codigos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.7 Procedimento para ordenar os codigos de Huffman por tamanho . . . . . . . 22
3.8 Descodificar imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.9 Codificacao diferencial do DC . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10 Ficheiro descomprimido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.11 Zona de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.12 Descodificacao e Codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.13 Codificacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.14 Processo de codificacao mais detalhado . . . . . . . . . . . . . . . . . . . . . . 33
3.15 Codificar imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.16 Ficheiro codificado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
iii
LISTA DE FIGURAS
3.17 Histograma de cores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.18 Imagem 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.19 Algoritmo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.20 Diferenca para o algoritmo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.21 Imagem 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.22 Algoritmo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.23 Diferenca para o algoritmo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.24 Imagem 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.25 Algoritmo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.26 Diferenca para o algoritmo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.27 Imagem 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.28 Algoritmo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.29 Diferenca para o algoritmo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1 GIMP 85% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.2 GIMP 100% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.3 Aplicacao proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.4 Imagem 1 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.5 Imagem 1 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.6 Imagem 2 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.7 Imagem 2 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.8 Imagem 3 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.9 Imagem 3 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.10 Imagem 4 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.11 Imagem 4 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.12 Imagem 5 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.13 Imagem 5 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.14 Imagem 6 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.15 Imagem 6 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.16 Imagem 7 original . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
4.17 Imagem 7 corrigida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
6.1 Area afectada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
iv
Lista de Tabelas
2.1 Preditores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1 Mudanca de escala . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Exemplo de mudanca de escala . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.3 Bloco depois de mudanca de escala . . . . . . . . . . . . . . . . . . . . . . . . 27
3.4 Bloco depois de Tabela de Quantizacao . . . . . . . . . . . . . . . . . . . . . 27
3.5 Bloco depois de IDCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.6 Bloco a codificar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.7 Bloco depois de FDCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.8 Bloco depois de Tabela de Quantizacao . . . . . . . . . . . . . . . . . . . . . 36
3.9 Bloco a codificar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.10 Bloco depois de subtraıdo 128 . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.11 Bloco depois da FDCT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.12 Bloco depois de DQT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.13 Run, Size e Amplitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.14 Codigo e Amplitude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.15 Stream de bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.1 Dados da imagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.2 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
v
Capıtulo 1
Introducao
A fotografia digital encontra-se hoje bastante vulgarizada, permitindo a qualquer pessoa
com um computador pessoal efectuar um sem fim de operacoes sobre as imagens adquiridas
pela maquina fotografica. Uma das funcionalidades frequentemente encontradas em progra-
mas para manipulacao de imagem fotografica consiste na remocao do tao desagradavel efeito
de olhos vermelhos.
Este efeito deve-se a iluminacao do fundo do olho provocada pelo flash da maquina fo-
tografica. Embora muitas das maquinas possuam sistemas que tentam evitar este fenomeno,
emitindo feixes de luz antes do flash para obrigar as pupilas dos olhos a fechar, o certo e
que muitas vezes esses sistemas falham. Neste caso, a unica possibilidade e aplicar um pos-
processamento a imagem digital.
Actualmente, quase todas as maquinas fotograficas digitais armazenam as fotografias num
formato comprimido, tipicamente usando a norma JPEG (Joint Pictures Expert Group. Em
geral, quando se pretende efectuar algum pos-processamento numa imagem, ela e primeiro
descomprimida, depois processada e, finalmente, re-comprimida. Como a compressao usada
introduz perda de informacao, este processo de descompressao/re-compressao introduz de-
gradacao adicional e/ou um aumento inaceitavel do tamanho do ficheiro.
O formato JPEG permite o armazenamento de imagens com 24 bits de representacao de
cor. Isso significa que este formato aceita 16,8 milhoes de cores. O JPEG e um dos formatos
de imagens mais populares e isso deve-se a capacidade de formar imagens fieis a original.
Alem disso, os ficheiros em JPEG costumam ter tamanhos bastante mais reduzidos que os
originais. Na verdade, uma imagem JPEG pode ter o seu tamanho cerca de 100 vezes inferior
1
1.1. O PORQUE DOS OLHOS VERMELHOS
ao original e mesmo assim conseguir ter uma qualidade aceitavel.
O JPEG utiliza um algoritmo de compactacao que aproveita limitacoes do olho humano.
No entanto, mesmo sabendo-se que os ficheiros JPEG podem trabalhar com ate 16,8 milhoes
de cores, o olho humano nao e capaz de distinguir todas essas cores. Assim, e possıvel retirar
uma serie de informacoes que representam cores em imagens e manter apenas aquelas visıveis
ao olho humano. Por outras palavras, o formato JPEG retira da imagem aquilo que os hu-
manos nao conseguem ver. Esse processo e conhecido como compressao perceptual. Isso faz
com que imagens bastante realistas sejam criadas, ao mesmo tempo que os ficheiros ficam
bastante mais pequenos.
Um aspecto importante no JPEG e o facto de os ficheiros poderem ter diferentes nıveis de
compressao. Quanto maior for o nıvel de compressao (mais informacao e retirada do ficheiro),
menor sera o tamanho do ficheiro, contudo a sua qualidade sera inferior.
Uma desvantagem do JPEG e que a imagem normalmente perde qualidade cada vez que
e re-comprimida. E esse o principal foco deste trabalho. Tendo em conta esse problema,
tentamos minimiza-lo o quanto possıvel ao modificar apenas a parte da foto que e alterada
ao remover o efeito de olho vermelho e manter todo o resto da fotografia inalterada para que
a perda de qualidade seja minimizada e restringida a uma area limitada e controlada.
1.1 O porque dos olhos vermelhos
O efeito dos olhos vermelhos, em fotografia, consiste no surgir de pontos vermelhos nos
olhos das pessoas e animais retratados em fotografias, resultantes do reflexo da luz do flash.
Em algumas especies de animais, existe uma camada reflectora atras da retina que melhora
a visao nocturna e que aumenta este efeito, o que conduz por vezes a variacoes da cor da
luz reflectida de especie para especie. Os olhos dos gatos, por exemplo, podem reflectir em
fotografias de flash, a cor azul, amarela, rosa, ou verde.
2
1.1. O PORQUE DOS OLHOS VERMELHOS
Figura 1.1: Gato com efeito de olhos amarelos
Para o reflexo atingir o sensor da camara (ou o filme, pois as convencionais tambem sofrem
com o problema), e preciso que o angulo de incidencia do flash seja muito pequeno, o que
acontece principalmente em duas situacoes:
• Fotos com flash de pessoas distantes - e muito raro acontecer em camaras compactas
pois o flash nestas tem um alcance muito reduzido. Quanto mais perto do motivo a
camara estiver, menor a probabilidade de olhos vermelhos;
• Flash muito proximo da lente - e a principal explicacao para o numero crescente de
fotos com olhos vermelhos, uma vez que com camaras cada vez menores, o flash quase
sempre fica perto demais da objectiva.
Alguns modelos tentam reduzir o problema com o flash que se abre acima do corpo da
camara, mais afastado da lente. A maioria, no entanto, conta apenas com o tal modo de
reducao de olhos vermelhos. O que ele faz e emitir alguns rapidos flashes de luz antes do
flash propriamente dito com o intuito de fazer com que as pupilas das pessoas se contraiam,
diminuindo assim o orifıcio pelo qual a luz teria que entrar e ser reflectida de volta para a
camara. Na pratica, ajuda muito pouco.
Uma outra medida a adoptar no sentido de evitar o aparecimento de olhos vermelhos e
a de acender as luzes do ambiente antes de fotografar, mesmo quando o flash for capaz de
iluminar a cena adequadamente, isto porque e muito mais provavel encontrar olhos vermelhos
em fotos tiradas no escuro, onde as pessoas estavam com as pupilas totalmente dilatadas, do
que em ambientes bem iluminados.
3
1.2. OBJECTIVOS
1.2 Objectivos
Implementar um sistema que permita a remocao do efeito de olhos vermelhos em foto-
grafias digitais em formato JPEG. Este sistema devera ser automatico ou semi-automatico,
sendo caracterizado por so re-codificar os blocos de imagem correspondentes as zonas altera-
das, deixando todos os outros blocos inalterados.
Em termos gerais, o sistema e constituıdo pelas seguintes fases:
• Numa primeira fase e necessario descodificar o ficheiro JPEG de modo a que depois
seja possıvel visualizar/editar a imagem.
• De seguida e necessario que, de forma automatica, ou semi-automatica, se elimine o
efeito de olhos vermelhos.
• Depois e necessario re-codificar somente os blocos alterados, de modo a impedir uma
degradacao, ou aumento do tamanho, do ficheiro.
Na Figura 1.2 esta esquematizado o objectivo do trabalho:
Figura 1.2: Objectivos do trabalho
O trabalho foi realizado em linguagem C, no sistema operativo Linux.
4
Capıtulo 2
Norma JPEG
2.1 Descricao
JPEG e um acronimo de Joint Photographic Experts Group que e o nome original do
comite, fundado em 1986, que criou uma norma com o mesmo nome, JPEG, em 1990. Essa
norma e a juncao de esforcos de duas das maiores organizacoes de normas do mundo: ISO/IEC
(International Organization for Sandardization / International Electrotechnical Commission)
e o ITU-T (International Telecommunication Union - Telecommunication Standardization
Sector).
O JPEG e talvez um dos formatos de compressao de imagens mais utilizados hoje em
dia, especialmente utilizado para comprimir imagens fotograficas. E um formato de ficheiro
de imagem muito popular, que permite uma grande compressao mantendo uma boa qualidade.
A norma JPEG foi desenvolvida para comprimir imagens paradas, em tons contınuos de
cinza ou de cor, de cenas do mundo real e imagens naturais, nao tendo um bom desempenho
em imagens que apresentem descontinuidades nas cores ou nos tons de cinza. Outro detalhe
importante e que o JPEG no modo mais comummente utilizado leva a uma compressao com
perdas na imagem. E de realcar que estas perdas sao proporcionais ao factor de compressao
desejado.
A norma JPEG e razoavelmente complexa porque, mais que definir um formato de arquivo
de imagem, ela define um grande numero de relacionamentos entre tecnicas de compressao
de imagens. Na norma JPEG existem quatro modos de compressao dos dados. Sao eles o
modo sequencial, o modo progressivo, o modo hierarquico e o modo sem perdas [2].
5
2.1. DESCRICAO
2.1.1 JPEG progressivo
No JPEG progressivo, as componentes das imagens sao codificadas em multiplas passa-
gens. A compressao de dados de cada componente e feita no mınimo em duas passagens. A
passagem inicial cria uma versao com pouca definicao da imagem, enquanto passagens sub-
sequentes fazem o seu refinamento. Imagens progressivas vao sendo visualizadas conforme
sao descodificadas, dando ao utilizador uma ideia do conteudo da imagem apos uma pequena
quantidade de dados ter sido transmitida. Mais difıcil de ser implementado, e mais reco-
mendado quando a velocidade de processamento e relativamente mais rapida, excedendo a
velocidade de transmissao da imagem atraves de uma rede.
Figura 2.1: Exemplo de uma imagem progressiva
2.1.2 JPEG hierarquico
O JPEG hierarquico e tido como um modo super-progressivo em que a imagem e subdi-
vidida num certo numero de sub-imagens chamadas frames (coleccao de uma ou mais passa-
gens). No modo hierarquico, o primeiro frame cria uma versao de baixa resolucao da imagem.
Os frames restantes refinam a imagem por incremento da resolucao. Os principais obstaculos
do modo hierarquico sao: a complexidade de sua implementacao, mais processamento, maior
quantidade de dados a serem transmitidos e, portanto, menor taxa de compressao.
Figura 2.2: Exemplo de uma imagem hierarquica
6
2.1. DESCRICAO
2.1.3 JPEG sem perdas
A norma JPEG permite um modo de compressao sem perdas. Foi escolhido para o efeito
um metodo preditivo. Neste modo a codificacao e feita com o auxılio de um preditor e de
codificacao estatıstica. O preditor estima o valor do pixel actual (X) com base na informacao
do valor dos pixels vizinhos (A, B e C) [5] [12].
Figura 2.3: Pixels vizinhos (A, B e C) usados na predicao do valor do pixel que se quer
codificar (X)
A norma JPEG contempla a utilizacao de 7 preditores diferentes:
Predictor Prediction
1 A
2 B
3 C
4 A + B - C
5 A + (B - C)/2
6 B + (A - C)/2
7 (A + B)/2
Tabela 2.1: Preditores
O valor a codificar e a diferenca entre o valor estimado pelo preditor e o valor do pixel a
codificar.
O JPEG sem perdas preserva de forma exacta a imagem original apresentando baixa taxa
de compressao. Na maioria dos casos nao e competitivo.
7
2.1. DESCRICAO
2.1.4 JPEG sequencial
No JPEG sequencial, cada componente de cor e completamente codificada apenas numa
passagem, ou seja, um bloco de dados e comprimido de uma so vez, directamente da imagem,
para uma ou mais componentes.
Figura 2.4: Exemplo de uma imagem sequencial
Normalmente, quando ha referencia a norma JPEG trata-se do modo sequencial, cujo grau
de qualidade e velocidade de descompressao podem ser variados de acordo com os parametros
da compressao. Isso significa que o tamanho do arquivo da imagem em processamento pode
ser regulado de acordo com a qualidade final da imagem desejada.
Tipicamente, para imagens coloridas, a norma JPEG obtem taxas de compressao entre
10:1 a 20:1 sem perdas visıveis, taxas de 30:1 a 50:1 com pequenos defeitos na imagem,
enquanto que, para uma qualidade muito pobre da imagem, pode ser obtida uma taxa de
compressao de ate 100:1. Para imagens em tons de cinza, nao se obtem taxas tao altas de
compressao devido ao facto de os olhos humanos serem mais sensıveis a variacoes espaciais
das intensidades luminosas do que das cores; com isso o limite da taxa de compressao sem
perdas visıveis fica em torno de 5:1. Num processo repetido de compressao e descompressao
as perdas na imagem sao acumulativas.
A norma JPEG e especıfica para imagens. Contudo, frequentemente ouvem-se referencias
ao motion JPEG ou MJPEG para vıdeo. Varios fabricantes e vendedores de equipamentos
medicos tem aplicado JPEG aos frames de uma sequencia de vıdeo chamando o resultado de
MJPEG [13].
Para vıdeo, a norma de compressao/descompressao mais utilizada e o MPEG (Motion
Picture Experts Group), a qual utiliza muitas das tecnicas do JPEG, alem de explorar a
redundancia inter-frames, geralmente presente numa sequencia de vıdeo devido ao facto da
cena nao variar muito entre frames sucessivas, elevando a taxa de compressao cerca de tres
vezes em relacao ao metodo MJPEG para semelhante qualidade da imagem. Contudo, tem
o inconveniente de requerer um buffer que permita armazenar varias frames, enquanto que
8
2.1. DESCRICAO
a norma JPEG nao necessita de nenhum buffer para frames, pois processa cada frame inde-
pendentemente [13] [14].
Outra vantagem da norma JPEG e apresentar uma grande simetria, em termos de comple-
xidade, entre os codificadores e descodificadores. Por esta razao, em algumas aplicacoes, onde
e necessario/possıvel processar vıdeo mas em que ha limites na capacidade de processamento,
utiliza-se normalmente a norma JPEG (MJPEG), mesmo perdendo em taxa de compressao.
2.1.5 Princıpios da codificacao JPEG no modo sequencial
A norma JPEG pode ser descrita atraves dos blocos da Figura 2.5, a qual pode ser ex-
pandida para a Figura 2.6.
Figura 2.5: Codificacao
Figura 2.6: Processo de codificacao mais detalhado
A norma JPEG permite a codificacao de imagens com uma unica componente, imagens
em tons de cinza, e imagens com multiplas componentes (com tres planos de cor (RGB), por
exemplo).
No caso de imagens RGB, os tres planos de cor sao convertidos noutra representacao,
YCbCr (o plano Y contem a informacao de luminancia, Cb e Cr a informacao de cor), sendo
9
2.1. DESCRICAO
usual a sub-amostragem dos planos Cb e Cr, descrito com mais detalhe na seccao 2.4. Este
e o primeiro passo onde se introduz perdas na qualidade da imagem e, simultaneamente,
ganhos de codificacao.
O procedimento seguinte e depois aplicado a cada plano:
No processo de codificacao os pixels da imagem original sao agrupados em blocos de 8x8
pixels e cada bloco e convertido pela transformada discreta do cosseno directa (FDCT) num
conjunto de 64 valores, os coeficientes da DCT. O primeiro desses 64 valores e o coeficiente
DC (valor medio da intensidade do bloco) e os outros 63 sao os coeficientes AC (componentes
de frequencia espacial do bloco).
Cada um destes 64 coeficientes e entao dividido por uma constante e arredondado para o
inteiro mais proximo. A constante depende do coeficiente (DC ou AC) e da componente (Y,
Cb ou Cr). Esta constante e denominada por factor de qualidade, ja que ao actuar sobre esse
valor e possıvel obter um ficheiro com pouco tamanho e pouca qualidade ou vice-versa. Esta
e a operacao de quantizacao, a qual introduz a maior parte das perdas.
Depois da quantizacao o coeficiente DC e os 63 coeficientes AC sao preparados para a co-
dificacao. O coeficiente DC do bloco anterior e usado como estimativa para o coeficiente DC
actualmente quantizado e apenas a diferenca e codificada (codificacao diferencial ou DPCM).
Os restantes 63 coeficientes AC sao convertidos numa sequencia linear utilizando um varri-
mento em Zig-Zag (para preservar a informacao de frequencia espacial) e automaticamente
agrupar os possıveis zeros obtidos. Esta sequencia linear e entao codificada sem perdas, uti-
lizando metodos estatısticos.
Nesta fase pode ser usado um de dois metodos de codificacao de entropia, codificacao
de Huffman ou codificacao aritmetica, sendo a primeira a mais usual. Nesse caso, as tabe-
las de Huffman tem de ser conhecidas tanto pelo codificador como pelo descodificador (sao
calculadas para a imagem em questao ou usadas tabelas por defeito).
10
2.2. ORGANIZACAO DO FICHEIRO CODIFICADO
2.2 Organizacao do ficheiro codificado
Um ficheiro JPEG encontra-se dividido em diversos blocos de dados. Cada bloco e identi-
ficado por um marcador, um conjunto de bits da forma 0xFFaa, em que aa varia consoante
o marcador [4].
Alguns dos marcadores mais importantes:
0xFFD8, Start Of Image (SOI). Inicio da imagem.
0xFFEn, APPn (n= 0..F). Reservado para uso de aplicacoes.
0xFFCn, Start Of Frame n (SOFn).
Inicio de frame, em que n indica o modo de compressao
(n = 0, 1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15).
0xFFDB, Quantization Table(s) (DQT). Tabela(s) de Quantizacao.
0xFFC4, Huffman Table(s) (DHT). Tabela(s) de Huffman.
0xFFDD, Define Restart Interval (DRI).
0xFFDm, Restart interval m (RSTm), (m = 0..7).
0xFFDA, Start Of Scan (SOS). Dados comprimidos.
0xFFD9, End Of Image (EOI). Fim da imagem.
Os marcadores usados num ficheiro JPEG comecam sempre com um ou mais 0xFF, se-
guido de um byte diferente de zero, que identifica a funcao do segmento de codigo seguinte.
Para que nao exista ambiguidade entre os marcadores e os dados codificados do ficheiro,
sempre que exista um 0xFF na zona de dados codificados, segue-se sempre um byte a zero
unicamente com esse proposito.
Existem duas categorias de marcadores, aqueles sem parametros e aqueles seguidos de um
tamanho variavel de parametros. Para o segundo caso, o primeiro parametro (2 bytes) e
exactamente o tamanho da sequencia de parametros, incluindo o parametro do tamanho e
excluindo o marcador que define o segmento. A norma JPEG garante que fora dos segmentos
os marcadores sao unicos.
11
2.3. ESTRUTURA DETALHADA DE UM FICHEIRO JPEG
A estrutura de um ficheiro JPEG e a seguinte, sendo que nao existe uma ordem predefinida
[1]:
SOI
DQT, tamanho, definicoes da(s) tabela(s) de quantizacao
DRI, tamanho, intervalos de recomeco
SOFn, tamanho, parametros do frame
DHT, tamanho, definicoes da(s) tabela(s) de Huffman
SOS, tamanho, parametros
Dados comprimidos associados a RST0
. . .
Dados comprimidos associados a RSTm
Dados comprimidos associados ao ultimo RST
DHT, tamanho, definicoes da(s) tabela(s) de Huffman
SOS, tamanho, parametros
. . .
EOI
2.3 Estrutura detalhada de um ficheiro JPEG
Marcador Inıcio de Imagem (SOI)
• SOI (2 bytes)
Marcador Inicio de Frame (SOFn)
• SOFn (2 bytes)
• Lf (2 bytes) – Tamanho do segmento incluindo os 2 bytes do tamanho
• P (1 byte) – Precisao em bits (8 para Baseline JPEG)
• Y (2 bytes) – Numero de linhas
• X (2 bytes) – Numero de amostras/linha
• Nf (1 byte) – Numero de componentes do frame (3 – cor; 1 – cinzentos)
12
2.3. ESTRUTURA DETALHADA DE UM FICHEIRO JPEG
• Para cada Nf (i=1, .., Nf)
– Ci (1 byte) – Identificador de componente
– Hi (4 bits mais significativos) – Factor de amostragem horizontal
– Vi (4 bits menos significativos) – Factor de amostragem vertical
– Tqi (1 byte) – Numero da tabela de quantizacao
Marcador Tabela Quantizacao (DQT)
• DQT (2 bytes)
• Lq (2 bytes) – Tamanho do segmento incluindo os 2 bytes do tamanho
• Para cada DQT (enquanto tamanho > 0)
– Pq (4 bits mais significativos) – Precisao (0 – 8 bit; 1 – 16 bit)
– Tq (4 bits menos significativos) – Identificador da tabela
– Para (k=0, .., 63)
∗ Qk (1 ou 2 bytes) – Valores (armazenados no formato Zig-Zag)
Marcador Tabela Huffman (DHT)
• DHT (2 bytes)
• Lh (2 bytes) – Tamanho do segmento incluindo os 2 bytes do tamanho
• Para cada DHT (enquanto tamanho > 0)
– Tc (4 bits mais significativos) – Classe da tabela
– Th (4 bits menos significativos) – Identificador da tabela
∗ Para (i=1, .., 16)
∗ Li (1 byte) – Numero de codigos de tamanho i
• Para (i=1, .., 16)
• Para (j=1, .., 16)
– Vij (1 byte) – Valores associados a cada codigo de Huffman
13
2.4. COMPRESSAO DE IMAGENS COM MULTIPLAS COMPONENTES
Marcador Inıcio de Dados (SOS)
• SOS (2 bytes)
• Ls (2 bytes) – Tamanho do segmento incluindo os 2 bytes do tamanho
• Ns (1 byte) – Numero de componentes
• Para cada Ns (k=1, .., Ns)
– Csk (1 byte) – Identificador de componente
– Tdk (4 bits mais significativos) – Identificador de valores DC
– Tak (4 bits menos significativos) – Identificador de Valores AC
• Ss (1 byte) – Inıcio de seleccao espectral
• Se (1 byte) – Fim de seleccao espectral
• Ah (4 bits mais significativos) – Posicao do bit de aproximacao sucessiva
• Al (4 bits menos significativos) – Posicao do bit de aproximacao sucessiva
Marcador Fim de Imagem (EOI)
• EOI (2 bytes)
2.4 Compressao de imagens com multiplas componentes
A norma JPEG permite codificar ficheiros com mais do que uma componente, por exemplo
RGB. No caso de uma imagem em tons de cinza o ficheiro tem apenas uma componente (Y),
enquanto que, no caso de uma imagem a cores, o ficheiro tem tres componentes (Y, Cb, Cr).
No caso de imagens RGB, os tres planos de cor sao convertidos noutra representacao,
YCbCr (o plano Y contem a informacao de luminancia, Cb e Cr a informacao de cor), sendo
usual a sub-amostragem dos planos Cb e Cr.
14
2.4. COMPRESSAO DE IMAGENS COM MULTIPLAS COMPONENTES
Figura 2.7: Compressao de imagens com multiplas componentes
A conversao entre RGB e YCbCr e feita da seguinte forma:
R = Y + 1.402(Cr − 128) (2.1a)
G = Y − 0.34414(Cb− 128)− 0.71414(Cr − 128) (2.1b)
B = Y + 1.772(Cb− 128) (2.1c)
15
2.4. COMPRESSAO DE IMAGENS COM MULTIPLAS COMPONENTES
Y = 0.299R + 0.587G + 0.114B (2.2a)
Cb = −0.1687R− 0.3313G + 0.5B + 128 (2.2b)
Cr = 0.5R− 0.4187G− 0.0813B + 128 (2.2c)
Num ficheiro JPEG, a informacao relativamente a cor encontra-se no formato YCbCr.
Este formato e obtido atraves da conversao dos valores RGB utilizando as equacoes 2.1 e 2.2.
No formato RGB temos as tres componentes de cor (Red Green Blue) separadamente.
No formato YCbCr a componente Y contem a informacao de luminancia da imagem, ou
seja, contem a informacao sobre a intensidade de cor (ou luminosidade) da imagem. Os
componentes Cb e Cr contem a informacao de cor da imagem, sendo que o componente Cb
contem a informacao relativa a cor azul (blue) e o componente Cr contem a informacao rela-
tiva a cor vermelha (red).
O Cb e Cr normalmente sao sub-amostrados para metade do seu tamanho original. Este
primeiro passo, que permite algum ganho de codificacao, aproveita uma caracterıstica do olho
humano em que o mesmo e mais sensıvel a variacoes espaciais das intensidades luminosas do
que das cores.
No cabecalho JPEG temos acesso a informacao acerca das dimensoes de Y, Cb e Cr. Es-
sas dimensoes sao relativas ao numero de blocos 8x8 pixels que constitui cada componente.
Por exemplo, se Hy = Vy = 2 e Hcb = Vcb = Hcr = Vcr = 1, entao Y e constituıdo por
quatro blocos 8x8 pixels (dois na horizontal e dois na vertical) e apenas um para Cb e outro
para Cr. Este conjunto de blocos de Y, Cb e Cr tem o nome de Macrobloco. A dimensao
da informacao lida e sempre igual a dimensao de Y. Para este exemplo, a informacao lida
corresponde a 16x16 pixels conhecidos para as tres componentes de cor RGB.
A norma JPEG preve que as dimensoes da imagem sejam multiplas de 16 para se poder
efectuar a descodificacao/re-codificacao do ficheiro sem problemas. Como isso raramente
acontece, e necessario fazer uma expansao da imagem, tanto na horizontal como na vertical,
de modo a que esta seja multipla de 16, para tal sao introduzidos zeros. Nesta altura pode-
se descodificar/re-codificar a imagem sem problemas, sendo que a imagem resultante tem
sempre as mesmas dimensoes da imagem original, ou seja, a expansao referida anteriormente
serve apenas para o efeito de descodificacao/re-codificacao.
16
Capıtulo 3
Trabalho realizado
3.1 Descodificacao
A primeira parte do trabalho incide sobre a descodificacao de um ficheiro no formato
JPEG. Uma visao global sobre o que se pretende pode ser representada pelas Figuras 3.1 e
3.2:
Figura 3.1: Descodificacao
Figura 3.2: Processo de descodificacao mais detalhado
17
3.1. DESCODIFICACAO
Como o processo de compressao foi efectuado em blocos de 8x8 pixels, a descodificacao
tem que ser aplicada da mesma forma, isto e, e necessario descodificar individualmente blocos
de 64 pixels e ir preenchendo a imagem descodificada.
A parte de descodificacao com um pouco mais de detalhe pode ser representada atraves
do diagrama da Figura 3.3:
Figura 3.3: Diagrama da descodificacao
18
3.1. DESCODIFICACAO
3.1.1 Descodificacao do cabecalho
Para descodificar o ficheiro vamos precisar de conhecer dois tipos de tabelas que poderao
ser fornecidas no ficheiro ou, na ausencia destas, usar tabelas por defeito. Mais precisamente
precisamos de ter a(s) DQT(s) (Tabela(s) de Quantizacao) e a(s) DHT(s) (Tabela(s) de Huff-
man).
Para ler a(s) DQT(s) e preciso ter em atencao a precisao dos valores ( 8 bits ou 16 bits).
E necessario ler o identificador da mesma e de seguida podem ser lidos os valores tendo em
atencao que estes sao guardados de forma linear, tendo depois que ser convertidos para uma
tabela (8x8) segundo a disposicao da Figura 3.4 [3]:
Figura 3.4: Formato Zig-Zag
19
3.1. DESCODIFICACAO
O procedimento para construir as tabelas de Huffman envolve varios passos. Primeiro e
preciso criar a tabela de tamanhos (Figura 3.5), segundo o seguinte fluxograma:
Figura 3.5: Tabela de tamanhos
Atraves deste procedimento vao ser lidos todos os codigos de Huffman e vai sendo guardada
a informacao relativamente aos tamanhos de cada um dos codigos. No fim deste procedimento
sao conhecidos quantos codigos existem para cada tamanho possıvel (de 1 a 16 bits) [2].
20
3.1. DESCODIFICACAO
De seguida e necessario criar a tabela de codigos (Figura 3.6):
Figura 3.6: Tabela de codigos
Atraves deste procedimento os codigos de Huffman sao todos lidos e guardados. Os codigos
sao guardados a medida que sao lidos, sem qualquer ordem predefinida [2].
21
3.1. DESCODIFICACAO
Por fim e necessario ordenar os codigos por tamanho (Figura 3.7):
Figura 3.7: Procedimento para ordenar os codigos de Huffman por tamanho
Com este procedimento os codigos de Huffman ficam ordenados por tamanho.
EHUFCO contem todos os codigos de Huffman lidos, ordenados por tamanho de forma
ascendente. EHUFSI contem os tamanhos de cada codigo de Huffman, segundo a mesma
ordem [2].
Depois de preparadas as tabelas, e necessario ler a informacao da zona de dados, bloco a
bloco, e descodificar individualmente cada bloco de modo a termos o ficheiro JPEG descodi-
ficado.
22
3.1. DESCODIFICACAO
3.1.2 Descodificacao dos dados
Na compressao JPEG existem grandes sequencias de zeros apos a leitura em Zig-Zag
(Figura 3.4) da matriz resultante da quantizacao dos coeficientes da DCT, por isso a codi-
ficacao foi simplificada para apenas contar a ocorrencia deste sımbolo. Alem disso, como
apenas os zeros e que sao contados, nao e necessario que o sımbolo apareca apos o numero
de ocorrencias. Entao a codificacao na compressao JPEG conta quantos zeros existem antes
de um componente nao zero e gera um par (run, size), onde o campo Run indica o numero
de zeros que antecedem o valor nao zero seguinte e o campo Size indica o numero de bits
necessarios para ler o proximo sımbolo.
A norma JPEG define em 15 o valor maximo do campo Run. Uma sequencia de 16 ou mais
zeros gera um par “Run/Size” especial, 15/0, que indica a existencia de 15 zeros seguidos
por mais um zero (16 zeros no total) e que reinicia o contador de zeros. Outro par especial e
gerado quando a matriz de entrada termina com zeros, este par e 0/0 e indica que so existem
zeros ate ao fim da matriz.
Com toda a informacao presente no cabecalho JPEG correctamente processada e as tabe-
las conhecidas, chega a altura de descodificar a imagem. Nesta fase e necessario ler bit a bit a
zona de dados ate que seja encontrado um codigo de Huffman valido e feita a correspondencia
codigo ⇔ par (run, size). Por sua vez, run tem a informacao sobre a quantidade de zeros que
o bloco, de tamanho 8x8 pixels, tem seguidos ate ao proximo valor diferente de zero. Este
valor diferente de zero e obtido lendo o numero de bits indicado por size.
23
3.1. DESCODIFICACAO
Um diagrama deste procedimento pode ser visto na Figura 3.8:
Figura 3.8: Descodificar imagem
O procedimento da Figura 3.8 tem algumas particularidades e e seguido de algumas
operacoes que serao vistas de seguida.
Modo sequencial A descodificacao de um bloco de 8x8 pixels e feita de modo sequencial.
Os blocos sao descodificados em sequencia e um erro num bloco pode provocar erros em
blocos seguintes ou ate impossibilitar a correcta descodificacao do ficheiro.
Tabelas E necessario ter em atencao a tabela de Huffman a usar. Para cada componente
existe uma tabela de Huffman apropriada e apenas essa deve ser usada.
24
3.1. DESCODIFICACAO
Mudanca de escala Na fase da codificacao os valores da amplitude a guardar sao modifi-
cados. Na descodificacao, antes de se usar o valor lido, e necessario fazer a operacao inversa
(uma alteracao de escala) da seguinte forma:
size amplitude
1 -1, 1
2 -3, -2, 2, 3
3 -7, . . . , -4, 4, . . . , 7
4 -15, . . . ,-8, 8, . . . , 15
5 -31, . . . , -16, 16, . . . , 31
6 -63, . . . , -32, 32, . . . , 63
7 -127, . . . , -64, 64, . . . , 127
8 -255,. . . , -128, 128,. . . , 255
9 -511, . . . , -256, 256, . . . , 511
10 -1023, . . . , -512, 512, . . . , 1023
Tabela 3.1: Mudanca de escala
Por exemplo, para size = 2, temos o seguinte:
Original Alterado
0 -3
1 -2
2 2
3 3
Tabela 3.2: Exemplo de mudanca de escala
Codificacao diferencial O primeiro valor a ser lido da zona de dados para cada bloco
(para todos os componentes) e o coeficiente DC. Os 63 restantes sao os coeficientes AC. O
coeficiente DC e bastante importante porque indica o valor medio da intensidade dos pixels
de todo o bloco.
Para poupar bits este valor e codificado de forma diferencial (ver exemplo na Figura 3.9),
isto e, e codificada a diferenca para o valor anterior sendo que para o primeiro valor da
imagem (valor DC do bloco superior esquerdo), e feita a diferenca com o valor zero. Isto
25
3.1. DESCODIFICACAO
acontece sempre que nao existam marcadores de reinicio (Restart intervals). Se existirem
estes marcadores o DC e reinicializado a zero e e assegurado que o proximo codigo pertence
ao primeiro de um bloco. Este assunto esta explicado na seccao 3.1.3.
Figura 3.9: Codificacao diferencial do DC
Algoritmo Nesta altura e executado o algoritmo da Figura 3.8 para 64 (DC + 63AC)
valores de modo a completar um bloco de 8x8 pixels. De notar que para o DC o algoritmo e o
mesmo da Figura 3.8, embora seja conhecido o valor de run que tem de ser obrigatoriamente
zero.
Quantizacao Com o bloco de 8x8 pixels completo e depois do passo da Figura 3.9, e
necessario multiplicar todos os valores do bloco pelos valores presentes na Tabela de Quan-
tizacao. Neste passo e necessario, mais uma vez, ter em conta qual a tabela a ser usada em
funcao do componente de cor (Y, Cb ou Cr).
Transformada discreta do cosseno inversa Depois da Tabela de Quantizacao e preciso
aplicar a transformada discreta do cosseno inversa (IDCT). De seguida e necessario somar
um offset (128) a todos os valores do bloco.
26
3.1. DESCODIFICACAO
Nas tabelas seguintes estao representadas as tres ultimas operacoes que foram necessarias
efectuar no acto da descodificacao.
5 0 0 0 0 0 0 0
-3 0 0 0 0 0 0 0
1 -1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Tabela 3.3: Bloco depois de mudanca de escala
-40 -2 0 1 0 -1 0 0
-19 0 -1 0 0 0 0 0
6 -7 0 1 0 0 0 0
0 0 0 0 -1 0 0 0
0 0 0 1 0 -1 0 1
0 0 0 0 -1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Tabela 3.4: Bloco depois de Tabela de Quantizacao
129 129 130 130 131 132 132 132
130 130 130 131 131 131 131 131
131 131 131 131 131 130 130 130
133 133 132 132 131 131 130 130
134 134 133 133 132 132 131 131
135 135 135 134 134 134 134 134
135 136 136 136 136 137 137 137
136 136 136 137 138 138 139 139
Tabela 3.5: Bloco depois de IDCT
27
3.1. DESCODIFICACAO
Arredondamento Finalmente e preciso garantir que, devido aos processos de arredonda-
mentos envolvidos no acto de calculo da IDCT, nao hajam valores menores que zero (valor
mınimo) nem superiores a 255 (valor maximo).
Macroblocos De seguida e efectuado o procedimento de descodificar um bloco para todos
os blocos de um Macrobloco, de acordo com a Figura 2.7. Este procedimento e repetido para
todos os Macroblocos do ficheiro.
Conversao de cor Quando a descodificacao estiver concluıda para todos os Macroblocos,
estao preenchidas as 3 matrizes correspondentes as 3 componentes de cor (Y, Cb e Cr). Nesta
altura apenas falta converter YCbCr para RGB. Esta operacao e feita do seguinte modo, para
cada pixel:
R = Y + 1.402(Cr − 128) (3.1a)
G = Y − 0.34414(Cb− 128)− 0.71414(Cr − 128) (3.1b)
B = Y + 1.772(Cb− 128) (3.1c)
(Equacao repetida da seccao 2.4)
E assim ficam completas as tres matrizes de cor RGB, todas do tamanho do ficheiro
original. A cada pixel do ficheiro corresponde o valor na mesma posicao das tres componentes,
como se pode ver no exemplo da Figura 3.10.
Figura 3.10: Ficheiro descomprimido
28
3.1. DESCODIFICACAO
3.1.3 Marcas de controlo
Os marcadores de reinıcio (ou restart intervals) sao os unicos marcadores que podem ser
encontrados na zona de dados. Estes marcadores sao bastante uteis para efeito de sincronismo
em caso de erros no ficheiro. Como ja foi visto anteriormente, um ficheiro JPEG esta dividido
em blocos que se agrupam em Macroblocos. Tambem foi visto que o primeiro coeficiente de
cada bloco e o coeficiente DC que contem a informacao sobre o valor medio das intensidades
do mesmo, ou seja, e bastante importante para a correcta visualizacao de todos os valores do
bloco. Existem 3 classes de coeficientes DC, um para cada componente de cor. A codificacao
diferencial (seccao 3.2.3) e feita separadamente para cada um deles.
Assim sendo, um marcador de reinıcio indica que a proxima codificacao diferencial e feita
comparando o actual valor DC com zero (para todos os componentes). Indica tambem que
se esta perante o inıcio de um Macrobloco.
O marcador de reinıcio tem de estar alinhado na zona de dados (Figura 3.11), de modo a
que seja possıvel ser lido byte a byte ao inves de obrigar uma descodificacao bit a bit. No caso
da informacao presente na zona de dados nao estar alinhada antes de se colocar um marcador
de reinıcio, e feito um padding de 1’s ate que isso aconteca, ou seja, o byte e acabado com
bit’s a 1 ate que o alinhamento de verifique. Nesta altura ja se pode colocar o marcador de
reinıcio e prosseguir com a codificacao.
O padding a 1’s e possıvel de implementar gracas aos codigos de Huffman utilizados, que
garantem codigos unicamente descodificaveis, sendo que o inıcio de um codigo nunca pode
ser igual a outro codigo existente. Esta especificacao garante que um padding de 1’s nao vai
ser confundido com nenhum codigo. Depois do marcador encontrado, os bit’s a 1 encontrados
sao descartados e comeca uma nova leitura de um codigo.
29
3.1. DESCODIFICACAO
Figura 3.11: Zona de dados
(a) - Codigos de Huffman
(b) - Ultimos bits validos (100)
Byte terminado com padding de 1’s
(c) - Byte 0xFF (marcador). O byte seguinte tem de ser obrigatoriamente um marcador
de reinıcio ou zero.
(d) - Byte 0xD0 (marcador de reinıcio).
Implica:
Descodificacao de Macrobloco concluıda
DC Y = 0
DC Cb = 0
DC Cr = 0
Buffer de leitura reinicializado
Descodificacao de novo Macrobloco
(e) - Codigos de Huffman relativos ao novo Macrobloco
30
3.2. COPIA E CODIFICACAO
3.2 Copia e Codificacao
A segunda parte do trabalho consistiu na re-codificacao de alguns blocos, mantendo os
outros inalterados.
Na altura de criar o ficheiro alterado e necessario alternar entre duas operacoes, copiar e
codificar. Em primeiro lugar e necessario criar o ficheiro de destino e, byte a byte, copiar toda
a zona do cabecalho JPEG para o ficheiro de destino. Nesta operacao e tambem copiada a
informacao do cabecalho da zona de dados. O ficheiro de destino fica entao pronto a receber
a informacao dos pixels codificados.
De seguida sao percorridos todos os Macroblocos do ficheiro e, consoante tenha sido alte-
rado ou nao, e codificado ou copiado, respectivamente.
Figura 3.12: Descodificacao e Codificacao
31
3.2. COPIA E CODIFICACAO
3.2.1 Copia
A operacao de copia esta dividida em duas partes. Na primeira e copiada toda a informacao
relativa ao cabecalho JPEG. Na segunda parte e feita uma copia dos pixels codificados,
Macrobloco a Macrobloco.
Copia de cabecalhos Nesta fase e feita uma copia directa, byte a byte, do ficheiro de
origem para o ficheiro de destino. Na fase de descodificacao e guardado o valor do file pointer
que corresponde ao inıcio dos dados (ja depois da informacao de cabecalho). Deste modo e
feita a copia ate que seja atingido essa posicao do file pointer e fica garantido que daı ate
final do ficheiro apenas ficara guardada a informacao dos dados do ficheiro e, mesmo no final,
o marcador EOI (End of image).
Copia de Macroblocos Na copia de Macroblocos sao copiados todos os blocos correspon-
dentes ao Macrobloco em questao. Nesta fase e lida bit a bit a zona de dados do ficheiro de
origem e os bits lidos sao escritos num buffer, partilhado com a funcao de codificacao, para
ser escrito no ficheiro de destino quando completar um byte.
E necessario ter um buffer de escrita partilhado com a funcao de codificacao de modo
que os dados escritos no ficheiro de destino sejam contınuos, ja que vai existir alternancia
entre as funcoes de codificacao e copia de Macroblocos e os dados precisam estar seguidos,
independentemente da funcao utilizada.
E tambem necessario ter especial atencao para o facto de sempre que for lido um byte
0xFF do ficheiro de origem, ser ignorado o byte seguinte (caso seja 0x00), que a unica funcao
e garantir que nao se esta perante nenhum marcador e nao tem relevancia nos dados. Assim
sendo, na fase de escrita do buffer acima descrito, e necessario ter em conta que sempre que
seja escrito no ficheiro de destino um byte a 0xFF e necessario escrever um byte com 0x00.
32
3.2. COPIA E CODIFICACAO
3.2.2 Codificacao
A parte da codificacao pode ser vista como o inverso da descodificacao de um ficheiro no
formato JPEG. Uma visao global sobre o assunto pode ser representada pelas Figuras 3.13 e
3.14:
Figura 3.13: Codificacao
Figura 3.14: Processo de codificacao mais detalhado
3.2.3 Princıpio da codificacao
Com toda a informacao necessaria para codificar presente nas matrizes de cor RGB, chega
a altura de codificar a imagem. Tendo o respectivo bloco de 8x8 pixels pronto a codificar e
necessario ler e codificar todos os 64 valores. Sempre que um valor lido seja diferente de zero
e necessario verificar quantos zeros existem ate ao proximo valor diferente de zero e, caso
sejam menos de 16 zeros, pode ser codificada a correspondencia codigo ⇔ par (run, size),
amplitude. Run e o numero de zeros encontrados, size o numero de bits necessarios para ler
amplitude, e amplitude e o proximo valor da matriz diferente de zero. Caso existam apenas
zeros ate ao fim da matriz e codificado o par (0, 0) indicado EOB (fim de bloco). Caso sejam
encontrados 16 zeros seguidos e nao estejamos na condicao anterior e codificado o par (15,
0).
33
3.2. COPIA E CODIFICACAO
Um diagrama deste procedimento pode ser visto na Figura 3.15:
Figura 3.15: Codificar imagem
O procedimento da Figura 3.15 tem alguns pormenores e e antecedido de algumas operacoes
que serao vistas de seguida.
Modo sequencial A codificacao de um bloco de 8x8 pixels e feita de modo sequencial. Os
blocos sao codificados “uns atras dos outros” e um erro num bloco pode provocar erros em
blocos seguintes ou ate provocar a impossibilidade de uma futura descodificacao.
Tabelas E necessario ter em atencao a tabela de Huffman a usar. Para cada componente
existe uma tabela de Huffman apropriada e apenas essa deve ser usada.
34
3.2. COPIA E CODIFICACAO
Conversao de cor A primeira operacao a fazer aquando da codificacao e converter RGB
para YCbCr. Esta operacao e feita do seguinte modo, para cada pixel, tendo em conta o
procedimento de sub-amostragem dos componentes Cb e Cr em relacao a Y, caso exista.
Y = 0.299R + 0.587G + 0.114B (3.2a)
Cb = −0.1687R− 0.3313G + 0.5B + 128 (3.2b)
Cr = 0.5R− 0.4187G− 0.0813B + 128 (3.2c)
(Equacao repetida da seccao 2.4)
Figura 3.16: Ficheiro codificado
Macroblocos De seguida e efectuado o procedimento de codificar um bloco para todos
os blocos de um Macrobloco. Este procedimento e repetido para todos os Macroblocos que
tenham sido alterados.
Transformada discreta do cosseno directa Tendo a matriz de 8x8 pixels correspondente
a um bloco a codificar, a primeira operacao a fazer e subtrair um offset (128) a todos os valores
do bloco. Depois e preciso aplicar a transformada discreta do cosseno directa (FDCT).
Quantizacao E depois necessario dividir, arredondando para o inteiro mais proximo, to-
dos os valores do bloco pelos valores presentes na Tabela de Quantizacao. Neste passo e
necessario, mais uma vez, ter em conta qual a tabela a ser usada em funcao do componente
de cor (Y, Cb ou Cr).
35
3.2. COPIA E CODIFICACAO
Nas tabelas seguintes estao representadas as duas ultimas operacoes que foram necessarias
efectuar no acto da codificacao.
129 129 130 130 131 132 132 132
130 130 130 131 131 131 131 131
131 131 131 131 131 130 130 130
133 133 132 132 131 131 130 130
134 134 133 133 132 132 131 131
135 135 135 134 134 134 134 134
135 136 136 136 136 137 137 137
136 136 136 137 138 138 139 139
Tabela 3.6: Bloco a codificar
-40 -2 0 1 0 -1 0 0
-19 0 -1 0 0 0 0 0
6 -7 0 1 0 0 0 0
0 0 0 0 -1 0 0 0
0 0 0 1 0 -1 0 1
0 0 0 0 -1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Tabela 3.7: Bloco depois de FDCT
5 0 0 0 0 0 0 0
-3 0 0 0 0 0 0 0
1 -1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Tabela 3.8: Bloco depois de Tabela de Quantizacao
36
3.2. COPIA E CODIFICACAO
Codificacao diferencial O primeiro valor a ser lido da matriz para cada bloco (para todos
os componentes) e o coeficiente DC. Os 63 restantes sao os coeficientes AC. A semelhanca do
que acontecia na descodificacao, tambem na codificacao apenas e codificada a diferenca do
valor DC do bloco corrente com o bloco anterior (da mesma componente).
Algoritmo Nesta altura e executado o algoritmo da Figura 3.15 para 64 (DC + 63AC)
valores de modo a codificar um bloco de 8x8 pixels. De notar que para o DC o algoritmo e
o mesmo da Figura 3.15, embora o valor de run tenha de ser obrigatoriamente zero.
Mudanca de escala Antes de se usar o valor lido no ponto anterior, e necessario fazer
uma alteracao de escala de acordo com a Tabela 3.1, mas de forma inversa.
Escrever bits Finalmente os bits sao escritos no ficheiro de destino como no exemplo da
seccao 3.2.4.
3.2.4 Exemplo de codificacao de um bloco
De seguida estao representados os passos da codificacao, desde o bloco 8x8 pixels a codificar
ate aos bits daı resultantes:
129 129 130 130 131 132 132 132
130 130 130 131 131 131 131 131
131 131 131 131 131 130 130 130
133 133 132 132 131 131 130 130
134 134 133 133 132 132 131 131
135 135 135 134 134 134 134 134
135 136 136 136 136 137 137 137
136 136 136 137 138 138 139 139
Tabela 3.9: Bloco a codificar
37
3.2. COPIA E CODIFICACAO
1 1 2 2 3 4 4 4
2 2 2 3 3 3 3 3
3 3 3 3 3 2 2 2
5 5 4 4 3 3 2 2
6 6 5 5 4 4 3 3
7 7 7 6 6 6 6 6
7 8 8 8 8 9 9 9
8 8 8 9 10 10 11 11
Tabela 3.10: Bloco depois de subtraıdo 128
-40 -2 0 1 0 -1 0 0
-19 0 -1 0 0 0 0 0
6 -7 0 1 0 0 0 0
0 0 0 0 -1 0 0 0
0 0 0 1 0 -1 0 1
0 0 0 0 -1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
Tabela 3.11: Bloco depois da FDCT
5 0 0 0 0 0 0 0
-3 0 0 0 0 0 0 0
1 -1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Tabela 3.12: Bloco depois de DQT
38
3.2. COPIA E CODIFICACAO
Run Size Amplitude
0 3 5
1 2 -3
0 1 1
4 1 -1
0 0
Tabela 3.13: Run, Size e Amplitude
Codigo Amplitude*
101 11
11011 0
00 1
111011 0
010
Tabela 3.14: Codigo e Amplitude
* Valor com mudanca de escala e codificacao diferencial (DC)
Stream de bits
1011111011000011110110010
Tabela 3.15: Stream de bits
39
3.3. ALGORITMOS PARA A REMOCAO DO EFEITO DE OLHOS VERMELHOS
3.3 Algoritmos para a Remocao do efeito de olhos vermelhos
A terceira parte do trabalho consiste na remocao do efeito dos olhos vermelhos. Para tal
e necessario, em primeiro lugar, detectar a zona a corrigir, e de seguida aplicar-lhe um dos
possıveis algoritmos.
3.3.1 Deteccao da zona afectada
Para a deteccao da zona afectada foi usado o seguinte conceito. A zona afectada tem
uma grande incidencia da cor vermelha e, simultaneamente, pouca incidencia das cores verde
e azul. Foi entao desenvolvida uma formula que maximizasse essa relacao de modo a ser
facilmente detectavel um zona com essas caracterısticas (Equacao 3.3):
K =red2
red2 + green2 + blue2(3.3)
A equacao 3.3 devolve um valor (entre 0 e 1) que mostra a incidencia do vermelho em
relacao as outras cores. Assim, quanto maior for K maior e a incidencia do vermelho sobre
as outras cores.
Na Figura 3.17 pode ser visto um histograma das cores RGB num olho com o efeito de
olho vermelho.
Figura 3.17: Histograma de cores
No histograma acima pode-se verificar que a maior parte de ocorrencias das cores verde e
azul estao nas baixas intensidades. As ocorrencias da cor vermelha estao repartidas por toda
a gama de intensidades. E neste aspecto que e necessario intervir, removendo as ocorrencias
da cor vermelha de media e alta intensidade.
3.3.2 Algoritmos
Foi implementado um algoritmo existente (Algoritmo 2) e desenvolvidos tres novos algo-
ritmos (Algoritmo 1, 3 e 4) de remocao dos olhos vermelhos de modo a verificar qual obtinha
melhores resultados.
40
3.3. ALGORITMOS PARA A REMOCAO DO EFEITO DE OLHOS VERMELHOS
3.3.3 Algoritmo 1
O primeiro algoritmo funciona segundo o seguinte princıpio: sabendo que o pixel esta na
zona afectada (seccao 3.3.1), os valores dos pixels R, G e B sao alterados segundo a equacao
3.4:
red = red ∗ 0.5
green = green ∗ 1.3
blue = blue ∗ 1.2
(3.4)
Os valores escolhidos para este algoritmo tem como objectivo reduzir a intensidade da cor
vermelha e aumentar a intensidade das cores verde e azul nas mesmas proporcoes, de modo
a tentar manter constante a media de cores e consequente valor DC.
A Figura 3.18 mostra uma fotografia com o efeito de olhos vermelhos e a Figura 3.19 e a
mesma fotografia depois de aplicado este algoritmo. Na Figura 3.20 temos a diferenca das
duas anteriores.
Figura 3.18: Imagem 1
Figura 3.19: Algoritmo 1
Figura 3.20: Diferenca para o algoritmo 1
41
3.3. ALGORITMOS PARA A REMOCAO DO EFEITO DE OLHOS VERMELHOS
3.3.4 Algoritmo 2
O segundo algoritmo ([17]) funciona segundo o seguinte princıpio: sabendo que o pixel
esta na zona afectada (seccao 3.3.1), os valores dos pixels R, G e B sao alterados segundo a
equacao 3.5:
red = red ∗ 0.513
green = green ∗ 1.0
blue = blue ∗ 0.193
(3.5)
A Figura 3.21 mostra uma fotografia com o efeito de olhos vermelhos e a Figura 3.22 e a
mesma fotografia depois de aplicado este algoritmo. Na Figura 3.23 temos a diferenca das
duas anteriores.
Figura 3.21: Imagem 2
Figura 3.22: Algoritmo 2
Figura 3.23: Diferenca para o algoritmo 2
42
3.3. ALGORITMOS PARA A REMOCAO DO EFEITO DE OLHOS VERMELHOS
3.3.5 Algoritmo 3
O terceiro algoritmo funciona segundo o seguinte princıpio: sabendo que o pixel esta na
zona afectada (seccao 3.3.1), os valores dos pixels R, G e B sao alterados segundo a equacao
3.6:
red = red ∗ (1 − K) (3.6)
Este algoritmo pretende reduzir a intensidade da cor vermelha de uma forma proporcio-
nal para todas as intensidades, de acordo com a incidencia da mesma (K, seccao 3.3.1). Ao
diminuir a intensidade da cor vermelha, esta-se simultaneamente a remover o efeito de olhos
vermelhos enquanto se preserva a cor natural do olho, permitindo assim obter um resultado
mais natural.
A Figura 3.24 mostra uma fotografia com o efeito de olhos vermelhos e a Figura 3.25 e a
mesma fotografia depois de aplicado este algoritmo. Na Figura 3.26 temos a diferenca das
duas anteriores.
Figura 3.24: Imagem 3
Figura 3.25: Algoritmo 3
Figura 3.26: Diferenca para o algoritmo 3
43
3.3. ALGORITMOS PARA A REMOCAO DO EFEITO DE OLHOS VERMELHOS
3.3.6 Algoritmo 4
O quarto algoritmo funciona segundo o seguinte princıpio: sabendo que o pixel esta na
zona afectada (seccao 3.3.1), os valores dos pixels R, G e B sao alterados segundo a equacao
3.7:
red =red ∗ 255√2552 + red3
(3.7)
Este algoritmo pretende reduzir a intensidade da cor vermelha de uma forma menos acen-
tuada nas baixas intensidades e de uma forma mais acentuada nas intensidades mais altas,
de acordo com a incidencia da mesma (K, seccao 3.3.1). Ao diminuir a intensidade da cor
vermelha, esta-se simultaneamente a remover o efeito de olhos vermelhos enquanto se pre-
serva a cor natural do olho, permitindo assim ter um resultado mais natural.
A Figura 3.27 mostra uma fotografia com o efeito de olhos vermelhos e a Figura 3.28 e a
mesma fotografia depois de aplicado este algoritmo. Na Figura 3.29 temos a diferenca das
duas anteriores.
Figura 3.27: Imagem 4
Figura 3.28: Algoritmo 4
Figura 3.29: Diferenca para o algoritmo 4
44
Capıtulo 4
Resultados
Imagem
Nome Resolucao Tamanho
(Pixels) (Bytes)
Img1.jpg 1704 x 2272 1.367.071
Img2.jpg 3072 x 2304 2.934.022
Img3.jpg 3072 x 2304 2.965.634
Img4.jpg 3072 x 2304 3.174.012
Tabela 4.1: Dados da imagem
GIMP (Qualidade 85%) GIMP (Qualidade 100%) Proposto
Tamanho PSNR Tamanho PSNR Tamanho PSNR
(Bytes) (dB) (Bytes) (dB) (Bytes) (dB)
489.198 41.0 1.820.889 50.0 1.367.464 60.7
843.782 39.5 3.900.372 46.8 2.934.151 63.6
876.159 38.9 3.923.088 44.0 2.965.761 72.2
1.010.363 38.4 4.121.994 43.8 3.174.555 67.9
Tabela 4.2: Resultados
As imagens usadas nas experiencias tentaram representar as varias situacoes possıveis do
dia a dia, isto e, as imagens foram obtidas variando a distancia ao indivıduo, tamanho e
intensidade do efeito de olhos vermelhos.
45
Quando as imagens sao processadas por outra aplicacao (GIMP [6]) verifica-se que para
um factor de qualidade de 85% o tamanho do ficheiro baixa em relacao ao original e a sua
qualidade e inferior a da aplicacao proposta.
Usando a mesma aplicacao (GIMP) mas usando um factor de qualidade de 100% verifica-se
que o tamanho do ficheiro aumenta significativamente e mesmo assim apresenta uma quali-
dade inferior a da aplicacao proposta.
A aplicacao proposta mantem o tamanho do ficheiro bastante identico ao original (ligei-
ramente superior) mas apresenta uma qualidade sempre significativamente superior ao de
outras aplicacoes.
Nas figuras seguintes pode-se ver quais os pixels modificados (cor branca), e consequente
perda de qualidade da imagem, apos remover o efeito de olhos vermelhos.
Na Figura 4.1 foi usada a aplicacao GIMP com um factor de qualidade de 85% e verifica-se
que a maior parte dos pixels foram alterados.
Na Figura 4.2 foi usada a aplicacao GIMP com um factor de qualidade de 100% verificando-
se que mesmo assim muitos dos pixels sofreram alteracoes.
Finalmente na Figura 4.3 foi usada a aplicacao proposta e facilmente se verifica que ape-
nas os pixels dos blocos onde esta presente o indesejado efeito foram modificados. Todos os
outros se mantiveram exactamente iguais, sendo esse o principal objectivo deste trabalho.
46
Alguns exemplos de imagens com o efeito de olhos vermelhos antes de depois de serem
processadas por este software:
Figura 4.4: Imagem 1 original
Figura 4.5: Imagem 1 corrigida
Linha de comando usada:
./redEyeRemoval -b 76 109 87 119 -b 132 112 143 122 red effect 1.jpg
48
Figura 4.6: Imagem 2 original
Figura 4.7: Imagem 2 corrigida
Linha de comando usada:
./redEyeRemoval -b 43 56 58 69 -b 134 46 149 61 red effect 2.jpg
Como se pode verificar atraves desta fotografia, o algoritmo de remocao do efeito de olhos
vermelhos usado por defeito (Algoritmo 4, seccao 3.3.6) mostra-se bastante eficaz na remocao
da tonalidade avermelhada do olho. Ao mesmo tempo, este algoritmo e capaz de reconhecer
a cor original do olho, ficando assim os olhos com a cor original, obtendo-se um resultado
final mais realista.
Como se pode verificar, os reflexos que os olhos com o efeito de olhos vermelhos continham
permaneceram inalterados, mesmo depois da fotografia ter sido processada por este software.
Estas sao algumas das vantagens deste algoritmo desenvolvido de raiz.
49
Figura 4.8: Imagem 3 original
Figura 4.9: Imagem 3 corrigida
Linha de comando usada:
./redEyeRemoval -b 98 157 117 173 -b 168 155 183 171 -k 40 red effect 3.jpg
50
Figura 4.10: Imagem 4 original
Figura 4.11: Imagem 4 corrigida
Linha de comando usada:
./redEyeRemoval -b 93 233 121 260 -b 234 220 265 248 -k 75 -a 4 red effect 4.jpg
51
Figura 4.13: Imagem 5 corrigida
Linha de comando usada:
./redEyeRemoval -b 684 647 713 675 -b 873 644 900 670 -b 145 703 160 718 -b 215 696
231 713 -k 50 red effect 5.jpg
53
Figura 4.15: Imagem 6 corrigida
Linha de comando usada:
./redEyeRemoval -b 1442 770 1495 827 -b 1785 874 1834 931 red effect 6.jpg
55
Figura 4.16: Imagem 7 original
Figura 4.17: Imagem 7 corrigida
Linha de comando usada:
./redEyeRemoval -b 46 28 63 48 red effect 7.jpg
56
Capıtulo 5
Conclusoes
O trabalho desenvolvido focou, numa primeira fase, o estudo da norma JPEG e o desen-
volvimento de um descodificador. Deste trabalho resultou uma biblioteca com um conjunto
de funcoes para manipulacao de ficheiros de imagem em formato JPEG e um programa que,
com o auxılio da biblioteca desenvolvida, efectua o processamento dos diversos blocos de um
ficheiro JPEG.
Numa segunda fase foi desenvolvido um codificador que apenas re-codifica os blocos alte-
rados e copia todos os outros de modo a que nao exista perda de qualidade em toda a imagem.
Numa ultima fase foram desenvolvidos alguns algoritmos de remocao do efeito de olhos
vermelhos e foram efectuados alguns testes de modo a comparar os resultados obtidos atraves
dos mesmos.
Grande parte das aplicacoes “comerciais” para processamento de imagens disponibiliza
“plugins” para remocao do efeito de olhos vermelhos. O grande problema e que todas essas
aplicacoes re-codificam toda a imagem e, como o JPEG e um formato de compressao com
perdas, isso vai degradar a qualidade da imagem e eventualmente aumentar o tamanho do
ficheiro resultante.
A principal contribuicao deste trabalho foi o desenvolvimento de uma aplicacao para
remocao do efeito de olhos vermelhos em fotografia digital no formato JPEG que apenas
re-codifica os Macroblocos alterados. A biblioteca para manipulacao de imagem em formato
JPEG e tambem importante, nao so para este trabalho mas tambem para possıveis trabalhos
futuros.
57
Do ponto de vista de resultados obtidos verifica-se que as imagens processadas pela fer-
ramenta desenvolvida ficam com muito melhor qualidade, quer do ponto de vista objec-
tivo (PSNR) quer subjectivo (visualmente) do que quando processadas com outra aplicacao
(GIMP). Usando a mesma aplicacao (GIMP) e usando um factor de qualidade de 100%
verifica-se que o tamanho do ficheiro aumenta significativamente e mesmo assim apresenta
uma qualidade inferior a da aplicacao proposta. A aplicacao proposta mantem o tamanho
do ficheiro bastante identico ao original (ligeiramente superior) mas apresenta uma qualidade
sempre significativamente superior ao de outras aplicacoes.
58
Capıtulo 6
Anexo
6.1 Manual do software
Do trabalho realizado resultou o desenvolvimento de uma biblioteca para manipulacao de
ficheiros no formato JPEG e no desenvolvimento de duas ferramentas:
- Um descodificador JPEG (converte JPEG para PPM (Portable Pixelmap))
- Uma ferramenta para remocao do efeito dos olhos vermelhos
O objectivo da biblioteca e a de facultar um conjunto de funcoes e estruturas de dados
que permita a manipulacao de ficheiros em formato JPEG.
A biblioteca esta dividida em alguns modulos:
- “encode” – Envolve todo o processo de codificacao do ficheiro
- “decode” – Envolve todo o processo de descodificacao do ficheiro
- “bitio” – Envolve todo o processo de manipulacao de bits
- “leedct” – Envolve os calculos relativos a DCT
- “common” – Envolve partes comuns a todos os modulos
59
6.1. MANUAL DO SOFTWARE
Para utilizar as ferramentas desenvolvidas utilizam-se os seguintes comandos:
jpeg-decoder
jpeg-decoder [Nome do ficheiro]
[Nome do ficheiro] ⇒ O nome do ficheiro deve incluir a extensao (jpg ou jpeg)
Como resultado e gerado 1 ficheiro:
decodedImage.ppm ⇒ Imagem descodificada
redEyeRemoval
redEyeRemoval [-h] [-v] [-a n] [-k c] [-b PHi PVi PHf PVf] [-b ...]
[Nome do ficheiro.jpg]
redEyeRemoval ⇒ Nome do executavel
-h ⇒ Mostra a ajuda
-v ⇒ Verbose mode. Aumenta o nıvel de informacao exibida na consola
-a ⇒ Indica que vai ser passado como parametro o algoritmo de remocao a usar
n ⇒ Numero do algoritmo a usar: [1..4]
-k ⇒ Constante para deteccao do efeito de olho vermelho
c ⇒ Valor a usar: [0..100]
-b ⇒ Indica que vao ser passadas como parametros as coordenadas (pixeis) da area afectada.
Pode ser repetido para 100 areas diferentes.
PHi ⇒ Valor horizontal do pixel superior esquerdo da zona afectada
PVi ⇒ Valor vertical do pixel superior esquerdo da zona afectada
PHf ⇒ Valor horizontal do pixel inferior direito da zona afectada
PVf ⇒ Valor vertical do pixel inferior direito da zona afectada
60
6.1. MANUAL DO SOFTWARE
Figura 6.1: Area afectada
[Nome do ficheiro] ⇒ O nome do ficheiro deve incluir a extensao (jpg ou jpeg)
Exemplo:
redEyeRemoval -v -a 4 -k 85 -b 2 2 50 50 -b 200 2 250 50 filename.jpg
Como resultado sao gerados 3 ficheiros:
decodedImage.ppm ⇒ Imagem descodificada
redEyeRemoved.ppm ⇒ Imagem descodificada com remocao do efeito
redEyeRemoved.jpg ⇒ Imagem re-codificada com remocao do efeito
Este software foi concebido para ser versatil no seu modo de funcionamento.
Ao correr este software sem qualquer argumento, o proprio software e capaz de pesquisar
na fotografia por areas avermelhadas usando valores predefinidos e, caso nao encontre ne-
nhuma area, processa a imagem de destino como uma copia da original.
Se encontrar alguma area avermelhada, processa a fotografia a partir desse ponto ate ao
final, removendo essa e todas as areas avermelhadas encontradas.
61
6.1. MANUAL DO SOFTWARE
Caso seja passada como argumento uma area a remover o efeito de olhos vermelhos, o
software apenas processa a fotografia nessa area, nao alterando qualquer dado noutra area
da mesma.
Se forem passadas varias areas para ser removido o efeito de olhos vermelhos (ate um
maximo de 100) apenas essas areas sao processadas, ficando todo o resto da fotografia inal-
terada em relacao ao original.
Se alguma, ou todas, das areas passadas como argumentos para remocao do efeito de olhos
vermelhos nao tiverem de facto uma zona avermelhada, ou a tonalidade da cor vermelha seja
inferior ao da constante utilizada por defeito pelo software (esta constante (K) pode ser pas-
sada como parametro), o software e capaz de reconhecer esse facto e, pura e simplesmente,
ignora essa area nao efectuando qualquer alteracao nos dados da mesma. Este facto nao
impossibilita que o efeito de olhos vermelhos seja removido noutra das areas introduzidas,
porque o software trata cada e todas as areas a remover o efeito de forma individual.
62
Capıtulo 7
Referencias
[1] Pennebacker, William B., Mitchell Joan L., “JPEG still image data compression stan-
dard”, placeStateNew York, 1993
[2] ISO/IEC, “Information Technology – Digital Compression And Coding Of Continuous-
Tone Still Images – Requirements And Guidelines“, ITU Recommendation T.81, 1992
[3] Wallace, Gregory k., “The JPEG Still Picture Compression Standard”, IEEE Transactions
on Consumer Electronics, 1991
[4] CityplaceHamilton, Eric, “JPEG File Interchange Format”, Version 1.02, 1992
[5] http://www.cs.sfu.ca/CC/365/li/material/notes/Chap4/Chap4.2/Chap4.2.html
[6] http://www.gimp.org/
[7] http://www.jpeg.org/jpeg/index.html
[8] http://cnx.org/content/m11096/latest/
[9] http://stargate.ecn.purdue.edu/˜ips/tutorials/jpeg/jpegtut1.html
[10] http://www.w3.org/Graphics/JPEG/
[11] http://en.wikipedia.org/wiki/JPEG
63
[12] D. Salomon, “Data compression - The complete reference”, Springer, 2000, 2nd edition
[13] http://www.videnet.gatech.edu/cookbook.pt/list page.php?topic=3&url
=mjpeg.htm&level=1&sequence=4&name=Motion%20JPEG%20(MJPEG)
[14] Honthaner, Eve Light, “The Complete Film Production Handbook”, 2001, Third Edition
[15] Miano, John, “Compressed Image File Formats: JPEG, PNG, GIF, XBM, BMP’, 1999,
Pap/Cdr Edition
[16] Taubman, David, Marcellin, Michael, “JPEG2000: Image Compression Fundamentals,
Standards and Practice”, Springer, 2001, 1st Edition
[17] http://registry.gimp.org/plugin?id=4212
64