eficiência, qualidade e compressão do processamento digital
TRANSCRIPT
UNIVERSIDADE ESTADUAL DE CAMPINASFaculdade de Engenharia Elétrica e de Computação
Daniel Rodrigues Ferraz Izario
Eficiência, qualidade e compressão doprocessamento digital de imagem/vídeo
Campinas
2019
UNIVERSIDADE ESTADUAL DE CAMPINASFaculdade de Engenharia Elétrica e de Computação
Daniel Rodrigues Ferraz Izario
Eficiência, qualidade e compressão do processamento digital de
imagem/vídeo
Dissertação apresentada à Faculdade deEngenharia Elétrica e de Computação daUniversidade Estadual de Campinas comoparte dos requisitos exigidos para a ob-tenção do título de Mestre em EngenhariaElétrica, na Área de Telecomunicações eTelemática.
Orientador: Prof. Dr. Yuzo Iano.
ESTE EXEMPLAR CORRESPONDE À VER-
SÃO FINAL DA DISSERTAÇÃO DEFENDIDA
PELO ALUNO DANIEL RODRIGUES FER-
RAZ IZARIO, E ORIENTADA PELO PROF.
DR. YUZO IANO.
Campinas
2019
Ficha catalográficaUniversidade Estadual de Campinas
Biblioteca da Área de Engenharia e ArquiteturaRose Meire da Silva - CRB 8/5974
Izario, Daniel Rodrigues Ferraz, 1993- Iz1e IzaEficiência, qualidade e compressão do processamento digital de
imagem/vídeo / Daniel Rodrigues Ferraz Izario. – Campinas, SP : [s.n.], 2019.
IzaOrientador: Yuzo Iano. IzaDissertação (mestrado) – Universidade Estadual de Campinas, Faculdade
de Engenharia Elétrica e de Computação.
Iza1. Processamento de imagem assistida por computador. 2. Equações
diferenciais parciais. I. Iano, Yuzo, 1950-. II. Universidade Estadual deCampinas. Faculdade de Engenharia Elétrica e de Computação. III. Título.
Informações para Biblioteca Digital
Título em outro idioma: Efficiency, quality and compression of digital image/videoprocessingPalavras-chave em inglês:Computer aided image processingPartial differential equationsÁrea de concentração: Telecomunicações e TelemáticaTitulação: Mestre em Engenharia ElétricaBanca examinadora:Yuzo Iano [Orientador]Cristiano AkamineRosivaldo FerrareziData de defesa: 16-08-2019Programa de Pós-Graduação: Engenharia Elétrica
Identificação e informações acadêmicas do(a) aluno(a)- ORCID do autor: https://orcid.org/0000-0002-8024-0324- Currículo Lattes do autor: http://lattes.cnpq.br/9174775045358016
Powered by TCPDF (www.tcpdf.org)
COMISSÃO JULGADORA - TESE DE MESTRADO
Candidato: Daniel Rodrigues Ferraz Izario | RA: 210314Data da Defesa: 16 de AGOSTO de 2019.
Título da Tese:
“Eficiência, qualidade e compressão do processamento digital de imagem/vídeo”.
Comissão Julgadora:
Prof. Dr. Yuzo Iano (Presidente, FEEC/UNICAMP);Prof. Dr. Cristiano Akamine (Titular, MACKENZIE);Prof. Dr. Rosivaldo Ferrarezi (Titular, UNIP);
A ata de defesa, com as respectivas assinaturas dos membros da Comissão Julgadora,encontra-se no processo de vida acadêmica do aluno.
Aos meus pais, Helcio e Neuzeli.
Agradecimentos
Gostaria de agradecer a Deus por me guiar, iluminar e me dar tranquilidade paraseguir em frente com os meus objetivos e não desanimar com as dificuldades.
Esta tese é fruto da colaboração de várias pessoas, que apoiaram várias fasesdeste trabalho tornando possível a sua realização. Agradeço a todos e em especial:
Ao meu pai, Prof. Dr. Helcio José Izario Filho e à minha mãe, Neuzeli AparecidaRodrigues Ferraz Izario, por toda a educação, carinho e confiança depositados em mimdurante o desenvolvimento desta tese.
Ao meu irmão, Me. Bruno Rodrigues Ferraz Izario, pelo apoio dado durante todoo processo de pesquisa.
À minha esposa, Karine Mendes Siqueira Rodrigues Ferraz Izario, pela paciênciae apoio em todo passo a passo para preparação das fases e resultados da pesquisa.
Ao meu filho, Daniel Rodrigues Ferraz Izario Filho, pelos sorrisos dados durantea reta final desta tese.
Ao meu orientador e incentivador, Prof. Dr. Yuzo Iano, pela oportunidade, con-selhos, sugestões e correções que propiciaram a finalização desta tese.
Por fim, ao LCV-UNICAMP (Laboratório de Comunicações Visuais - UNICAMP)e todos os amigos feitos por lá, que participaram das etapas deste trabalho, principal-mente, ao amigo Me. Diego Arturo Pajuelo Castro.
’Os encantos dessa sublime ciênciase revelam apenas àqueles que tem
coragem de irem a fundo nela.’(Carl Friedrich Gauss)
Resumo
A pesquisa apresenta três técnicas para a aplicação do processamento digital de ima-gem/vídeo, sendo elas: Partial Differential Equation, High Dynamic Range e Discrete Co-sine Transform, utilizando o máximo dos processadores (Central Process Unit e GraphicsProcessing Unit), com o uso intensivo e preciso das threads.
Todas as técnicas citadas passam por um processo chamado de “Planilha de Pixels eGráficos”, no qual, uma varredura sobre a imagem/quadro gera uma planilha de pi-xels, ou seja, gerar uma matriz MxN e executar uma análise de padronização de vizi-nhança, criando um processo inteligente de renderização de múltiplas cópias de cadapixel e a interpolação entre eles, recebendo um ganho de qualidade.
Ao contrário das técnicas convencionais, será possível ganhar em termos de tempode processamento, manipulação de pixels, qualidade de imagem e armazenamento embanco de dados. Todas as técnicas foram testadas e comprovadas através de imagensreais, podendo também ser aplicadas em vídeo. Os algoritmos criados usam as lingua-gens de programação JavaScript, Java e Clojure (Lisp), combinadas com modelos mate-máticos no domínio do tempo e no domínio da frequência.
Como resultado, a melhoria no processamento e desempenho da imagem/quadro di-gital, sendo visualizado por gráficos de tempo, histogramas RGB (R - Red, G - Green e B- Blue), razão entre o sinal-ruído e uma análise do perfil da imagem/quadro em termosde qualidade dos pixels, comparando matricialmente.
Palavras-chaves: Clojure; Discrete Cosine Transform; Filtros; High-Dynamic Range; His-tograma; Java; JavaScript; Lisp; Partial Differential Equation; Processamento Digital deImagem/Vídeo.
AbstractThe research presents three techniques for the application of digital image/video pro-cessing: Partial Differential Equation, High Dynamic Range and Discrete Cosine Trans-form, using the maximum of the processors (Central Process Unit and Graphics Pro-cessing Unit), with the intensive and precise use of threads.
All the mentioned techniques go through a process called "Pixels and Graphs Work-sheet", in which a scan on the image/frame generates a pixel sheet, that is, generatean MxN matrix and perform a neighborhood standardization analysis, creating an in-telligent process of rendering multiple copies of each pixel and interpolating betweenthem, receiving a quality gain.
Unlike conventional techniques, it will be possible to gain in terms of processing time,pixel manipulation, image quality and database storage. All the techniques have beentested and proven through real images, and can also be applied in video. The algo-rithms created use JavaScript, Java and Clojure (Lisp) programming languages, com-bined with mathematical models in time domain and frequency domain.
As a result, the improvement in the processing and performance of the digital im-age/frame is visualized by time graphs, RGB histograms (R - Red, G - Green and B -Blue), signal-noise ratio and image/frame in terms of pixel quality, comparing matrix.
Keywords: Clojure; Digital Image/Video Processing; Discrete Cosine Transform; Fil-ters; High-Dynamic Range; Histogram; Java; JavaScript; Lisp; Partial Differential Equa-tion.
Lista de Ilustrações
Figura 1.1 – Processo de evolução das revoluções industriais. . . . . . . . . . . . . 25Figura 2.1 – Modelo de hierarquia das etapas do PDI. . . . . . . . . . . . . . . . . 28Figura 2.2 – Espectro eletromagnético. . . . . . . . . . . . . . . . . . . . . . . . . . 30Figura 2.3 – Visão geral do olho humano. . . . . . . . . . . . . . . . . . . . . . . . 31Figura 2.4 – Comparação entre o olho humano e um sensor fotográfico. . . . . . . 32Figura 2.5 – Modelo cromático RGB. . . . . . . . . . . . . . . . . . . . . . . . . . . 33Figura 2.6 – Histograma do modelo cromático RGB. . . . . . . . . . . . . . . . . . 34Figura 2.7 – Modelo cromático CMY. . . . . . . . . . . . . . . . . . . . . . . . . . . 34Figura 2.8 – Representação de uma imagem/quadro digital bidimensional. . . . . 36Figura 2.9 – Representação em camada de uma imagem/quadro digital RGB -
Exemplo 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Figura 2.10–Representação em camada de uma imagem/quadro digital RGB -
Exemplo 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Figura 2.11–Representação em camada de uma imagem/quadro digital RGB -
Exemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Figura 2.12–Influência da variação do número de amostras e de níveis de quan-
tização na qualidade de uma imagem/quadro digital. . . . . . . . . . 40Figura 3.1 – Primeiros passos do PDI nas aplicações (JavaScript e Java). . . . . . . 41Figura 3.2 – Escolha dos próximos passos nas aplicações (JavaScript e Java). . . . . 42Figura 3.3 – Estrutura da aplicação web (JavaScript). . . . . . . . . . . . . . . . . . . 43Figura 3.4 – Modelo básico do PDI (Java). . . . . . . . . . . . . . . . . . . . . . . . 45Figura 3.5 – Relação entre RParameter e o EParameter. . . . . . . . . . . . . . . . . 47Figura 3.6 – Relação entre o Parameter e o RError sem correção. . . . . . . . . . . . 47Figura 3.7 – Relação entre o Parameter e o RError com correção. . . . . . . . . . . . 48Figura 3.8 – Processamento de imagem/quadro usando Fourier. . . . . . . . . . . 50Figura 3.9 – Os passos da filtragem no domínio de Fourier. . . . . . . . . . . . . . 53Figura 3.10–Resultado da filtragem passa baixa. . . . . . . . . . . . . . . . . . . . 54Figura 3.11–Resultado da filtragem passa alta. . . . . . . . . . . . . . . . . . . . . 55Figura 3.12–Resultado do filtro Gabor, com o parâmetro f incorreto e correto. . . 57Figura 3.13–Resultado do filtro Gabor, com o parâmetro θ incorreto e correto. . . . 57Figura 3.14–Processo de convolução por filtragem espacial usando máscara. . . . 58Figura 3.15–Descontinuidades nas intensidades da imagem/quadro. . . . . . . . 59Figura 3.16–Filtro Blur em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64Figura 3.17–Filtro Brightness em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . 65Figura 3.18–Filtro Contrast em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . 66Figura 3.19–Filtro Grayscale em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . 66
Figura 3.20–Filtro Hue-rotate em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . 67Figura 3.21–Filtro Invert em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Figura 3.22–Filtro Opacity em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . 69Figura 3.23–Filtro Saturate em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . 70Figura 3.24–Filtro Sepia em vídeo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70Figura 3.25–Filtro Blue em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . . 72Figura 3.26–Filtro GrayScale em imagem/quadro. . . . . . . . . . . . . . . . . . . . 73Figura 3.27–Filtro Green em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . 73Figura 3.28–Filtro Invert em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . 74Figura 3.29–Filtro Red em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . . 75Figura 3.30–Filtro Saturation em imagem/quadro. . . . . . . . . . . . . . . . . . . 76Figura 3.31–Filtro Sepia em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . 77Figura 3.32–Filtro Thresholding em imagem/quadro. . . . . . . . . . . . . . . . . . 78Figura 3.33–Filtro Gaussian em imagem/quadro. . . . . . . . . . . . . . . . . . . . 79Figura 3.34–Filtro Highpass em imagem/quadro. . . . . . . . . . . . . . . . . . . . 79Figura 3.35–Filtro Laplacian em imagem/quadro. . . . . . . . . . . . . . . . . . . . 80Figura 3.36–Filtro Lowpass em imagem/quadro. . . . . . . . . . . . . . . . . . . . . 81Figura 3.37–Filtro Prewitt em imagem/quadro. . . . . . . . . . . . . . . . . . . . . 82Figura 3.38–Filtro Sharpen em imagem/quadro. . . . . . . . . . . . . . . . . . . . . 83Figura 3.39–Filtro Roberts em imagem/quadro. . . . . . . . . . . . . . . . . . . . . 84Figura 3.40–Filtro Sobel em imagem/quadro. . . . . . . . . . . . . . . . . . . . . . 84Figura 3.41–Exemplo do processo da equalização histogrâmica. . . . . . . . . . . 86Figura 3.42–Técnica Tone Mapping. . . . . . . . . . . . . . . . . . . . . . . . . . . . 90Figura 3.43–Resultante HDR. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Figura 4.1 – Etapas da técnica de Pixels e Gráficos. . . . . . . . . . . . . . . . . . . 93Figura 4.2 – Comparação entre a Ioriginal com ruído e a Iresult. . . . . . . . . . . . . 96Figura 4.3 – Localização da GPU na placa de vídeo. . . . . . . . . . . . . . . . . . 107Figura 4.4 – Processador Intel Core i9-8950HK. . . . . . . . . . . . . . . . . . . . . . 110Figura 4.5 – Placa de vídeo GeForce GTX 1070 Ti. . . . . . . . . . . . . . . . . . . . 111Figura 4.6 – Comparativo do PDI, entre CPU e GPU. . . . . . . . . . . . . . . . . . 114Figura 4.7 – Exemplo de uma imagem/quadro em blocos 8x8. . . . . . . . . . . . 117Figura 4.8 – Comparação entre a imagem/quadro original e a IDCT. . . . . . . . . 121Figura 5.1 – Comparativo do tempo de processamento da filtragem. . . . . . . . . 122Figura 5.2 – Aplicação da técnica de filtragem - Exemplo 1. . . . . . . . . . . . . . 124Figura 5.3 – Aplicação da técnica de filtragem - Exemplo 2. . . . . . . . . . . . . . 125Figura 5.4 – Aplicação da técnica de filtragem - Exemplo 3. . . . . . . . . . . . . . 126Figura 5.5 – Comparativo do histograma das imagens/quadros filtrados. . . . . . 127Figura 5.6 – Imagem resultante HDR utilizada no primeiro teste. . . . . . . . . . . 128Figura 5.7 – Comparativo do tempo de processamento HDR. . . . . . . . . . . . . 128
Figura 5.8 – Comparativo do histograma da imagem HDR. . . . . . . . . . . . . . 129Figura 5.9 – Comparativo na qualidade da imagem HDR. . . . . . . . . . . . . . . 130Figura 5.10–Comparativo do tempo de processamento da técnica HDR/Tone Map-
ping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Figura 5.11–Aplicação da técnica HDR/Tone Mapping - Exemplo 1. . . . . . . . . . 132Figura 5.12–Aplicação da técnica HDR/Tone Mapping - Exemplo 2. . . . . . . . . . 133Figura 5.13–Aplicação da técnica HDR/Tone Mapping - Exemplo 3. . . . . . . . . . 134Figura 5.14–Aplicação da técnica HDR/Tone Mapping - Exemplo 4. . . . . . . . . . 135Figura 5.15–Aplicação da técnica HDR/Tone Mapping - Exemplo 5. . . . . . . . . . 136Figura 5.16–Aplicação da técnica HDR/Tone Mapping - Exemplo 6. . . . . . . . . . 137Figura 5.17–Comparativo do tempo de processamento na DCT/IDCT. . . . . . . 138Figura 5.18–Comparativo na qualidade da imagem/quadro usando DCT/IDCT
- Exemplo 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139Figura 5.19–Comparativo na qualidade da imagem/quadro usando DCT/IDCT
- Exemplo 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Figura 5.20–Comparativo do histograma das imagens/quadros com DCT/IDCT. 141Figura 5.21–Gráficos das etapas dos pixels na DCT/IDCT. . . . . . . . . . . . . . . 142Figura 5.22–Aplicação da técnica DCT/IDCT - Exemplo 1. . . . . . . . . . . . . . 143Figura 5.23–Aplicação da técnica DCT/IDCT - Exemplo 2. . . . . . . . . . . . . . 144
Lista de Tabelas
Tabela 2.1 – Comprimento de onda das cores primárias RGB. . . . . . . . . . . . . 33Tabela 2.2 – Combinação de primárias nos modelos RGB e CMY. . . . . . . . . . . 34Tabela 2.3 – Representação das cores por valores decimais e inteiros. . . . . . . . . 35Tabela 2.4 – Número de bytes para uma imagem monocromática. . . . . . . . . . . 39Tabela 2.5 – Número de bytes para uma imagem colorida. . . . . . . . . . . . . . . 40Tabela 4.1 – Características Específicas - Central Process Unit. . . . . . . . . . . . . 106Tabela 4.2 – Características Específicas - Graphics Processing Unit. . . . . . . . . . . 108Tabela 4.3 – Características - Processador: Intel Core i9-8950HK. . . . . . . . . . . . 111Tabela 4.4 – Características - Placa de vídeo: GeForce GTX 1070 Ti. . . . . . . . . . 112Tabela 4.5 – Fatores de Qualidade. . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Lista de Algoritmos
Algoritmo 3.1 Implementação em Java para conversão. . . . . . . . . . . . . 49Algoritmo 3.2 Implementação em JavaScript para conversão. . . . . . . . . . 49Algoritmo 3.3 Implementação em JavaScript da convolução. . . . . . . . . . . 61Algoritmo 3.4 Implementação em Java da convolução. . . . . . . . . . . . . . 62Algoritmo 3.5 Implementação em Lisp do CSS filtre. . . . . . . . . . . . . . . 63Algoritmo 3.6 Implementação do filtro Blur em CSS. . . . . . . . . . . . . . . 64Algoritmo 3.7 Implementação do filtro Brightness em CSS. . . . . . . . . . . 65Algoritmo 3.8 Implementação do filtro Contrast em CSS. . . . . . . . . . . . . 67Algoritmo 3.9 Implementação do filtro Grayscale em CSS. . . . . . . . . . . . 67Algoritmo 3.10 Implementação do filtro Hue-rotate em CSS. . . . . . . . . . . 68Algoritmo 3.11 Implementação do filtro Invert em CSS. . . . . . . . . . . . . . 68Algoritmo 3.12 Implementação do filtro Opacity em CSS. . . . . . . . . . . . . 69Algoritmo 3.13 Implementação do filtro Saturate em CSS. . . . . . . . . . . . . 71Algoritmo 3.14 Implementação do filtro Sepia em CSS. . . . . . . . . . . . . . 71Algoritmo 3.15 Implementação em JavaScript do filtro Blue. . . . . . . . . . . . 72Algoritmo 3.16 Implementação em JavaScript do filtro GrayScale. . . . . . . . . 73Algoritmo 3.17 Implementação em JavaScript do filtro Green. . . . . . . . . . . 74Algoritmo 3.18 Implementação em JavaScript do filtro Invert. . . . . . . . . . . 74Algoritmo 3.19 Implementação em JavaScript do filtro Red. . . . . . . . . . . . 75Algoritmo 3.20 Implementação em JavaScript do filtro Saturation. . . . . . . . 76Algoritmo 3.21 Implementação em JavaScript do filtro Sepia. . . . . . . . . . . 77Algoritmo 3.22 Implementação em JavaScript do filtro Thresholding. . . . . . . 78Algoritmo 3.23 Implementação em JavaScript do filtro Gaussian. . . . . . . . . 79Algoritmo 3.24 Implementação em JavaScript do filtro Highpass. . . . . . . . . 80Algoritmo 3.25 Implementação em JavaScript do filtro Laplacian. . . . . . . . . 80Algoritmo 3.26 Implementação em JavaScript do filtro Lowpass. . . . . . . . . 81Algoritmo 3.27 Implementação em JavaScript do filtro Prewitt. . . . . . . . . . 82Algoritmo 3.28 Implementação em JavaScript do filtro Sharpen. . . . . . . . . . 83Algoritmo 3.29 Implementação em JavaScript do filtro Roberts. . . . . . . . . . 84Algoritmo 3.30 Implementação em JavaScript do filtro Sobel. . . . . . . . . . . 85Algoritmo 3.31 Implementação em JavaScript do histograma. . . . . . . . . . . 87Algoritmo 3.32 Implementação em Java do histograma. . . . . . . . . . . . . . 88Algoritmo 4.1 Implementação em JavaScript do Tone Mapping Global. . . . . . 100Algoritmo 4.2 Implementação em Java do Tone Mapping Global. . . . . . . . . 101Algoritmo 4.3 Implementação em JavaScript do Tone Mapping Local. . . . . . 103Algoritmo 4.4 Implementação em Java do Tone Mapping Local. . . . . . . . . . 104
Algoritmo 4.5 Implementação em CG/HLSL do CUDA . . . . . . . . . . . . 109Algoritmo 4.6 Implementação em Clojure do multithreaded (Parte 1). . . . . . 113Algoritmo 4.7 Implementação em Clojure do multithreaded (Parte 2). . . . . . 114Algoritmo 4.8 Implementação em JavaScript do multithreaded extra. . . . . . 115Algoritmo 4.9 Implementação em JavaScript da DCT/IDCT (Parte 1). . . . . 117Algoritmo 4.10 Implementação em JavaScript da DCT/IDCT (Parte 2). . . . . 118
Abreviaturas, Acrônimos e Siglas3Ds Três Dimensões.
API Application Programming Interface.
BD Banco de Dados.
bit Binary Digit.
byte Binary Term.
CG C for Graphics.
CIE Comission Internationale de l’Eclairage.
CMY C - cyan, M - magenta e Y - yellow.
CPU Central Process Unit.
CSS Cascading Style Sheets.
CUDA Compute Unified Device Architecture.
DCT Discrete Cosine Transform.
DDR Double Data Rate.
deg Degree.
DFT Discrete Fourier Transform.
DMI Direct Media Interface.
ELT Erro Local de Truncamento.
EParameter Estimated Parameter.
FFmpeg Programa de computador que grava, converte e cria stream de áudio e vídeo.
FFT Fast Fourier Transform.
GB Unidade de armazenamento em computador, 1.073.741.824 bytes.
GDDR Graphics Double Data Rate.
GHz Gigahertz.
GPGPU General Purpose Graphics Processing Unit.
GPU Graphics Processing Unit.
GT Gigatransfers.
GTX Indica melhor performance para jogos e uso profissional de gráficos (NVIDIA).
HDR High-Dynamic Range.
HDRi High-Dynamic Range imaging.
HK H - Processor Line e K - Letter Suffix (Intel).
HLSL High Level Shading Language.
HTML Hypertext Markup Language.
Hz hertz.
I Componente Imaginária.
i9 Brand Modifier (Intel).
IEC International Electrotechnical Commission.
IoT Internet of Things.
IDCT Inverse Discrete Cosine Transform.
Ioriginal Imagem Original.
Iresult Imagem Resultante.
ISO International Organization for Standardization.
J joule.
JDK Java Development Kit.
JNA Java Native Access.
JPEG Joint Photographic Experts Group.
JRE Java Runtime Environment.
JSON JavaScript Object Notation.
JVM Java Virtual Machine.
kB Unidade de armazenamento em computador, 1.024 bytes.
LPDDR Low Power Double Data Rate.
MB Unidade de armazenamento em computador, 1.048.576 bytes.
MHz Megahertz.
MSAA MultiSample Anti-Aliasing.
MSE Mean Squared Error.
MVVM Model-View-View-Model.
nm Nanometro.
NPM Node Package Manager.
PDE Partial Differential Equation.
PDI Processamento Digital de Imagem.
PDI/V Processamento Digital de Imagem/Vídeo.
PDV Processamento Digital de Vídeo.
PHP Hypertext Preprocessor.
PNG Portable Network Graphics.
POO Programação Orientada a Objetos.
PSNR Peak Signal to Noise Ratio.
px Pixel.
R Componente Real.
RAM Random Access Memory.
RError Relative Error.
RGB R - red, G - green e B - blue.
RParameter Real Parameter.
RWD Responsive Web Design.
s Segundos.
SGBD Sistema de Gerenciamento de Banco de Dados.
SIMD Single Instruction Multiple Data.
SNR Signal to Noise Ratio.
SO Sistema Operacional.
SPA Single-Page Applications.
SQL Structured Query Language.
STMD Single Thread Multiple Data.
TDP Thermal Design Power
TempE Tempos de Exposição.
Ti Nomenclatura utilizada para determinar alta performance (NVIDIA).
TMms Tone Mapping de escala múltipla.
TMss Tone Mapping de escala única.
UC Unidade de Controle.
UI User Interface.
ULA Unidade Lógica e Aritmética.
VLCj API para desenvolvimento em java de um player de vídeo open-source.
W watt.
web Referência à rede mundial de computadores.
YCbCr Y - brilho, Cb - componente blue e Cr - componente red.
Sumário
1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.1 Considerações Iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.2 Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.4 Estrutura do Trabalho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2 Revisão da Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.1 Processamento Digital de Imagem . . . . . . . . . . . . . . . . . . . . . . 282.1.1 Natureza da Luz . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.1.2 Olho Humano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.1.3 Modelos Cromáticos . . . . . . . . . . . . . . . . . . . . . . . . . . 332.1.4 Imagem Digital . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.1.5 Amostragem e Quantização . . . . . . . . . . . . . . . . . . . . . . 38
3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1 Aplicações: JavaScript e Java . . . . . . . . . . . . . . . . . . . . . . . . . . 413.1.1 Vídeo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463.1.2 Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.1.2.1 Domínio da Frequência . . . . . . . . . . . . . . . . . . . 503.1.2.1.1 Filtro Passa Baixa . . . . . . . . . . . . . . . . . . 543.1.2.1.2 Filtro Passa Alta . . . . . . . . . . . . . . . . . . 553.1.2.1.3 Filtro de Gabor . . . . . . . . . . . . . . . . . . . 55
3.1.2.2 Domínio Espacial . . . . . . . . . . . . . . . . . . . . . . . 573.1.2.3 Convolução de Imagem . . . . . . . . . . . . . . . . . . . 603.1.2.4 Filtros Personalizados - Vídeo . . . . . . . . . . . . . . . 633.1.2.5 Filtros Personalizados - Imagem . . . . . . . . . . . . . . 71
3.1.3 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.1.4 High Dynamic Range . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
4 Algoritmo/Equações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
4.1 Planilha de Pixels e Gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . 924.2 Partial Differential Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . 944.3 High Dynamic Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 974.4 Processadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
4.4.1 Central Process Unit . . . . . . . . . . . . . . . . . . . . . . . . . . . 1064.4.2 Graphics Processing Unit . . . . . . . . . . . . . . . . . . . . . . . . 1074.4.3 Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.5 Discrete Cosine Transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1165 Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
5.1 Partial Differential Equation . . . . . . . . . . . . . . . . . . . . . . . . . . . 1225.2 High Dynamic Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1285.3 Discrete Cosine Transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
6 Conclusão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7 Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
7.1 Doutorado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Referências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Apêndices 154APÊNDICE A Publicações do Autor . . . . . . . . . . . . . . . . . . . . . . . . . 155
22
1 Introdução
1.1 Considerações Iniciais
O processamento digital de imagem/vídeo (PDI/V) entende-se como um pro-
cesso de manipulação de uma imagem (em vídeo, chamado de quadro) por compu-
tador de modo que a entrada e a saída do processo sejam imagens [1]. Contudo, o
conceito de imagem ganha diferentes interpretações ao longo dos anos, através da his-
tória da filosofia e das artes visuais [2]. Etimologicamente, a palavra “imagem”, tem
como registro uma definição de “representação artificial que aparenta a uma pessoa ou
coisa”. Porém, para a língua portuguesa o termo vem do francês image, antes imagene
(século XI), do latim imaginen (do nominativo imago). Denota “cópia, estátua, picture,
ideia ou aparência”, que vem de imitari enquanto “copiar/imitar” [3].
Mas não adianta entender a palavra “imagem”, sem entender a ideia de “ima-
gem”, a partir dos filósofos e da tradição oral filosófica que vem de imago do latim. O
primeiro foi Aristóteles (384 a.C. - 322 a.C.) [4], que estava ligado às coisas materiais,
tanto pela sensação como pela percepção. Depois vieram os Estoicos (111 a.C. - I d.C.)
que diferenciavam as imagens sensíveis das não sensíveis e passaram a usar a pala-
vra imaginação para imagem interior. Já os Epicuristas (111 a.C. - 11 a.C.) acreditavam
na verdade das imagens por estas serem produzidas e, tão somente, por aquilo que
existe. Estes conceitos cruzaram a Idade Média através de São Tomás de Aquino, que
os utiliza como forma de esclarecimento entre a natureza divina e a humana [5].
Registra-se, além dessas anteriores, o termo imagismo como o nome dado ao mo-
vimento em poesia para referir-se à busca da clareza de expressão através do uso de
imagens visuais precisas, por exemplo, hard light (“luz contrastada”) e clear edges (“ni-
tidez, contornos nítidos”), criado por Ezra Pound [6]. Na modernidade, estes conceitos
mudam. Para Bacon (1561-1626) e Hobbes (1588-1679) [7], a imagem passa a ser o ato de
sentir, e o termo imagem passa a perder espaço para a designação ideia, inicialmente
Capítulo 1. Introdução 23
conceituada como essência, ideal ou modelo do que é multíplice, e logo depois em
Descartes (1596-1650) e Wolff (1679-1754) [8], a imagem ou ideia passa a ser vista como
representação, por semelhança do objeto, representação de algo. Kant (1724-1804) [9]
a define como ato ou manifestação cognitiva independente de semelhança. Os termos
“ideia” e “representação” persistem na filosofia contemporânea e o termo “imagem”
hoje, encontra-se ligado ao caráter ou origem sensível das ideias ou representações de
que o ser humano dispõe.
No uso comum, uma imagem é um artefato que reproduz a semelhança a um
objeto, normalmente objeto físico ou pessoa, sendo bidimensionais, como uma fotogra-
fia, ou tridimensionais, como uma estátua. São tipicamente produzidas por aparelhos
ópticos, tais como câmeras, espelhos, lentes, telescópios, microscópios, computadores
etc. e objetos e fenômenos naturais como o olho humano ou superfícies de água, por
exemplo. Em outros contextos científicos e técnicos, “imagem” refere-se a um “sinal
bidimensional”, como um fenômeno físico que pode ser modelado como uma função
do domínio bidimensional. Em computação gráfica e processamento digital, que é o
ponto que está sendo analisado a fundo no contexto, a palavra quase sempre se re-
fere à imagem digital ou, por extensão, a qualquer produção imagética gerada pelo
computador [1].
Portanto, gerar uma imagem é algo fácil, pode ser no próprio imaginário e o
decorrer da história humana demonstra isso, mas produzir uma imagem/quadro de
alta resolução digital com perfeita qualidade e rapidez no alto processamento dos pi-
xels, isso ainda não foi realizado. No atual processamento digital de imagem/vídeo
existem vários tipos de degradações e distorções, inerentes aos processos de aquisição,
transmissão e visualização de imagens/quadros, que contribuem para limitar cada vez
mais a qualidade de todo o processo.
Capítulo 1. Introdução 24
1.2 Motivação
O processamento digital de imagem/vídeo surgiu como um processo fundamen-
tal na garantia da qualidade ou da informação a ser gerada em três aspectos funda-
mentais: qualidade, manipulação e interpretação. Além da grande evolução durante
os anos, como citado por [10]:
“A área de processamento digital de imagem/vídeo vem evoluindo con-
tinuamente ao longo dos anos, com um aumento significativo de estudos
envolvendo morfologia matemática, redes neurais, processamento de ima-
gens coloridas, compressão de imagens, reconhecimento de imagens e sis-
temas de análise de imagens baseados em conhecimento.”
Tudo se deu início na Revolução Industrial, a primeira delas foi um processo
de grandes transformações econômico-sociais que começou na Inglaterra no século
XVIII, o processo que levou à substituição das ferramentas pelas máquinas, da energia
humana pela energia motriz e do modo de produção doméstico (ou artesanal) pelo
sistema fabril. A partir do final do século XIX, a segunda Revolução Industrial se esta-
belece com as bases do progresso tecnológico e científico, visando a invenção e o cons-
tante aperfeiçoamento dos produtos e técnicas, para melhor desempenho industrial. A
terceira Revolução Industrial, teve o ponto culminante do desenvolvimento industrial,
em termos de tecnologia, teve início em meados do século XX, com o desenvolvimento
da eletrônica, que permitiu o desenvolvimento da informática e a automação das in-
dústrias [11].
A quarta Revolução Industrial é um conceito de indústria proposto recentemente
e que engloba as principais inovações tecnológicas dos campos de automação, controle
e tecnologia da informação, aplicadas aos processos de manufatura. A partir de siste-
mas cyber-físicos, internet das coisas e internet dos serviços, os processos de produção
tendem a se tornar cada vez mais eficientes, autônomos e customizáveis. Isso signi-
fica um novo período no contexto das grandes revoluções industriais. Com as fábricas
inteligentes, diversas mudanças ocorrerão na forma em que os produtos serão manu-
Capítulo 1. Introdução 25
faturados, causando impactos em diversos setores do mercado [12], como visualizado
na Figura 1.1.
Figura 1.1 – Processo de evolução das revoluções industriais.
A quarta Revolução Industrial é uma realidade que se torna possível devido aos
avanços tecnológicos da última década, aliados às tecnologias em desenvolvimento
nos campos de tecnologia da informação e engenharia. A internet das coisas (Internet
of Things - IoT) é um dos pontos principais e consiste na conexão em rede de objetos
físicos, ambientes, veículos e máquinas por meio de dispositivos eletrônicos embarca-
dos que permitem a coleta e troca de dados. Outro ponto é o Digital Data/Image/Video
Processing, base desse trabalho, que fazem todo o reconhecimento dos padrões e dados.
E por último, o big data analytics são estruturas de dados muito extensas e complexas
que utilizam novas abordagens para a captura, análise e gerenciamento de informações
[12].
Capítulo 1. Introdução 26
1.3 Objetivos
O principal objetivo é avaliar e melhorar as técnicas apresentadas nos softwares
comerciais de processamento digital de imagem/vídeo, desenvolvendo duas aplica-
ções idênticas em funcionalidades, mas diferentes em seus métodos de usabilidade,
instalação e algoritmo de desenvolvimento, a primeira aplicação é web (JavaScript) e a
outra, instalável (Java), como software computacional.
Nessas aplicações uma nova técnica computacional será inserida no contexto de
programação, na qual, amplia a visão do processo, em termos de qualidade, tempo
de processamento, nível dos pixels, distribuição no histograma e armazenamento. Esse
novo modelo de algoritmo será capaz de fazer a varredura de todos os pixels presentes
em uma imagem/quadro e avaliar todas as características presentes, podendo corrigir
todos os pixels de vizinhança errados ou contendo informação distorcida do estado real
nas camadas de cor e, com isso, efetuar filtragens e processamentos com alta precisão
e qualidade.
Como objetivo secundário, a criação de um repositório online e disponibilidade
parcial dos algoritmos desenvolvidos para estudo de alunos, cientistas e profissionais
da área, construindo uma rede de aprendizado e fechando um ciclo, no qual, o diálogo
permanecerá presente, com ideias, dúvidas e assuntos relevantes para o contexto.
Todo esse estudo e desenvolvimento se deu início devido ao alto consumo de
tempo e processamento nas imagens/quadros digitais utilizados em pequenos proces-
sos computacionais, mas que podem, por consequência, unir em processos complexos
de filtragem, armazenamento ou manipulação de uma zona em certa imagem/quadro
e os softwares comerciais não suprem o mercado com eficiência, qualidade e compres-
são do processamento digital de imagem/vídeo.
Capítulo 1. Introdução 27
1.4 Estrutura do Trabalho
Capítulo 1: Introdução, apresenta o que significa o termo “imagem” e a visão
dos filósofos durante o passar dos anos, as motivações para o desenvolvimento da
pesquisa, os objetivos e a organização dos capítulos.
Capítulo 2: Revisão da Literatura, apresenta uma revisão sobre o que é proces-
samento digital de imagem, como subtópicos, explicações sobre a natureza da luz, o
olho humano, modelos cromáticos, como se forma a imagem digital e sua importância,
amostragem e quantização.
Capítulo 3: Metodologia, apresenta sobre as aplicações desenvolvidas, JavaScript
e Java, como subtópicos, o processamento digital de vídeo, o processo de filtragem,
histograma e high dynamic range.
Capítulo 4: Algoritmo/Equações, apresenta as técnicas desenvolvidas, no qual,
é uma união de vários fatores divididos em tópicos e explicado passo a passo sobre os
algoritmos e equações das planilhas de pixels, partial differential equation, high dynamic
range, dos processadores (Central Process Unit, Graphics Processing Unit e threads) e do
armazenamento usando discrete cosine transform.
Capítulo 5: Resultados, apresenta os resultados gerados durante todos os testes
executados, levando em consideração a qualidade, histograma, tempo de processa-
mento e nível dos pixels.
Capítulo 6: Conclusão, apresenta a conclusão obtida durante a pesquisa, fa-
zendo uma síntese dos resultados.
Capítulo 7: Trabalhos Futuros, apresenta as próximas pesquisas relacionadas
ao Doutorado, voltadas para animações 3Ds (três dimensões) inteligentes e com alto
desempenho no processamento dos dados.
28
2 Revisão da Literatura
2.1 Processamento Digital de Imagem
Não existe tarefa simples em termos de processamento digital de imagem (PDI),
na realidade envolve um conjunto de tarefas interconectadas, como visualizado na Fi-
gura 2.1. A primeira etapa do processo é a captura da imagem, a qual, normalmente,
corresponde à iluminação que é refletida na superfície dos objetos. Logo após, é digi-
talizada, que é a forma apropriada para tratamento computacional, podendo também
ser capturada por sensor e salva na forma digital, diretamente.
Figura 2.1 – Modelo de hierarquia das etapas do PDI (baseado em [13]).
Qualquer imagem gerada é limitada por um plano retangular, no qual, cada po-
sição nesse plano contém a informação de cor relativa, ou seja, a imagem neste caso é
um sinal de cor 2D contínuo, onde o domínio é o plano e o contradomínio é o espaço
de cor. A imagem contínua é modelada matematicamente por Equação 2.1, sendo x e
y números reais, limitados ao intervalo de 0 a X, e de 0 a Y, respectivamente.
Capítulo 2. Revisão da Literatura 29
imagem(x, y)↔ pixel(x, y) (2.1)
Já a imagem digital é obtida a partir de uma amostragem ou de uma quantização,
modelada matematicamente por Equação 2.1, onde x e y são números inteiros. A partir
disso, é gerado uma matriz de valores, no qual, cada valor representa o pixel da cor.
Com isso, se faz um pré-processamento, o qual envolve passos como a filtragem de
ruídos introduzidos pelos sensores e a correção de distorções geométricas causadas
pelo sensor [13].
Próximo passo é fazer uma análise e identificação de objetos, para isso, caracte-
rísticas ou atributos das imagens precisam ser extraídos, tais como as bordas, texturas,
movimentos e vizinhanças [14]. Em seguida, objetos precisam ser separados do plano
de fundo (background), o que significa que é necessário identificar, através de um pro-
cesso de segmentação, características constantes e descontinuidades. Para essa tarefa,
são necessárias técnicas mais avançadas, como regularização, modelagem, restauração
e reconstrução [13].
A partir dos objetos obtidos pelo processo, resultante da segmentação, pode-
se utilizar operadores morfológicos para analisar, modificar e extrair informações, as
quais podem ser úteis na sua classificação geral [15].
2.1.1 Natureza da Luz
Como explicado na seção 2.1, a luz é necessária para que uma imagem possa
existir, ela apresenta um comportamento ondulatório caracterizado por sua frequência
( f ) e comprimento de onda (λ). A faixa do espectro eletromagnético à qual o sistema
visual humano é sensível se estende aproximadamente de 400nm a 770nm e denomina-
se luz visível, como visualizado na Figura 2.2.
A radiação eletromagnética com comprimentos de onda fora da faixa de luz vi-
sível não é percebida pelo olho humano. Dentro dessa faixa, o olho percebe compri-
mentos de onda diferentes como cores distintas, sendo que fontes de radiação com um
Capítulo 2. Revisão da Literatura 30
único comprimento de onda denominam-se monocromáticas [16].
Figura 2.2 – Espectro eletromagnético (adaptado de [16]).
2.1.2 Olho Humano
Quando se olha na direção de um objeto, a imagem atravessa a córnea e chega
à íris, que regula a quantidade de luz recebida por meio de uma abertura chamada
pupila. Quanto maior a pupila, mais luz entra no olho. Passada a pupila, a imagem
chega ao cristalino e é focada sobre a retina [16], como visualizado na Figura 2.3.
A lente do olho produz uma imagem invertida, e o cérebro a converte para a po-
sição correta. Na retina, mais de cem milhões de células fotorreceptoras transformam
as ondas luminosas em impulsos eletroquímicos, que são decodificados pelo cérebro.
Inspirado no funcionamento do olho, o homem criou a máquina fotográfica. Por-
tanto, nos olhos a córnea funciona como a lente da câmera, permitindo a entrada de
luz no olho e a formação da imagem na retina. Localizada na parte interna do olho, a
retina seria o filme fotográfico, onde a imagem se reproduz. A pupila funciona como
o diafragma da máquina, controlando a quantidade de luz que entra no olho. Ou seja,
em ambientes com muita luz a pupila se fecha e em locais escuros a pupila se dilata
com o intuito de captar uma quantidade de luz suficiente para formar a imagem [10].
A focalização apropriada da cena implica a formação nítida de sua imagem in-
vertida sobre a retina. A retina contém dois tipos de fotos sensores, os cones (sensíveis
Capítulo 2. Revisão da Literatura 31
a cores e com alta resolução, operantes apenas em cenas suficientemente iluminadas)
e os bastonetes (insensíveis a cores, com baixa resolução, operantes em condições de
baixa luminosidade), encarregados do processo de conversão da energia luminosa em
impulsos elétricos que serão transmitidos ao cérebro, para posterior interpretação [17].
Figura 2.3 – Visão geral do olho humano (adaptado de [16]).
A visualização de um objeto consiste do posicionamento do olho pela estrutura
nervosa e muscular que o controla, implicando a projeção da imagem do objeto so-
bre a fóvea [10]. Em essência, toda câmera fotográfica é uma câmera escura, projetada
para reter a energia luminosa proveniente de uma cena, produzindo uma imagem ade-
quada. Trata-se de uma extensão do olho humano, o qual compõe imagens a partir de
excitação luminosa e as transmite ao cérebro sob a forma de impulsos bioelétricos. A
pálpebra do olho tem uma função análoga àquela do obturador da câmara [17].
Capítulo 2. Revisão da Literatura 32
O diafragma (ou íris, no olho) de uma câmera funciona analogamente à íris do
olho humano, controlando a quantidade de luz que atravessa a lente. A lente da câ-
mera é análoga ao conjunto formado pelo cristalino do olho, a córnea e, em menor
grau, o humor aquoso e o humor vítreo. Ambos têm o propósito de focalizar a luz,
de modo a tornar nítidas as imagens que se formarão invertidas no plano focal [10].
A diferença é que o cristalino se deforma para focalizar a imagem, enquanto a lente
é dotada de um mecanismo manual ou automático para o ajuste da distância focal, à
exceção das lentes das câmeras de foco fixo, projetadas para dar foco a partir de uma
distância mínima (usualmente a partir de 1,5m). A coroide funciona como a câmera es-
cura de uma câmera fotográfica e a retina corresponde ao sensor da câmera fotográfica
(componente digital ou filme) [16], como visualizado Figura 2.4.
Figura 2.4 – Comparação entre olho humano e sensor fotográfico (adaptado de [16]).
Capítulo 2. Revisão da Literatura 33
2.1.3 Modelos Cromáticos
Todo e qualquer objeto que emite luz visível é percebido em função da soma das
cores espectrais emitidas, conhecido como processo aditivo, que pode ser interpretado
como uma combinação variável de componentes monocromáticas nas faixas espectrais
associadas às sensações das cores primárias. Com isso, foi criado o modelo cromático
RGB (R - red, G - green e B - blue) [10] [18], como visualizado na Figura 2.5, no qual
a Comissão Internacional de Iluminação (Comission Internationale de l’Eclairage - CIE),
estabeleceu o comprimento de onda das cores primárias, reconhecida pela Organiza-
ção Internacional de Normalização (International Organization for Standardization - ISO)
e pela Comissão Eletrotécnica Internacional (International Electrotechnical Commission -
IEC) [19], como visualizado na Tabela 2.1.
Figura 2.5 – Modelo cromático RGB.
Tabela 2.1 – Comprimento de onda das cores primárias RGB (baseado em [18]).
Sigla Primária λ (nm)R Vermelho 700,0G Verde 546,1B Azul 435,8
O histograma (explicado na subseção 3.1.3) do modelo cromático RGB, identifica
as porções de cores por cada camada, como visualizado na Figura 2.6. Com isso, é im-
portante conhecer sobre as três cores primárias RGB, a primeira é o vermelho, que do
latim vermiculos, é uma das sete cores do espectro solar sendo denominada fundamen-
tal ou primitiva. A verde, que do latim viridis, no qual, se interpõe entre o céu e o sol.
O azul, tem sua origem no árabe e no persa lázúrd e, é a cor do céu sem nuvens, dando
a sensação para o infinito [14].
Capítulo 2. Revisão da Literatura 34
Figura 2.6 – Histograma do modelo cromático RGB.
A combinação dessas cores, duas a duas e em igual intensidade, produz as cores
secundárias, conhecidas como modelo cromático CMY (C - cyan, M - magenta e Y -
yellow) [16], como visualizado na Figura 2.7. As cores primárias no modelo CMY são
definidas em função da absorção de uma cor primária da luz branca incidente e da
reflexão das demais componentes, ou seja, as cores primárias são as secundárias do
modelo RGB, como visualizado na Tabela 2.2.
Figura 2.7 – Modelo cromático CMY.
Tabela 2.2 – Combinação de primárias nos modelos RGB e CMY (baseado em [16]).
Modelo Combinação de Primárias Secundária ResultanteRGB Vermelho + Verde AmareloRGB Vermelho + Azul MagentaRGB Verde + Azul CianoCMY Ciano + Magenta AzulCMY Magenta + Amarelo VermelhoCMY Amarelo + Ciano Verde
Capítulo 2. Revisão da Literatura 35
Em vídeo, a formação dos quadros se dá por emissão de radiação eletromagné-
tica visível, em um processo que integra, em diferentes proporções, as cores vermelha,
verde e azul. Há vários outros modelos cromáticos nos quais a caracterização da cor
não se dá conforme o comportamento fisiológico da retina humana, mas sim em função
de outros atributos de percepção cromática empregados por seres humanos [14]. É im-
portante notar, que as cores podem ser representadas por valores decimais e inteiros,
como visualizado na Tabela 2.3.
Tabela 2.3 – Representação das cores por valores decimais e inteiros (baseado em [14]).
Cor Valor Decimal Valor InteiroPreto (0, 0, 0) (0, 0, 0)Vermelho (1, 0, 0) (255, 0, 0)Verde (0, 1, 0) (0, 255, 0)Azul (0, 0, 1) (0, 0, 255)Branco (1, 1, 1) (255, 255, 255)Amarelo (1, 1, 0) (255, 255, 0)Ciano (0, 1, 1) (0, 255, 255)Magenta (1, 0, 1) (255, 0, 255)
2.1.4 Imagem Digital
Uma imagem monocromática é uma função bidimensional contínua f (x, y), na
qual x e y são coordenadas espaciais e o valor de f em qualquer ponto (x, y) é proporci-
onal à intensidade luminosa (brilho ou nível de cinza) no ponto considerado. Como os
computadores e sensores não são capazes de processar imagens contínuas, mas apenas
arrays de números digitais, é necessário representar imagens como arranjos bidimensi-
onais de pontos [13] [17].
Cada ponto na grade bidimensional que representa a imagem digital é denomi-
nado elemento de imagem ou pixel. A matriz é a notação usual para a localização de
um pixel no arranjo de uma imagem bidimensional, como visualizado na Figura 2.8.
O primeiro índice é a posição da linha (m), na qual o pixel se encontra, enquanto o se-
gundo é a posição da coluna (n). Se a imagem digital contiver M linhas e N colunas, o
índice m varia de 0 a M− 1, enquanto n varia de 0 a N − 1.
Capítulo 2. Revisão da Literatura 36
Figura 2.8 – Representação de uma imagem/quadro digital bidimensional.
A intensidade luminosa no ponto (x, y) pode ser decomposta em i componente
de iluminação (i(x, y)), associada à quantidade de luz incidente sobre o ponto (x, y) e a
componente de reflectância r(x, y), associada à quantidade de luz refletida pelo ponto
(x, y), apresentado na Equação 2.2.
f (x, y) = i(x, y)r(x, y) (2.2)
Onde 0 < i(x, y) < ∞ e 0 < r(x, y) < 1, sendo i(x, y) dependente das carac-
terísticas da fonte de iluminação, enquanto r(x, y) das características das superfícies
dos objetos. Em uma imagem digital colorida no sistema RGB, um pixel pode ser visto
como um vetor cujas componentes representam as intensidades de vermelho, verde
e azul de sua cor [20]. A imagem colorida pode ser vista como a composição de três
imagens monocromáticas, como apresentado na Equação 2.3.
f (x, y) = fR(x, y) fG(x, y) fB(x, y) (2.3)
No qual, fR(x, y), fG(x, y) e fB(x, y) representam as intensidades luminosas das
componentes RGB no ponto (x, y), como visualizado na Figura 2.9 (Exemplo 1) e na Fi-
gura 2.10 (Exemplo 2). Outra forma de representar a imagem decomposta em camadas
RGB, é visualizado na Figura 2.11 (Exemplo 3), que separa as cores dos pixels naquele
exato ponto e não sua conversão para a escala de cinzas.
Capítulo 2. Revisão da Literatura 37
Figura 2.9 – Representação em camada de uma imagem/quadro digital RGB -Exemplo 1.
Figura 2.10 – Representação em camada de uma imagem/quadro digital RGB -Exemplo 2.
Capítulo 2. Revisão da Literatura 38
Figura 2.11 – Representação em camada de uma imagem/quadro digital RGB -Exemplo 3.
2.1.5 Amostragem e Quantização
Para que uma imagem possa ser armazenada ou processada, é necessário fazer
a discretização em nível de coordenadas espaciais e de valores de brilho. O processo
de discretização das coordenadas espaciais é a amostragem, enquanto a discretização
dos valores de brilho é a quantização. No caso, ambos os processos são uniformes, o
que força o processo da amostragem da imagem f (x, y) ser em pontos igualmente es-
paçados, distribuídos na forma de uma matriz MxN, sendo cada elemento uma apro-
ximação do nível de cinza da imagem no ponto amostrado para um valor no conjunto
0, 1, ..., L− 1 [21], como apresentado na Equação 2.4.
F ≈
f (0, 0) f (0, 1) · · · f (0, N − 1)
f (1, 0) f (1, 1) · · · f (1, N − 1)...
......
...
f (0, M) f (1, M) · · · f (M− 1, N − 1)
(2.4)
O limite inferior (0) da faixa de níveis de cinza de um pixel é associado ao preto, e
o limite superior (L− 1) ao branco, pixels com valores entre 0 e L− 1 serão visualizados
em diferentes tons de cinza, os quais serão tão mais escuros quanto mais próximo
de zero forem seus valores. Uma vez que os processos de amostragem e quantização
Capítulo 2. Revisão da Literatura 39
implicam na eliminação de informação de uma imagem analógica, seu equivalente
digital é uma aproximação, no qual, a qualidade depende essencialmente dos valores
de M, N e L [20]. Com isso, o número de valores de brilho (L) é associado a potências
de 2, como apresentado na Equação 2.5.
L = 2l (2.5)
Onde l ∈ ℵ (os números Aleph (ℵ) são uma sequência de números usados para
representar os tamanhos de conjuntos infinitos [20]), assim sendo, o número de bits
necessário para representar uma imagem digital de dimensões MxN é apresentado na
Equação 2.6.
b = MNl (2.6)
Com o uso da Equação 2.6, o aumento de M, N e l implica na elevação da quali-
dade da imagem, o aumento do número de bits necessários para a codificação binária
da imagem e o aumento do volume de dados a serem armazenados, processados e
transmitidos [20]. O número de bytes empregado na representação de uma imagem di-
gital monocromática para alguns valores típicos de M e N, com L igual a 2, 32 e 256
níveis de cinza, são visualizados na Tabela 2.4.
Tabela 2.4 – Número de bytes para uma imagem monocromática (baseado em [21]).
M N L = 2 L = 32 L = 256480 640 38400 192000 307200600 800 60000 300000 480000768 1024 98304 491520 7864321200 1600 240000 1200000 1920000
Para entender o número de amostras e de níveis de cinza necessários para a
representação de uma imagem digital de qualidade, é preciso saber as características
da imagem, como suas dimensões e complexidade da aplicação (JavaScript e Java) à
qual se destina. A influência dos parâmetros de digitalização na qualidade visual de
uma imagem monocromática é visualizado na Figura 2.12.
Capítulo 2. Revisão da Literatura 40
Figura 2.12 – Influência da variação do número de amostras e de níveis dequantização na qualidade de uma imagem/quadro digital: (A) 200x200
pixels/256 níveis; (B) 100x100 pixels/256 níveis; (C) 25x25 pixels/256níveis; e (D) 200x200 pixels/2 níveis.
O número de cores que um pixel pode assumir em uma imagem RGB é LRLGLB.
Usando logaritmo, lR = log2(LR), lG = log2(LG) e lB = log2(LB), o número de bits por
pixel necessários para representar as cores será igual a lR + lG + lB e o número de bits
necessário para representar uma imagem digital de dimensões MxN é apresentado na
Equação 2.7.
b = MN(lR + lG + lB) (2.7)
O número de bytes empregado na representação de uma imagem digital colorida
para alguns valores típicos de M e N, com L igual a 2, 32 e 256 níveis de cinza, são
visualizados na Tabela 2.5.
Tabela 2.5 – Número de bytes para uma imagem colorida (baseado em [21]).
M N L = 2 L = 32 L = 256480 640 115200 576000 921600600 800 180000 900000 1440000768 1024 294912 1474560 23592961200 1600 720000 3600000 5760000
41
3 Metodologia
3.1 Aplicações: JavaScript e Java
As aplicações (web e local) tem exatamente as mesmas funcionalidades imple-
mentadas e seguem a mesma ordem de execução do processamento digital de ima-
gem/vídeo. Primeiramente, a imagem/quadro é capturada por uma câmera/sensor
ou escolhida do próprio sistema, após isso, faz a análise do seu tamanho para poder
gerar a planilha de pixels (explicada na seção 4.1) e gerar o histograma RGB (explicada
na subseção 3.1.3), como visualizado na Figura 3.1.
Figura 3.1 – Primeiros passos do PDI nas aplicações (JavaScript e Java).
Capítulo 3. Metodologia 42
Após isso, a imagem/quadro está padronizada, podendo escolher entre efetuar a
filtragem com Partial Differential Equation (PDE) (explicado na seção 4.2) ou gerar o High
Dynamic Range (HDR) (explicado na seção 4.3). Todo o processamento é feito utilizando
de threads (explicado na seção 4.4) e a imagem/quadro resultante armazenada usando
a técnica Discrete Cosine Transform (DCT) (explicada na seção 4.5), como visualizado na
Figura 3.2.
Figura 3.2 – Escolha dos próximos passos nas aplicações (JavaScript e Java).
As aplicações JavaScript [22] e Java [23] foram criadas somente para gerar os re-
sultados das técnicas criadas durante a pesquisa.
Capítulo 3. Metodologia 43
A estrutura da aplicação web, visualizada na Figura 3.3, foi desenvolvida utili-
zando vários conceitos e tecnologias do que há de mais moderno no mercado. Para de-
senvolver o website e sua estrutura base, foi utilizado a linguagem de marcação HTML
(Hypertext Markup Language) e o CSS (Cascading Style Sheets) que é uma linguagem de
folha de estilos, a qual, tem a função de tornar uma página apresentável na web, relaci-
onada diretamente com o design e aparência [24].
Figura 3.3 – Estrutura da aplicação web (JavaScript).
O sistema precisa ser padronizado e visualizado em todo e qualquer tamanho de
tela, para isso foi um implementado o Responsive Web Design (RWD), que é uma abor-
dagem para tornar as páginas da web renderizadas em uma variedade de dispositivos
Capítulo 3. Metodologia 44
e tamanhos de janelas ou telas. Na estrutura do CSS, foi utilizado quatro modelos de
framework/bibliotecas, que é uma abstração que une códigos comuns, provendo uma
funcionalidade genérica, mas pode atingir uma funcionalidade específica, por configu-
ração, durante a programação da aplicação.
O Foundation, fornece grade responsiva, componentes de interface HTML e CSS
[25], modelos de código, para formulários, botões, navegação e outros elementos de
interface. O Bootstrap, melhora a experiência do usuário em um site amigável e respon-
sivo. O Materialize CSS, utiliza bibliotecas que se destinam a facilitar as estilizações da
página web. O último, o Semantic UI, é uma biblioteca de componentes de User Interface
(UI).
Mas o que resume toda a aplicação web é a linguagem de programação inter-
pretada JavaScript, é com ela que todas as funcionalidades são criadas. Na estrutura
do JavaScript, foi utilizado três modelos de framework/bibliotecas. O Angular, auxilia
na execução de Single-Page Applications (SPA), no qual, consiste de uma única página
web com o objetivo de fornecer uma experiência de usuário melhor, construído sob o
padrão Model-View-View-Model (MVVM). O jQuery [26] é uma biblioteca que interage
com o HTML, desenvolvida para simplificar os scripts interpretados no navegador do
cliente (client-side). O último, o React [27], é o mais eficiente em criar as User Interface
(UI).
O Node [28] foi escolhido como um interpretador de código JavaScript, focado em
migrar o JavaScript do lado do cliente para servidores, ou seja, seu objetivo é criar apli-
cações de alta escalabilidade (como um servidor web), com códigos capazes de mani-
pular dezenas de milhares de conexões simultâneas, numa única máquina física. Sendo
assim, o NPM (Node Package Manager) foi escolhido para o gerenciamento e execução
de tarefas, ele é um gerenciador de pacotes padrão para o ambiente de execução JavaS-
cript/Node.
Para testes nas linhas de código e de execução, foram escolhidos o Mocha e o
Jest. O Mocha é um modelo de teste JavaScript/Node, com suporte a navegador, teste
assíncrono, relatórios de cobertura de teste e uso de qualquer biblioteca de asserção. O
Capítulo 3. Metodologia 45
Jest é usado para testar todo o código JavaScript, incluindo React.
Por fim, o Banco de Dados (BD) escolhido foi o diskDB, que é um banco de da-
dos JSON (JavaScript Object Notation), baseado em disco leve com uma API (Application
Programming Interface) do tipo MongoDB (software de banco de dados orientado a do-
cumentos livre) para Node. O JSON [29] é um formato compacto, de padrão aberto
independente, de troca de dados simples e rápida entre sistemas.
A estrutura da aplicação local, diferente da aplicação web, foi utilizado somente
Java, que é uma linguagem de Programação Orientada a Objetos (POO). Como fra-
mework/bibliotecas, foi utilizado o Java 2DTM e o VLCj (juntamente com a JNA (Java
Native Access)). Dentro do Java 2DTM, as classes de imagem de modo imediato e as in-
terfaces fornecem técnicas para lidar com imagens mapeadas por pixel cujos dados são
armazenados na memória, além de, suportar o acesso a dados de imagem em vários
formatos de armazenamento e a manipulação de dados de imagem por meio de vários
tipos de operações de filtragem, sendo o modelo básico do processamento digital de
imagem visualizado na Figura 3.4. O VLCj é uma biblioteca de vídeo com vários tipos
de formato de áudio/vídeo.
Figura 3.4 – Modelo básico do PDI (Java).
Para o Java funcionar corretamente ele precisa do seu JDK (Java Development Kit),
que é um conjunto de utilitários que permitem criar sistemas de software para a plata-
forma Java, e o JRE (Java Runtime Environment), que é utilizado para executar as aplica-
ções da plataforma Java.
Capítulo 3. Metodologia 46
3.1.1 Vídeo
Nas aplicações desenvolvidas (web e local), o processamento digital de vídeo
(PDV) é uma das técnicas inserida ao sistema. Como por trás de toda a ação e do mo-
vimento que é visto em qualquer tipo de vídeo, um algoritmo transforma o vídeo em
várias imagens (quadros), o cérebro interpreta como movimento esses vários quadros
consecutivos em um curto período de tempo.
Durante a obtenção e/ou transmissão do vídeo, os ruídos aparecem, compro-
metendo o desempenho dos sensores de captura, por fatores climáticos, vida útil dos
equipamentos e interferências nos canais de transmissão, com isso, existem dois mode-
los de ruídos em processamento digital de imagem/vídeo (PDI/V), o ruído aditivo e o
multiplicativo. No caso, o aditivo é um dos mais usados na prática, tanto no domínio
espacial quanto no domínio da frequência [30], explicados na subseção 3.1.2.
O ruído aditivo simulado está próximo do real, ou seja, modela a soma de várias
pequenas fontes de ruído. A função que representa a função de densidade de probabi-
lidade gaussiana de uma variável aleatória x é dada na Equação 3.1, onde x representa
o nível de cinza presente por filtragem, µ é a média dos valores de cinza e α é seu
desvio padrão [30].
ρ(x) =1√
2πα2e−(x−µ)2
2α2 (3.1)
Parameter =∣∣∣∣RParameter− EParameter
RParameter
∣∣∣∣ (3.2)
Se aplicar na Equação 3.1, por exemplo, o filtro blur (esse filtro aplicará desfoque
gaussiano às imagens), o gráfico apresentado na Figura 3.5, comprova a relação do Real
Parameter (RParameter) e o Estimated Parameter (EParameter) em uma matriz imagem,
executando cálculos dentro de um limiar (valor 0 para pixels com ruídos).
Com a Figura 3.5 é possível analisar os valores reais e os estimados de uma cap-
tura de imagem analisada por pixels com ruídos. Desse modo, a aplicação extrai as
informações específicas com uma taxa de Relative Error (RError) grande, dada na Equa-
Capítulo 3. Metodologia 47
ção 3.2, como apresentado na Figura 3.6.
Figura 3.5 – Relação entre RParameter e o EParameter.
Figura 3.6 – Relação entre o Parameter e o RError sem correção.
Capítulo 3. Metodologia 48
Para as taxas de RError superiores a 1, a aplicação fica vulnerável e é necessá-
rio corrigir os ruídos encontrados no processo de captura. Para a correção é aplicado
uma filtragem inversa antes da visualização do usuário, esse é um método simples de
restauração que aproxima o vídeo a um modelo sem ruídos, com uma taxa de Relative
Error (RError) próxima de zero [30], como apresentado na Figura 3.7.
Figura 3.7 – Relação entre o Parameter e o RError com correção.
Para chegar ao RError próximo de zero foi aplicado a Equação 3.3. A aplicação
da filtragem inversa tem como resultado a aproximação da imagem original multipli-
cando valor a valor da matriz de ruído G(u,v) por 1H(u,v) , onde este representa a inver-
são de cada valor da matriz e não a inversão da matriz por inteiro [30]. Após aplicação
da filtragem inversa, os filtros podem ser aplicados.
F(u, v) =1
H(u, v)G(u, v) (3.3)
O Algoritmo 3.1 e Algoritmo 3.2, foram criados com base no FFmpeg, que é uma
biblioteca gratuita para manusear dados multimídia. O FFmpeg foi escrito usando a lin-
guagem de programação C, e encontra-se disponível para várias plataformas, sistemas
operacionais e linguagens de programação [31].
Capítulo 3. Metodologia 49
Algorithm 3.1 Implementação em Java para conversão.
public byte[] criarImagemDoVideo(byte[] bytes) (throws IOException {InputStream inputStream = (new ByteArrayInputStream(bytes);Java2DFrameConverter converter = (new Java2DFrameConverter();FFmpegFrameGrabber grabber = (new FFmpegFrameGrabber(inputStream);grabber.setImageWidth(x);grabber.setImageHeight(y);grabber.start();Frame frame = grabber.grabImage();BufferedImage grabbedImage = converter.convert(frame);ByteArrayOutputStream byteArrayOutputStream =
(new ByteArrayOutputStream();ImageIO.write(grabbedImage, "jpg", byteArrayOutputStream);byteArrayOutputStream.flush();byte[] imageInByte = byteArrayOutputStream.toByteArray();byteArrayOutputStream.close();return imageInByte;
}
Algorithm 3.2 Implementação em JavaScript para conversão.
var sampleVideoData;function retrieveSampleVideo() {
var oReq = new XMLHttpRequest();oReq.open("GET", "webm", true);oReq.responseType = "arraybuffer";oReq.onload = function (oEvent) {
var arrayBuffer = oReq.response;if (arrayBuffer) {
sampleVideoData = new Uint8Array(arrayBuffer);}
}; oReq.send(null);}
function getDownloadLink(fileData, fileName) {var a = document.createElement(’a’);a.download = fileName;var blob = new Blob([fileData]);var src = window.URL.createObjectURL(blob);a.href = src;a.textContent = ” + fileName +;return a;
}
var result = ffmpeg_run(module);result.forEach(function(file) {
getDownloadLink(file.data, file.name);});
Capítulo 3. Metodologia 50
3.1.2 Filtros
O objetivo principal de efetuar uma filtragem na imagem/quadro é melhorar a
qualidade. Isso pode ser feito, através da ampliação do seu contraste, eliminação de
padrões periódicos ou aleatórios, melhoria no seu foco e acentuação de características.
Existem diversos modelos de classificação para filtragem, o primeiro é o domínio ou
espaço em que atuam, sendo da frequência ou espacial. Depois, se observa o tipo de
frequência, se é passa baixa, passa alta ou passa faixa. A classificação em linearidade,
tem a identificação de linear ou não linear. E por último, o tipo de aplicação, ou seja, se
é suavização, contraste, adaptativos, globais, janelados ou locais.
3.1.2.1 Domínio da Frequência
No domínio da frequência, as técnicas fundamentadas são baseadas no teorema
da convolução, explicado na subseção 3.1.2.3, que é uma das propriedades da transfor-
mada de Fourier. Com isso, o processamento digital de imagem/vídeo no domínio da
frequência é realizado seguindo alguns passos, no primeiro a imagem é transformada
do domínio espacial para o da frequência (transformada de Fourier). Depois, são feitas
operações de filtragem na imagem e realiza-se o processo inverso, onde a imagem no
domínio da frequência é transformada para o domínio espacial, para que a imagem
possa ser exibida e vista pelo olho humano [14], como visualizado pela Figura 3.8.
Figura 3.8 – Processamento de imagem/quadro usando Fourier (baseado em [14]).
A transformada de Fourier (desenvolvida pelo matemático francês Jean Baptiste
Joseph Fourier) é uma ferramenta matemática fundamental na solução de problemas
na área de processamento digital de imagem/vídeo. A utilização de suas formas dis-
creta (DFT - Discrete Fourier Transform) e rápida (FFT - Fast Fourier Transform) e o enten-
dimento de suas propriedades são muito importantes, já que, a mudança de domínio
Capítulo 3. Metodologia 51
do espaço para o domínio da frequência e vice-versa, ocorre através dessas transfor-
madas. Na transformada de Fourier, não há perda da informação durante a mudança
de domínios, apenas a informação visual da imagem está representada de uma ou-
tra forma, no domínio da frequência [14]. A transformada de Fourier de uma função
contínua f (x) de uma variável real x é modelada matematicamente na Equação 3.4.
F(u) =∫ ∞
−∞f (x)exp [−j2πux] dx (3.4)
Onde j =√−1. A partir de F(u), pode-se obter f (x) através da transformada
inversa de Fourier, representada na Equação 3.5.
f (x) =∫ ∞
−∞F(u)exp [j2πux] du (3.5)
A Equação 3.4 e Equação 3.5, são chamadas de par de transformada de Fourier e
podem existir se forem integráveis e se f (x) for contínua. A transformada de Fourier
de uma função f (x), é uma função complexa e pode ser expressa pela soma de suas
componentes, real (R) e imaginaria (I), representada na Equação 3.6.
F(u) = R(u) + jI(u) (3.6)
É usual, para obter-se o espectro de Fourier e o ângulo de fase da função f (x),
expressar a Equação 3.6 na forma exponencial, como representado na Equação 3.7.
F(u) = |F(u)| ejθ(u) (3.7)
Com isso obtêm-se o espectro de Fourier, representado na Equação 3.8.
|F(u)| =[
R2(u) + I2(u)] 1
2 (3.8)
Capítulo 3. Metodologia 52
E o ângulo de fase, representado na Equação 3.9.
φ(u) = tan−1[
I(u)R(u)
](3.9)
Além disso, pode-se obter o espectro de potência da função, elevando-se ao qua-
drado, como representado na Equação 3.10.
P(u) = R2(u) + I2(u) (3.10)
A transformada de Fourier de uma função unidimensional pode ser implemen-
tada para uma função bidimensional f (x, y), como representada na Equação 3.11.
F(u, v) =∫ ∞
−∞
∫ ∞
−∞f (x, y)exp [−j2π(ux + vy)] dxdy (3.11)
E a partir de F(u, v), pode-se obter f (x, y) através da transformada inversa de
Fourier, como representada na Equação 3.12.
f (x, y) =∫ ∞
−∞
∫ ∞
−∞F(u, v)exp [j2π(ux + vy)] dudv (3.12)
A transformada de Fourier bidimensional de uma função de f (x, y) é uma função
complexa e pode ser expressa pela soma de componentes reais (R) e imaginárias (I),
representada na Equação 3.13.
F(u, v) = R(u, v) + jI(u, v) (3.13)
Como no caso unidimensional, o espectro de Fourier (Equação 3.14), o ângulo de
fase (Equação 3.15) e o espectro da potência (Equação 3.16) podem ser representados.
∣∣∣F(u, v) =[
R2(u, v) + I2(u, v)]∣∣∣ 1
2 (3.14)
Capítulo 3. Metodologia 53
φ(u, v) = tan−1[
I(u, v)R(u, v)
](3.15)
P(u, v) = R2(u, v) + I2(u, v) (3.16)
Como o objetivo é a utilização da transformada de Fourier aplicada ao proces-
samento de digital de imagem/vídeo. Uma imagem/quadro pode ser representada
através de uma função bidimensional I(x, y) e esta pode ser transformada em um con-
junto de frequências espaciais F(u, v). Um único ponto F(u, v), representa quanto de
frequência espacial é contida pela imagem, no domínio da frequência. Ao produto
F(u, v)H(u, v) (H(u, v) representa o filtro) é aplicada a inversa da transformada de
Fourier para retornar ao domínio espacial, onde se tem a imagem processada I′(x, y)
[14], como visualizado pela Figura 3.9.
Figura 3.9 – Os passos da filtragem no domínio de Fourier.
Capítulo 3. Metodologia 54
3.1.2.1.1 Filtro Passa Baixa
A força de uma imagem/quadro, geralmente está concentrada nas componentes
de baixa frequência, ou seja, as componentes de alta frequência representam pouca
força da imagem/quadro. Portanto, utilizando um filtro passa baixa obtém-se uma
imagem menos nítida ou suavizada, no qual, ocorre uma perda de detalhes que são os
componentes de altas frequências [13].
No espectro de Fourier da Figura 3.10, é fácil perceber a presença dos ruídos
representados pelas altas frequências, ou seja, as informações que estão mais afastadas
da origem. Neste caso, as baixas frequências serão mantidas e as altas frequências, fora
do círculo de raio r, presentes na transformada da imagem F(u, v), serão removidas.
Figura 3.10 – Resultado da filtragem passa baixa (adaptado de [13]).
Na Equação 3.17, o filtro é chamado de passa baixa ideal, já que todas as frequên-
cias, dentro do círculo de raio r, são passadas sem atenuação e todas as fora do círculo
são retidas completamente.
H(u, v) =
1 ∴ u2 + v2 < r2
0 ∴ u2 + v2 ≥ r2(3.17)
Capítulo 3. Metodologia 55
3.1.2.1.2 Filtro Passa Alta
A filtragem passa alta é uma operação contrária à filtragem passa baixa, já que,
as componentes de alta frequência da transformada de Fourier não são alterados, en-
quanto os de baixa frequência são removidos. Isto faz com que os detalhes finos da
imagem sejam enfatizados [13], como visualizado na Figura 3.11.
Figura 3.11 – Resultado da filtragem passa alta (adaptado de [13]).
Na Equação 3.18, o filtro é chamado de passa alta ideal, já que todas as frequên-
cias, fora do círculo de raio r, são passadas sem atenuação e todas as dentro do círculo
são retidas completamente.
H(u, v) =
0 ∴ u2 + v2 < r2
1 ∴ u2 + v2 ≥ r2(3.18)
3.1.2.1.3 Filtro de Gabor
O filtro de Gabor é linear bidimensional, não variante com o deslocamento e pode
ser entendido como o produto de uma função gaussiana, simétrica em relação à origem
e uma função cossenoidal. Com aplicações variadas como, a segmentação de imagens,
o reconhecimento de faces, o reconhecimento de assinaturas e a melhoria e identifica-
ção de impressões digitais [32] [33]. Matematicamente expressa como representada na
Equação 3.19.
Capítulo 3. Metodologia 56
G(x, y, f , θ, σ) = exp
[−1
2
(x2
θ
σ2x+
y2θ
σ2y
)]exp [2π j f (xθ)] (3.19)
No qual, xθ = xcosθ + ysenθ, yθ = −xsenθ + ycosθ e x, y são as coordenadas da
imagem, j =√−1. Sendo, f a frequência da onda no plano senoidal, θk a orientação
do filtro, e σx e σy são o desvio padrão da função gaussiana ao longo dos eixos x e y.
Decomposto assim, em componentes reais (Equação 3.27) e imaginárias (Equação 3.28).
Greal(x, y, f , θ, σ) = exp
[−1
2
(x2
θ
σ2x+
y2θ
σ2y
)]cos (2π f (xθ)) (3.20)
Gimag(x, y, f , θ, σ) = exp
[−1
2
(x2
θ
σ2x+
y2θ
σ2y
)]sen (2π f (xθ)) (3.21)
Sendo Gcomplexo = Greal + jGimag, podendo ser representada como na Equação 3.29.
Com isso, a função gaussiana é representada na Equação 3.30 e a função cossenoidal
na Equação 3.24.
Greal(x, y, f , θ, σ) = W(x, y, θ, σ)V(x, f ) (3.22)
W(x, y, θ, σ) = exp[−12(
x2θ
σ2x+
y2θ
σ2y)] (3.23)
V(y, f ) = cos(2π f xθ) (3.24)
A função Greal(x, y, f , θ, σ) é obtida pelo produto de uma gaussiana por uma cos-
senoidal de frequência f , então pode ser representada no domínio da frequência e sua
transformada de Fourier pode ser obtida pela convolução da transformada de Fourier
dessas duas funções [32] [33]. O resultado dessa convolução é um filtro passa banda,
que realça as senóídes com frequências em torno de f , suprimindo seus ruídos. Con-
tudo, uma das dificuldades para utilização do filtro de Gabor é a escolha ou obtenção
de seus parâmetros, como visualizado na Figura 3.12 e Figura 3.13.
Capítulo 3. Metodologia 57
Figura 3.12 – Resultado do filtro Gabor, com o parâmetro f incorreto e correto(adaptado de [32] [33]).
Figura 3.13 – Resultado do filtro Gabor, com o parâmetro θ incorreto e correto(adaptado de [32] [33]).
3.1.2.2 Domínio Espacial
Os métodos de filtragem que trabalham no domínio espacial operam direta-
mente sobre os pixels, normalmente utilizando operações de convolução com máscaras,
explicado na subseção 3.1.2.3. Essas máscaras são pequenas matrizes bidimensionais e
os valores de seus coeficientes determinam o objetivo a ser alcançado durante o pro-
cessamento. Os pixels que compõem uma imagem e os métodos neste domínio são
procedimentos que operam diretamente sobre esses pixels [15], como representada na
Equação 3.25.
g(xi, yi) = T[ f (xi, yi)] (3.25)
Onde, f (xi, yi) é a imagem de entrada a ser filtrada, g(xi, yi) é a imagem resul-
tante, e T é um operador sobre f , definido em alguma vizinhança do pixel de posição
(xi, yi), como visualizado na Figura 3.14.
Capítulo 3. Metodologia 58
Figura 3.14 – Processo de convolução por filtragem espacial usando máscara (baseadoem [15]).
Com o uso da Figura 3.14, a imagem resultante é gerada utilizando a técnica de
vizinhança de pixels, multiplicado pelo filtro desejado, como representada na Equa-
ção 3.26.
g(x, y) = T[ f (x, y)] =
Z0 f (x− 1, y− 1) + Z1 f (x, y− 1) + Z2 f (x + 1, y− 1)+
Z3 f (x− 1, y) + Z4 f (x, y) + Z5 f (x + 1, y)+
Z6 f (x− 1, y + 1) + Z7 f (x, y + 1) + Z8 f (x + 1, y + 1)
(3.26)
Existem dois modelos de filtros que são os lineares e os não-lineares. Os filtros
lineares usam máscaras que realizam somas ponderadas das intensidades de pixels ao
longo da imagem. Se pesos diferentes forem usados em partes diferentes da imagem, o
filtro linear é considerado espacialmente variante. E os filtros não-lineares são qualquer
filtro que não é uma soma ponderada de pixels.
Outro ponto, é em relação aos patamares e descontinuidades nas intensidades da
imagem/quadro, como visualizado na Figura 3.15, no qual, tem o objetivo de acentu-
ação de contornos, que é enfatizar detalhes dos limites de objetos de modo a permitir
sua identificação e análise posterior. Com isso, existem três pontos de análise: o con-
torno, que é identificado por mudanças locais de intensidade significativas na imagem,
ocorrendo tipicamente na separação de duas regiões diferentes. As regiões ou objetos,
que são identificados por patamares mais ou menos constantes de tons e cores, e por
Capítulo 3. Metodologia 59
último, a fronteira, que ocorre onde a função de intensidade da imagem ( f (xi, yi)), va-
ria bruscamente, consistindo em limites de regiões cujos valores de cor apresentam
grandes diferenças [10].
Figura 3.15 – Descontinuidades nas intensidades da imagem/quadro: (A) TipoDegrau; (B) Tipo Pico; e (C) Tipo Rampa.
Por último, os tipos mais importantes de filtros no domínio espacial são os de
suavização e acentuação. O filtro de suavização, tem o objetivo de suavizar a imagem
pela redução das variações nos níveis de cinza, que dão à aparência de “serrilhado”
nos patamares de intensidade, atenuar as altas frequências, que correspondem às tran-
sições abruptas e minimizar os ruídos. E o filtro de acentuação, atenuam ou eliminam
as baixas frequências, realçando assim, as altas frequências, são usados para realçar
os detalhes na imagem (intensificação ou sharpening), destacam características como
bordas, linhas, curvas e manchas e tornam mais nítidas as transições entre regiões di-
ferentes (como os contornos), realçando o contraste [10].
Capítulo 3. Metodologia 60
3.1.2.3 Convolução de Imagem
A convolução de uma imagem f (x, y) com uma outra imagem/filtro h(x, y) gera
uma terceira imagem g(x, y), estando os valores compreendidos no intervalo, x ∴
[0, M− 1] e y ∴ [0, N − 1]. Sendo M e N a quantidade de linhas e colunas dessas ima-
gens e asterisco (∗) o operador que indica a convolução [34]. Com isso, a Equação 3.27
e Equação 3.28 são apresentadas.
g(x, y) = f (x, y) ∗ h(x, y) (3.27)
g(x, y) =1
MN
M−1
∑m=o
N−1
∑n=o
f (m, n)h(x−m, y− n) (3.28)
O sinal negativo (−m) e (−n) significa que a função no processo de cálculo da
convolução é espelhada sobre a origem. Na Equação 3.28, é feito um espelhamento
da função h(x, y) sobre a origem, depois desloca a função h(x, y) pelo incremento dos
valores de (m, n) e calcula a soma dos produtos sobre os valores de m e n, para cada
deslocamento. Esses deslocamentos são incrementos inteiros que são interrompidos
quando as funções não mais se sobrepõem [15] [34].
Como as transformadas de Fourier são F(u, v) 7→ f (x, y) e H(u, v) 7→ h(x, y),
o teorema da convolução demonstra que f (x, y) ∗ h(x, y) e F(u, v)H(u, v) constituem
um par de transformadas de Fourier. Com isso, obtém a Equação 3.29 e Equação 3.30
no domínio da frequência.
f (x, y) ∗ h(x, y)⇔ F(u, v)H(u, v) (3.29)
f (x, y)h(x, y)⇔ F(u, v) ∗ H(u, v) (3.30)
Essa relação indica que a convolução pode ser obtida pela transformada de Fou-
rier inversa do produto F(u, v)H(u, v). Portanto, a convolução entre duas funções no
Capítulo 3. Metodologia 61
domínio espacial tem como transformada a multiplicação das transformadas das duas
funções no domínio da frequência, e vice-versa [15]. No Algoritmo 3.3, é apresentado
em JavaScript a convolução de uma imagem/quadro e no Algoritmo 3.4, é apresentado
a mesma funcionalidade, mas em Java.
Algorithm 3.3 Implementação em JavaScript da convolução.
convolution = function(pixels, weights) {var side = Math.round(Math.sqrt(weights.length));var halfSide = Math.floor(side/2), src = pixels.data;var canvasWidth = pixels.width, canvasHeight = pixels.height;var temporaryCanvas = document.createElement(’canvas’);var temporaryCtx = temporaryCanvas.getContext(’2d’);var outputData = temporaryCtx.createImageData(canvasWidth,
canvasHeight);for (var y = 0; y < canvasHeight; y++) {
for (var x = 0; x < canvasWidth; x++) {var dstOff = (y * canvasWidth + x) * 4, sumReds = 0, sumGreens = 0,
sumBlues = 0, sumAlphas = 0;for (var kernelY = 0; kernelY < side; kernelY++) {for (var kernelX = 0; kernelX < side; kernelX++) {
var currentKernelY = y + kernelY - halfSide,currentKernelX = x + kernelX - halfSide;
if (currentKernelY >= 0 && currentKernelY < canvasHeight&& currentKernelX >= 0 && currentKernelX< canvasWidth) {var offset = (currentKernelY * canvasWidth
+ currentKernelX) * 4, weight = weights[kernelY* side + kernelX];
sumReds += src[offset] * weight;sumGreens += src[offset + 1] * weight;sumBlues += src[offset + 2] * weight;
} } }outputData.data[dstOff] = sumReds;outputData.data[dstOff+1] = sumGreens;outputData.data[dstOff+2] = sumBlues;outputData.data[dstOff+3] = 255;
} } return outputData;};
getImage = function(img) {var c = document.createElement(’canvas’);
c.width = img.width;c.height = img.height;
var ctx = c.getContext(’2d’);return ctx.getImageData(0, 0, img.width, img.height);
};
Capítulo 3. Metodologia 62
Algorithm 3.4 Implementação em Java da convolução.
public BufferedImage convolve(BufferedImage img, float[ ][ ] kernel) {BufferedImage out = new BufferedImage(img.getWidth(), img.getHeight(),
BufferedImage.TYPE_INT_RGB);for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {float r = 0.0f;float g = 0.0f;float b = 0.0f;for (int ky = 0; ky < 3; ky++) {
for (int kx = 0; kx < 3; kx++) {int px = x + (kx-1);int py = y + (ky-1);if (px < 0 || px >= img.getWidth() ||
py < 0 || py >= img.getHeight()) {continue;
}Color pixel = new Color(img.getRGB(px, py));r += pixel.getRed() * kernel[kx][ky];g += pixel.getGreen() * kernel[kx][ky];b += pixel.getBlue() * kernel[kx][ky];
}}out.setRGB(x, y, toColor(r, g, b));
}}return out;
}
public int clamp(float value) {int v = (int)value;return v > 255 ? 255 : (v < 0 ? 0 : v);
}
private int toColor(float r, float g, float b) {return new Color(clamp(r), clamp(g), clamp(b)).getRGB();
}
private void salvar(BufferedImage img, String name) throws IOException {ImageIO.write(img, "jpg", new File(name + ".jpg"));System.out.printf("Salvo %s.png%n", name);
}
Capítulo 3. Metodologia 63
3.1.2.4 Filtros Personalizados - Vídeo
Os filtros personalizados desenvolvidos para serem aplicados no vídeo em “tempo
real”, apresentando 1,2ms de atraso na sua visualização, levam em consideração os fil-
tros gráficos, que são obtidos com o uso de uma propriedade muito conhecida pelos
designers, o CSS (Cascading Style Sheets) filtre, destinado a aplicar efeitos em um ele-
mento da marcação HTML (Hypertext Markup Language) [35].
No caso, o CSS é um mecanismo para adicionar estilo a um documento web, para
ele funcionar na linguagem Java foi preciso criar um algoritmo em Lisp, que vem de
List Processing (a lista é a estrutura de dados fundamental desta linguagem). Tanto os
dados como o programa são representados como listas, o que permite que a lingua-
gem manipule o código fonte como qualquer outro tipo de dados [36], com isso, ele
interpreta o HTML/CSS e converte para o Java, como apresentado no Algoritmo 3.5.
Algorithm 3.5 Implementação em Lisp do CSS filtre.
((send "<html><head><title>")(send (progn *title*))(send «/title></head><body><table><tr><th>n</th><th>n<sup>2
</sup></th></tr>")(send (progn (with-output-to-string (strm)
(dolist (n n-lst)(format strm " &<tr><td> A</td><td> A</td></tr>"
n (expt n 2))))))(send "</table></body></html>"))
(defun read-template (template)(mappend #’(lambda (lst2)
(list ‘(send ,(first lst2) strm)(read-from-string(format nil "(send (progn % A %) strm)"
(second lst2)))))(split-template-into-pairs template)))
(defun call-template (pn &optional (strm *standard-output*) ht)(funcall (load-template pn) strm ht))
(defun load-template (pn)(eval ‘#’(lambda (&optional (strm *standard-output*) ht)
,(read-template (slurp-file pn)))))
Capítulo 3. Metodologia 64
O CSS filtre altera somente a camada superior da imagem, manipulando os pixels,
sem precisar aplicar nenhum processo criterioso de convolução. Os filtros desenvolvi-
dos foram:
Blur: Esse filtro aplicará desfoque gaussiano aos quadros. Tendo que inserir o
valor do comprimento que determinará quantos pixels precisarão ser mesclados. Isso
implica que, quanto maior o valor, mais desfoque no quadro terá. O valor 0 será usado
se não especificar o parâmetro, além de, não aceitar valores negativos [35] [37]. Na
Figura 3.16, vários exemplos da aplicação do filtro são visualizados, e o Algoritmo 3.6,
apresenta a implementação do filtro.
Figura 3.16 – Filtro Blur em vídeo [37].
Algorithm 3.6 Implementação do filtro Blur em CSS.
img {-webkit-filter: blur(<length>px);-moz-filter: blur(<length>px);-ms-filter: blur(<length>px);-o-filter: blur(<length>px);filter: blur(<length>px);
}
Capítulo 3. Metodologia 65
Brightness: Esse filtro aplicará um multiplicador linear aos quadros, tornando-os
mais claros ou escuros, comparando aos originais. Aceita números ou valores percen-
tuais e não aceita valores negativos. Com 0%, o quadro fica todo preto e com 100%,
um quadro sem mudanças. Valores mais altos resultarão em quadros mais claros. Um
valor alto suficiente deixará o quadro praticamente branco [35] [37]. Na Figura 3.17,
vários exemplos da aplicação do filtro são visualizados, e o Algoritmo 3.7, apresenta a
implementação do filtro.
Figura 3.17 – Filtro Brightness em vídeo [37].
Algorithm 3.7 Implementação do filtro Brightness em CSS.
img {-webkit-filter: brightness([ <number> | <percentage> ]);-moz-filter: brightness([ <number> | <percentage> ]);-ms-filter: brightness([ <number> | <percentage> ]);-o-filter: brightness([ <number> | <percentage> ]);filter: brightness([ <number> | <percentage> ]);
}
Contrast: Esse filtro altera o contraste dos quadros. Aceita números ou valores
percentuais e não aceita valores negativos. O valor 0% dará um quadro totalmente
cinza e o de de 100% não causa qualquer efeito. Valores maiores que 100% produzirão
Capítulo 3. Metodologia 66
quadros com alto contraste [35] [37]. Na Figura 3.18, vários exemplos da aplicação do
filtro são visualizados, e o Algoritmo 3.8, apresenta a implementação do filtro.
Figura 3.18 – Filtro Contrast em vídeo [37].
Grayscale: Esse filtro tornará os quadros em tons de cinza. 0% deixa o quadro
inalterado, enquanto 100% fará o quadro completamente em tom de cinza. Qualquer
valor entre esses dois, será um multiplicador linear para esse efeito e não aceita va-
lores negativos [35] [37]. Na Figura 3.19, vários exemplos da aplicação do filtro são
visualizados, e o Algoritmo 3.9, apresenta a implementação do filtro.
Figura 3.19 – Filtro Grayscale em vídeo [37].
Capítulo 3. Metodologia 67
Algorithm 3.8 Implementação do filtro Contrast em CSS.
img {-webkit-filter: contrast([ <number> | <percentage> ]);-moz-filter: contrast([ <number> | <percentage> ]);-ms-filter: contrast([ <number> | <percentage> ]);-o-filter: contrast([ <number> | <percentage> ]);filter: contrast([ <number> | <percentage> ]);
}
Algorithm 3.9 Implementação do filtro Grayscale em CSS.
img {-webkit-filter: grayscale([ <number> | <percentage> ]);-moz-filter: grayscale([ <number> | <percentage> ]);-ms-filter: grayscale([ <number> | <percentage> ]);-o-filter: grayscale([ <number> | <percentage> ]);filter: grayscale([ <number> | <percentage> ]);
}
Hue-rotate: Esse filtro aplicará uma rotação de matriz aos quadros. O parâmetro
(em valor angular) determinará o número de graus ao redor do círculo de cor que o
quadro será ajustado. Com 0deg, o quadro ficará inalterado, igualmente com 360deg,
já que o número de graus está exatamente sobre o mesmo ponto do círculo de cor
[35] [37]. Na Figura 3.20, vários exemplos da aplicação do filtro são visualizados, e o
Algoritmo 3.10, apresenta a implementação do filtro.
Figura 3.20 – Filtro Hue-rotate em vídeo [37].
Capítulo 3. Metodologia 68
Algorithm 3.10 Implementação do filtro Hue-rotate em CSS.
img {-webkit-filter: hue-rotate(<angle>);-moz-filter: hue-rotate(<angle>);-ms-filter: hue-rotate(<angle>);-o-filter: hue-rotate(<angle>);filter: hue-rotate(<angle>);
}
Invert: Esse filtro inverterá o quadro. A quantidade de inversão dependerá do
valor passado como parâmetro. 0% causará nenhum efeito ao quadro, por outro lado,
100% inverterá completamente e 50% gerará um quadro totalmente cinza. Qualquer
valor entre os extremos será um multiplicador linear e não aceita valores negativos
[35] [37]. Na Figura 3.21, vários exemplos da aplicação do filtro são visualizados, e o
Algoritmo 3.11, apresenta a implementação do filtro.
Figura 3.21 – Filtro Invert em vídeo [37].
Algorithm 3.11 Implementação do filtro Invert em CSS.
img {-webkit-filter: invert([ <number> | <percentage> ]);-moz-filter: invert([ <number> | <percentage> ]);-ms-filter: invert([ <number> | <percentage> ]);-o-filter: invert([ <number> | <percentage> ]);filter: invert([ <number> | <percentage> ]);
}
Capítulo 3. Metodologia 69
Opacity: O filtro de opacidade aplica transparência ao quadro. 0% significa ter
0% de opacidade, ou seja, transparência total. Similarmente, 100% resulta em um qua-
dro totalmente opaco [35] [37]. Na Figura 3.22, vários exemplos da aplicação do filtro
são visualizados, e o Algoritmo 3.12, apresenta a implementação do filtro.
Figura 3.22 – Filtro Opacity em vídeo [37].
Algorithm 3.12 Implementação do filtro Opacity em CSS.
img {-webkit-filter: opacity([ <number> | <percentage> ]);-moz-filter: opacity([ <number> | <percentage> ]);-ms-filter: opacity([ <number> | <percentage> ]);-o-filter: opacity([ <number> | <percentage> ]);filter: opacity([ <number> | <percentage> ]);
}
Saturate: Esse filtro determina a saturação do quadro. A saturação depende do
valor passado e não aceita usar valores negativos. 0%, valor mínimo, o quadro estará
totalmente não saturado e com saturação em 100%, o quadro fica inalterado. Somente
usar valores acima de 100%, para quadros supersaturados [35] [37]. Na Figura 3.23,
vários exemplos da aplicação do filtro são visualizados, e o Algoritmo 3.13, apresenta
a implementação do filtro.
Capítulo 3. Metodologia 70
Figura 3.23 – Filtro Saturate em vídeo [37].
Sepia: O filtro transforma os quadros em tons de sépia (uma cor marrom-avermelhada).
Com 100%, será totalmente sépia e com 0% o quadro ficará inalterado. Valores interme-
diários serão multiplicadores lineares para o filtro e não aceita usar valores negativos
[35] [37]. Na Figura 3.24, vários exemplos da aplicação do filtro são visualizados, e o
Algoritmo 3.14, apresenta a implementação do filtro.
Figura 3.24 – Filtro Sepia em vídeo [37].
Capítulo 3. Metodologia 71
Algorithm 3.13 Implementação do filtro Saturate em CSS.
img {-webkit-filter: saturate([ <number> | <percentage> ]);-moz-filter: saturate([ <number> | <percentage> ]);-ms-filter: saturate([ <number> | <percentage> ]);-o-filter: saturate([ <number> | <percentage> ]);filter: saturate([ <number> | <percentage> ]);
}
Algorithm 3.14 Implementação do filtro Sepia em CSS.
img {-webkit-filter: sepia([ <number> | <percentage> ]);-moz-filter: sepia([ <number> | <percentage> ]);-ms-filter: sepia([ <number> | <percentage> ]);-o-filter: sepia([ <number> | <percentage> ]);filter: sepia([ <number> | <percentage> ]);
}
3.1.2.5 Filtros Personalizados - Imagem
Os filtros personalizados desenvolvidos para serem aplicados na imagem/qua-
dro, utilizam como base o método de convolução (apresentado na subseção 3.1.2.3).
Alguns filtros não utilizam de convolução devido ao método da aplicação depender
somente de uma multiplicação simples de matrizes entre todas os pixels das camadas
de uma imagem/quadro RGB (R - Red, G - Green e B - Blue). Nesse caso, é preciso so-
mente criar uma função que retorna o valor de cada pixel da imagem/quadro, e então,
a máscara percorre a matriz imagem/quadro efetuando as transformações solicitadas
[10] [38].
No caso, os filtros foram desenvolvidos em JavaScript, que é uma linguagem web,
sendo assim, para seu funcionamento na versão em Java, o algoritmo de filtragem se-
gue o mesmo padrão da subseção 3.1.2.4, fazendo o uso da implementação em lingua-
gem Lisp [36], com isso, ele interpreta o HTML/JavaScript e converte para o Java. Os
filtros desenvolvidos foram:
Blue: Esse filtro tem a funcionalidade de separar a componente responsável pela
camada azul da imagem/quadro [10] [38], como visualizado na Figura 3.25 e imple-
mentado no Algoritmo 3.15.
Capítulo 3. Metodologia 72
Figura 3.25 – Filtro Blue em imagem/quadro.
Algorithm 3.15 Implementação em JavaScript do filtro Blue.
blue = function(pixels, args) {var d = pixels.data;for (var i = 0; i < d.length; i += 4) {
d[i] = 0;d[i+1] = 0;
}return pixels;
};
GrayScale: Esse filtro tem a funcionalidade de tornar a imagem/quadro em es-
cala de cinza. A partir das camadas RGB (R - Red, G - Green e B - Blue), realiza-se o
cálculo apresentado na Equação 3.31.
grayscale = 0.2126R + 0.7152G + 0.0722B (3.31)
Os valores da Equação 3.31 estão relacionados a sensibilidade do olho humano
[39] [40], como visualizado na Figura 3.26 e implementado no Algoritmo 3.16.
Green: Esse filtro tem a funcionalidade de separar a componente responsável
pela camada verde da imagem/quadro [10] [38], como visualizado na Figura 3.27 e
implementado no Algoritmo 3.17.
Capítulo 3. Metodologia 73
Figura 3.26 – Filtro GrayScale em imagem/quadro.
Algorithm 3.16 Implementação em JavaScript do filtro GrayScale.
grayscale = function(pixels, args) {for (var i = 0; i < pixels.data.length; i += 4) {var r = pixels.data[i],
g = pixels.data[i+1],b = pixels.data[i+2];
pixels.data[i] = pixels.data[i+1] = pixels.data[i+2] =0.2126*r + 0.7152*g + 0.0722*b;
}return pixels;
};
Figura 3.27 – Filtro Green em imagem/quadro.
Capítulo 3. Metodologia 74
Algorithm 3.17 Implementação em JavaScript do filtro Green.
green = function(pixels, args) {var d = pixels.data;for (var i = 0; i < d.length; i += 4) {
d[i] = 0;d[i+2] = 0;
}return pixels;
};
Invert: Esse filtro é responsável por fazer uma operação que modifica o valor
do pixel para seu inverso, realizando uma diferença em cada componente da imagem,
ou seja, em cada camada, em relação ao branco (255) [39] [40], como visualizado na
Figura 3.28 e implementado no Algoritmo 3.18.
Figura 3.28 – Filtro Invert em imagem/quadro.
Algorithm 3.18 Implementação em JavaScript do filtro Invert.
invert = function(pixels, args) {for (var i = 0; i < pixels.data.length; i += 4) {
pixels.data[i] = 255 - pixels.data[i];pixels.data[i+1] = 255 - pixels.data[i+1];pixels.data[i+2] = 255 - pixels.data[i+2];
}return pixels;
};
Capítulo 3. Metodologia 75
Red: Esse filtro tem a funcionalidade de separar a componente responsável pela
camada vermelha da imagem/quadro [10] [38], como visualizado na Figura 3.29 e im-
plementado no Algoritmo 3.19.
Figura 3.29 – Filtro Red em imagem/quadro.
Algorithm 3.19 Implementação em JavaScript do filtro Red.
red = function(pixels, args) {var d = pixels.data;for (var i = 0; i < d.length; i += 4) {
d[i] = d[i];d[i+1] = 0;d[i+2] = 0;
}return pixels;
};
Saturation: O efeito obtido com aplicação deste filtro, é o de saturar as cores da
imagem/quadro. Para isso, é utilizado de uma técnica, na qual, multiplicasse as cama-
das da imagem/quadro por valores obtidos por meio de um número pré-estabelecido
e depois soma eles a própria camada novamente [39] [40], como visualizado na Fi-
gura 3.30 e implementado no Algoritmo 3.20.
Capítulo 3. Metodologia 76
Figura 3.30 – Filtro Saturation em imagem/quadro.
Algorithm 3.20 Implementação em JavaScript do filtro Saturation.
saturation = function(pixels, args) {var level = 2.9,
RW = 0.3086,RG = 0.6084,RB = 0.0820,RW0 = (1 - level) * RW + level,RW1 = (1 - level) * RW,RW2 = (1 - level) * RW,RG0 = (1 - level) * RG,RG1 = (1 - level) * RG + level,RG2 = (1 - level) * RG,RB0 = (1 - level) * RB,RB1 = (1 - level) * RB,RB2 = (1 - level) * RB + level;
for (var i = 0; i < pixels.data.length; i += 4) {pixels.data[i] = RW0*pixels.data[i] + RG0*pixels.data[i+1]
+ RB0*pixels.data[i+2];pixels.data[i+1] = RW1*pixels.data[i] + RG1*pixels.data[i+1]
+ RB1*pixels.data[i+2];pixels.data[i+2] = RW2*pixels.data[i] + RG2*pixels.data[i+1]
+ RB2*pixels.data[i+2];}return pixels;
};
Capítulo 3. Metodologia 77
Sepia: Esse filtro somente pode ser obtido, após a imagem/quadro ter passado
pela máscara de tons de cinza (grayscale), realizando o cálculo de intensidade, como
apresentado na Equação 3.32.
sepia = 40R + 20G− 20B (3.32)
Deixando a imagem/quadro com uma aparência envelhecida [39] [40], como vi-
sualizado na Figura 3.31 e implementado no Algoritmo 3.21.
Figura 3.31 – Filtro Sepia em imagem/quadro.
Algorithm 3.21 Implementação em JavaScript do filtro Sepia.
sepia = function(pixels, args) {for (var i = 0; i < pixels.data.length; i += 4) {
var r = pixels.data[i],g = pixels.data[i+1],b = pixels.data[i+2];
pixels.data[i] = pixels.data[i+1] = pixels.data[i+2] =0.2126*r + 0.7152*g + 0.0722*b;
pixels.data[i] += 40;pixels.data[i+1] += 20;pixels.data[i+2] -= 20;
}return pixels;
};
Capítulo 3. Metodologia 78
Thresholding: Esse filtro somente pode ser obtido, após a imagem/quadro ter
passado pela máscara de tons de cinza (grayscale), com isso, foi inserido um valor li-
mite, onde se o pixel originado da escala de cinza fosse acima de 128, seria convertido
para branco, caso o contrário, para preto [39] [40], como visualizado na Figura 3.32 e
implementado no Algoritmo 3.22.
Figura 3.32 – Filtro Thresholding em imagem/quadro.
Algorithm 3.22 Implementação em JavaScript do filtro Thresholding.
thresholding = function(pixels, args) {for (var i = 0; i < pixels.data.length; i += 4) {
var r = pixels.data[i],g = pixels.data[i+1],b = pixels.data[i+2];
var v = 0.2126*r + 0.7152*g + 0.0722*b;pixels.data[i] = pixels.data[i+1] = pixels.data[i+2] = v > 128 ? 255 : 0;
}return pixels;
};
Gaussian: É um filtro que reduz o nível de ruído de um sinal de entrada, di-
minuindo, assim, distorções na imagem/quadro. Normalmente utilizado para sua-
vização de imagens/quadros, sendo que não preserva as arestas das mesmas, sendo
equivalente a um filtro passa-baixa [39] [40], como visualizado na Figura 3.33 e imple-
mentado no Algoritmo 3.23.
Capítulo 3. Metodologia 79
Figura 3.33 – Filtro Gaussian em imagem/quadro.
Algorithm 3.23 Implementação em JavaScript do filtro Gaussian.
gaussian = function(pixels, args) {var divider = 16,operator = [1/divider, 2/divider, 1/divider,
2/divider, 4/divider, 2/divider,1/divider, 2/divider, 1/divider];
return convolution(pixels, operator);};
Highpass: Esse filtro produz um sharpering da imagem/quadro, isto é, as tran-
sições entre regiões diferentes tornam-se mais nítidas. Este filtro é utilizado para re-
alçar algumas características da imagem/quadro, tais como bordas, linhas, curvas ou
manchas, mas enfatizam o ruído existente [39] [40], como visualizado na Figura 3.34 e
implementado no Algoritmo 3.24.
Figura 3.34 – Filtro Highpass em imagem/quadro.
Capítulo 3. Metodologia 80
Algorithm 3.24 Implementação em JavaScript do filtro Highpass.
highpass = function(pixels, args) {var operator = [-1, -1, -1,
-1, 8, -1,-1, -1, -1];
return convolution(pixels, operator);};
Laplacian: O Filtro tem como função destacar regiões na qual acontecem uma rá-
pida variação de intensidade, ou seja, é considerado um filtro para detecção de bordas.
Em matemática, o operador de Laplace é um operador diferencial dado pela divergên-
cia do gradiente de uma função no espaço euclidiano [39] [40], como visualizado na
Figura 3.35 e implementado no Algoritmo 3.25.
Figura 3.35 – Filtro Laplacian em imagem/quadro.
Algorithm 3.25 Implementação em JavaScript do filtro Laplacian.
laplacian = function(pixels, args) {var operator = [ 0, -1, 0,
-1, 4, -1,0, -1, 0 ];
return convolution(pixels, operator);};
Capítulo 3. Metodologia 81
Lowpass: Esse filtro tem a finalidade de suavizar a imagem/quadro, atenuando
as altas frequências, que são equivalentes às transições abruptas, minimizando ruídos
e dando um efeito de borramento na imagem/quadro [39] [40], como visualizado na
Figura 3.36 e implementado no Algoritmo 3.26.
Figura 3.36 – Filtro Lowpass em imagem/quadro.
Algorithm 3.26 Implementação em JavaScript do filtro Lowpass.
lowpass3 = function(pixels, args) {var k = 1/9;var operator = [ k, k, k,
k, k, k,k, k, k];
return convolution(pixels, operator);};
lowpass5 = function(pixels, args) {var k = 1/25;var operator = [ k, k, k, k, k,
k, k, k, k, k,k, k, k, k, k,k ,k, k, k, k,k ,k, k, k, k];
return convolution(pixels, operator);};
Capítulo 3. Metodologia 82
Prewitt: É um filtro de detecção de bordas e um operador de diferenciação dis-
creta, ele calcula uma aproximação do gradiente da função de intensidade da ima-
gem/quadro. Em cada ponto da imagem/quadro, o resultado do operador de Prewitt
é o vetor gradiente correspondente ou a norma desse vetor. Matematicamente, o ope-
rador usa dois núcleos 3×3 que são aplicados por convolução com a imagem/quadro
original para calcular aproximações das derivadas, uma para mudanças horizontais e
uma para vertical, [39] [40], como visualizado na Figura 3.37 e implementado no Algo-
ritmo 3.27.
Figura 3.37 – Filtro Prewitt em imagem/quadro.
Algorithm 3.27 Implementação em JavaScript do filtro Prewitt.
prewittHorizontal = function(pixels, args) {var divider = 3;var operator = [1/divider, 1/divider, 1/divider,
0, 0, 0,-1/divider, -1/divider, -1/divider];
return convolution(pixels, operator);};
prewittVertical = function(pixels, args) {var divider = 3;var operator = [-1/divider, 0, 1/divider,
-1/divider, 0, 1/divider,-1/divider, 0, 1/divider];
return convolution(pixels, operator);};
Capítulo 3. Metodologia 83
Sharpen: O filtro visa acentuar os contornos da imagem/quadro, proporcionando
um aumento de detalhe e nitidez, sempre que há um contorno entre duas áreas distin-
tas. Podendo ser entre claros e escuros ou entre cores diferentes, especialmente en-
tre pares de complementares: Ciano/Vermelho, Magenta/Verde e Amarelo/Roxo [39]
[40], como visualizado na Figura 3.38 e implementado no Algoritmo 3.28.
Figura 3.38 – Filtro Sharpen em imagem/quadro.
Algorithm 3.28 Implementação em JavaScript do filtro Sharpen.
sharpen = function(pixels, args) {var operator = [0, -0.2, 0,
-0.2, 1.8, -0.2,0, -0.2, 0];
return convolution(pixels, operator);};
Roberts: É uma aproximação simples da magnitude do gradiente ou de deriva-
das de imagens/quadros. Ele tem uma desvantagem, certas bordas são mais realçadas
do que outras dependendo da direção aplicada, mesmo com magnitude igual. O resul-
tado final, é uma imagem/quadro com altos valores de nível de cinza, em regiões de
variação de intensidade abruptas e valores mais baixos em regiões de limites suaves
[39] [40], como visualizado na Figura 3.39 e implementado no Algoritmo 3.29.
Capítulo 3. Metodologia 84
Figura 3.39 – Filtro Roberts em imagem/quadro.
Algorithm 3.29 Implementação em JavaScript do filtro Roberts.
roberts = function(pixels, args) {var operator = [0, 0, 0,
1, -1, 0,0, 0, 0];
return convolution(pixels, operator);};
Sobel: É um filtro de detecção de bordas muito utilizado, funciona a partir da
aproximação do gradiente, ou seja, utiliza derivadas de imagens/quadros. Esse filtro
realça as linhas verticais e horizontais mais escuras que o fundo, sem realçar os pontos
isolados [39] [40], como visualizado na Figura 3.40 e implementado no Algoritmo 3.30.
Figura 3.40 – Filtro Sobel em imagem/quadro.
Capítulo 3. Metodologia 85
Algorithm 3.30 Implementação em JavaScript do filtro Sobel.
sobelHorizontal = function(pixels, args) {var divider = 4,
operator = [ 1/divider, 2/divider, 1/divider,0, 0, 0,-1/divider, -2/divider, -1/divider ],
pixels = convolution(pixels, operator);return pixels;
};
sobelVertical = function(pixels, args) {var divider = 4,
operator = [ 1/divider, 0, -1/divider,2/divider, 0, -2/divider,1/divider, 0, -1/divider ],
pixels = convolution(pixels, operator);return pixels;
};
3.1.3 Histograma
O histograma de uma imagem traduz a distribuição estatística dos seus níveis
de cinza. Trata-se de uma representação gráfica do número de pixels associado a cada
nível de cinza presente em uma imagem, podendo também ser expressa em termos do
percentual do número total de pixels na imagem [41]. Com isso, o histograma H f (C) de
uma imagem digital f (x, y) com M linhas e N colunas, é apresentado na Equação 3.33.
H f (C) =nC
MN(3.33)
No qual, nC é o número de vezes em que o nível de cinza C aparece na imagem.
Muitas operações pontuais usam o histograma como parâmetro de decisão para forne-
cer resultados para o pixel da imagem processada, como na inversão da escala de cinza,
expansão de contraste e na equalização histogrâmica.
A inversão da escala de cinza de uma imagem pode ter diversas aplicações, uma
delas é que, em se tratando do negativo da imagem, após o registro fotográfico a partir
de um sensor, a revelação do negativo produzirá uma imagem positiva. Adicional-
mente, o negativo de uma imagem pode possibilitar melhor discriminação de alvos
Capítulo 3. Metodologia 86
em determinados tipos de imagens.
Expansão de contraste, se faz necessária, toda vez que acontecer uma ilumina-
ção deficiente no instante da aquisição da imagem, abertura insuficiente do diafragma
da câmera, tempo de exposição demasiadamente curto ou problemas de natureza di-
versa no processo de digitalização, gerando imagens de baixo contraste. Sendo assim,
é preciso redistribuir os tons de cinza dos pixels de uma imagem de modo a elevar
o contraste na faixa de níveis possíveis, nos casos em que a faixa de tons de cinza já
se encontra totalmente utilizada, a expansão de contraste por partes, linear ou não,
possibilita melhor discriminação da porção realçada da imagem [42].
O processo de equalização de histograma visa o aumento da uniformidade da
distribuição de níveis de cinza de uma imagem, sendo usualmente empregado para
realçar diferenças de tonalidade na imagem e resultando, em diversas aplicações, em
um aumento significativo no nível de detalhes perceptíveis [41]. Na Equação 3.34, é
apresentado como equalizar o histograma de uma imagem de dimensões MxN com L
níveis de cinza.
T(nce) = rnd[((L− 1)
MN)H f (nce)] (3.34)
Onde, rnd representa o arredondamento do resultado da expressão para o inteiro
mais próximo. Na Figura 3.41, é visualizado um exemplo do processo da equalização
histogrâmica.
Figura 3.41 – Exemplo do processo da equalização histogrâmica (adaptado de [42]).
O Algoritmo 3.31 (JavaScript) e o Algoritmo 3.32 (Java), apresentam a implemen-
tação do histograma nas aplicações.
Capítulo 3. Metodologia 87
Algorithm 3.31 Implementação em JavaScript do histograma.
function histogramChart() {var margin = {top: 0, right: 0, bottom: 20, left: 0}, width = 960, height = 500;var histogram = d3.layout.histogram(),
x = d3.scale.ordinal(), y = d3.scale.linear(),xAxis = d3.svg.axis().scale(x).orient("bottom").tickSize(6, 0);
function chart(selection) {selection.each(function(data) {
data = histogram(data);x .domain(data.map(function(d) { return d.x; }))
.rangeRoundBands([0, width - margin.left - margin.right], .1);y .domain([0, d3.max(data, function(d) { return d.y; })])
.range([height - margin.top - margin.bottom, 0]);var svg = d3.select(this).selectAll("svg").data([data]);var gEnter = svg.enter().append("svg").append("g");gEnter.append("g").attr("class", "bars");gEnter.append("g").attr("class", "x axis");svg .attr("width", width).attr("height", height);var g = svg.select("g").attr("transform",
"translate("+ margin.left + ","+ margin.top + ")");var bar = svg.select(".bars").selectAll(".bar").data(data);bar.enter().append("rect"); bar.exit().remove();bar .attr("width", x.rangeBand())
.attr("x", function(d) { return x(d.x); })
.attr("y", function(d) { return y(d.y); })
.attr("height", function(d) { return y.range()[0] - y(d.y); })
.order();g.select(".x.axis")
.attr("transform", "translate(0,"+ y.range()[0] + ")")
.call(xAxis);});
}chart.margin = function(_) {
if (!arguments.length) return margin;margin = _;return chart; };
chart.width = function(_) {if (!arguments.length) return width;width = _;return chart; };
chart.height = function(_) {if (!arguments.length) return height;height = _;return chart; };
d3.rebind(chart, histogram, "value", "range", "bins");d3.rebind(chart, xAxis, "tickFormat");return chart;
}
Capítulo 3. Metodologia 88
Algorithm 3.32 Implementação em Java do histograma.
public class Histograma {public static final String PATH = ;int[] calculaHistograma(BufferedImage img){
int[] histograma = new int[256];for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {Color color = new Color(img.getRGB(x, y));int red = color.getRed(); histograma[red] += 1;
} } return histograma; }public int[] calculaHistogramaAcumulado(int[] histograma) {
int[] acumulado = new int[256];acumulado[0] = histograma[0];for(int i=1;i < histograma.length;i++) {
acumulado[i] = histograma[i] + acumulado[i-1];} return acumulado; }
private int menorValor(int[] histograma) {for(int i=0; i <histograma.length; i++) {
if(histograma[i] != 0){return histograma[i]; }
} return 0; }private int[] calculaMapadeCores(int[] histograma, int pixels) {
int[] mapaDeCores = new int[256];int[] acumulado = calculaHistogramaAcumulado(histograma);float menor = menorValor(histograma);for(int i=0; i < histograma.length; i++) {
mapaDeCores[i] = Math.round(((acumulado[i] - menor) /(pixels - menor)) * 255);
} return mapaDeCores; }public BufferedImage equalizacao(BufferedImage img) {
int[] histograma = calculaHistograma(img);int[] mapaDeCores = calculaMapadeCores(histograma, img.getWidth()
* img.getHeight());BufferedImage out = new BufferedImage(img.getWidth(),
img.getHeight(), BufferedImage.TYPE_int_RGB);for (int y = 0; y < img.getHeight(); y++) {
for (int x = 0; x < img.getWidth(); x++) {Color color = new Color(img.getRGB(x, y));int tom = color.getRed();int newTom = mapaDeCores[tom];Color newColor = new Color(newTom, newTom, newTom);out.setRGB(x, y, newColor.getRGB()); }
} return out; }void run() throws IOException {
BufferedImage img = ImageIO.read(new File(PATH, ));BufferedImage newImg = equalizacao(img);ImageIO.write(newImg, "png", new File(PATH, )); }
public static void main(String[] args) throws IOException {new Histograma().run(); }
}
Capítulo 3. Metodologia 89
3.1.4 High Dynamic Range
Como explicado na seção 3.1, as duas aplicações (JavaScript e Java) fazem o pro-
cesso de High-Dynamic Range (HDR) ou High-Dynamic Range imaging (HDRi), que são
conjuntos de técnicas e métodos utilizados no processamento digital de imagem, fo-
tografias e computação gráfica, para capturar um alcance dinâmico superior entre as
áreas mais claras e mais escuras de uma imagem, quando comparados a métodos con-
vencionais [43].
O HDR é um recurso desenvolvido para que dispositivos eletrônicos gerem ou
reproduzam imagens que apresentem cores mais vivas, com melhores níveis de con-
traste, tons claros com mais brilho (fonte de luz) e tons pretos mais escuros (sombras).
As câmeras, são capazes de registrar imagens com grande alcance dinâmico, ou os te-
levisores e monitores, habilitados em aceitar esse padrão e reproduzir as imagens com
maior qualidade de cor [43].
As fotografias são, geralmente, padronizadas em JPEG (Joint Photographic Experts
Group), que possui uma profundidade de cor de 8-bit por canal, isso é, cores de 0 a 255,
do preto ao branco, em cada canal. O desafio é utilizar 16-bit por canal, que permite ter
uma fidelidade maior nas cores, devido ao alcance dinâmico entre 8-bit e 16-bit.
Foram desenvolvidas técnicas que a partir de múltiplas imagens com diferen-
tes tempos de exposição, uma resultante das imagens é gerada em HDR, baseado no
algoritmo Debevec and Malik [44], na utilização de uma função de câmera e um mapa
de radiância/histograma das camadas das cores, as novas componentes RGB (R - red,
G - green e B - blue) da imagem são criadas, um estudo foi realizado para melhorar
o processamento da imagem e gerar uma resultante HDR de visualização online em
monitores convencionais [42].
De qualquer forma de obtenção da imagem, quando uma cena é representada
em HDR, obtém-se um vetor bidimensional contendo os valores do brilho por pixel,
em cada imagem. Estes valores não podem ser interpretados como medidas reais da
radiância relativa da cena construída, já que não existe um mapeamento linear entre
Capítulo 3. Metodologia 90
essas informações e o valor de cada pixel. O que existe é um mapeamento não-linear
desconhecido que determina como, dada a radiância da cena, os valores associados aos
pixels são obtidos[45].
Os tempos de exposição (TempE) são ajustados de acordo com cada modelo de
câmera, utilizando a velocidade do obturador, a abertura, ou ambas situações. Para
padronizar os valores de tempos, serão considerados 3 momentos: -2TempE, 0TempE
e +2TempE. Em 0TempE, a câmera procurará uma média iluminação para alcançar
uma cena cinzenta, o +2TempE resulta em uma imagem mais brilhante que capta mais
detalhes nas áreas mais escuras da cena e o -2TempE resulta em uma imagem mais
escura que captura detalhes nas áreas claras [46].
Para mapear os conjuntos de cores da imagem resultante HDR, foi realizado um
estudo na técnica Tone Mapping [47]. Monitores comuns possuem um alcance dinâmico
muito menor do que o solicitado por imagens HDR, o que os torna inadequados para
a exibição de toda a faixa de intensidades luminosas presentes em uma determinada
cena. A técnica, representada na Figura 3.42, tenta corrigir o problema da forte redução
de contraste, preservando os detalhes e as cores capturadas. O algoritmo desenvolvido
será apresentado no capítulo 4.
Figura 3.42 – Técnica Tone Mapping (adaptado de [47]).
Todas as imagens obtidas vão desempenhar uma parte importante na resultante
HDR, como visualizado na Figura 3.43, cada uma contribuindo com seus melhores
pixels para a imagem final.
Capítulo 3. Metodologia 91
Figura 3.43 – Resultante HDR (baseado em [45]).
92
4 Algoritmo/Equações
4.1 Planilha de Pixels e Gráficos
O primeiro passo quando uma imagem/quadro é selecionado nas aplicações (Ja-
vaScript e Java), é executar um processamento detalhado, são vários processos criados
com threads (subseção 4.4.3). Esses processos são separados precisamente para executar
uma varredura sobre a imagem/quadro e gerar uma planilha de pixels, ou seja, gerar
uma matriz MxN, com isso, uma análise de padronização de vizinhança acontece.
Nesse caso, todos os pixels foram preenchidos na planilha gerada e padroniza-
dos para não existir discrepâncias exageradas entre um pixel e outro daquela região
de vizinhança, aumentando assim, a qualidade daquela imagem/quadro em 2% (va-
lor encontrado através de testes efetuados a nível matricial de qualidade de pixel), um
valor relativamente pequeno, mas grande para a área de processamento digital de ima-
gem/vídeo.
Essa padronização de vizinhança, é baseada na técnica MSAA (MultiSample Anti-
Aliasing), no qual cria um processo inteligente de renderização de múltiplas cópias de
cada pixel e a interpolação entre eles, recebendo um ganho de qualidade. Se dentro de
um polígono existem quatro pixels idênticos, por exemplo, eles são processados como
se fossem apenas um e o mesmo valor de cor é aplicado aos quatro. Em qualquer outra
técnica eles seriam processados como quatro pixels separados, o que consumiria quatro
vezes mais processamento.
Para a segurança que todos os dados serão claros e avaliados, um documento
de texto é criado com todos os dados da planilha de pixels daquela imagem/quadro,
esse documento tem o tamanho de 1 byte, não influenciando em nenhuma aquisição
ou armazenamento da imagem/quadro.
O último passo é gerar um gráfico de todos os pixels e traçar uma linear de avalia-
Capítulo 4. Algoritmo/Equações 93
ção para estudo daquela imagem/quadro, ou seja, é feito um reconhecimento se aque-
les pixels estão linearmente traçados no gráfico ou se ainda precisão ser retrabalhados
na padronização, aumentando a taxa de 2% para 2,3% de qualidade da imagem/qua-
dro. Feito isso, a imagem/quadro está preparado para passar pelo histograma e ser
trabalhado, gerando uma nova avaliação e padronização, como explicado na subse-
ção 3.1.3.
O passo a passo é visualizado na Figura 4.1, essa técnica é incorporada em todas
as obtenções de imagem/quadro das aplicações e será apresentada juntamente com as
outras partes pesquisadas no capítulo 5.
Figura 4.1 – Etapas da técnica de Pixels e Gráficos.
Capítulo 4. Algoritmo/Equações 94
4.2 Partial Differential Equation
A utilização da PDE, é uma alternativa para substituir os métodos de filtragens
convencionais. Os resultados obtidos usando PDE mostram uma significativa melhora
na qualidade das imagens filtradas com perda mínima de resolução [48].
No processamento digital de imagem/vídeo, a imagem/quadro é representada
por matriz, não importando o tamanho dela na aplicação, utilizando para isso a função
ϑ(xi, yj), no qual, i, j = 1, 2, ..., representando o tamanho dessa matriz por linhas (i) e
colunas (j). Para obter as diferenças relativas às derivadas parciais, referente a função
ϑ(x, y), um método bastante usado é a aproximação por diferenças finitas [48].
A aproximação por diferenças finitas têm como base a expansão em série de
Taylor de uma função f . Supondo que f seja contínua no intervalo [a, b] de interesse
e que possua derivadas até ordem N, a série de Taylor, para todo ponto x ∈ [a, b] [49],
é representada na Equação 4.1.
f (x) = f (xi) + (∆x)dfdx
∣∣∣∣xi
+(∆x)2
2!d2fdx2
∣∣∣∣xi
+(∆x)3
3!d3fdx3
∣∣∣∣xi
+ · · ·+ RN (4.1)
No qual, ∆x = x− x0 e RN é o resto, definido como RN = (∆x)N
N!dNfdxN
∣∣∣∣ζ
, ζ ∈ [a, b].
Expandindo f (xi + ∆x) em série de Taylor em torno do ponto xi, tem-se a Equação 4.2.
f (xi + ∆x) = f (xi) + (∆x)dfdx
∣∣∣∣xi
+(∆x)2
2!d2fdx2
∣∣∣∣xi
+(∆x)3
3!d3fdx3
∣∣∣∣xi
+ · · · (4.2)
Em que o · · · indica os termos restantes da série de Taylor até o resto RN. Isolando
a primeira derivada, tem-se a Equação 4.3.
∂ f∂x
∣∣∣∣i=
f (xi + ∆x)− f (xi)
∆x+
[−∆x
2!∂2 f∂x2
∣∣∣∣i
− ∆x3!
∂3 f∂x3
∣∣∣∣i
− · · ·]
(4.3)
Para obter ∂ f∂x
∣∣∣∣i, todos os outros termos da série de Taylor foram divididos pelo
espaçamento ∆x. O Erro Local de Truncamento (ELT), apresentado na Equação 4.4,
Capítulo 4. Algoritmo/Equações 95
aparece devido à utilização de um número finito de termos na série de Taylor, podendo
simplificar a equação fi para f (xi) ou, em geral, fi±k para f (xi ± k∆x) [49], como apre-
sentado na Equação 4.5.
ELT =
[−∆x
2!∂2 f∂x2
∣∣∣∣i
− ∆x3!
∂3 f∂x3
∣∣∣∣i
− · · ·]
(4.4)
∂ f∂x
∣∣∣∣i=
fi+1 − fi
∆x+ 0(∆x) (4.5)
A Equação 4.5, é uma equação de diferenças finitas que representa uma aproxi-
mação de primeira ordem para a primeira derivada de f , utilizando diferenças pro-
gressivas, devido ao fato que o cálculo da derivada no ponto xi, foi utilizado um ponto
adiante de xi, no caso, xi+1.
Agora, com o objetivo de eliminar parâmetros desnecessários da PDE, onde em
muitos casos eles são correlacionados, a Equação 4.6 é criada, sendo uma equação de
filtragem, com eliminação de ruídos, com ampliação para detecção de bordas, onde
apenas dois parâmetros interrelacionados existem e que dependem da imagem origi-
nal (Ioriginal) [50].
Iresult = δ(|OGσ ∗ ϑ|) |Oϑ| div(
Oϑ
|Oϑ|
)− (1− δ)(ϑ− Ioriginal) (4.6)
No qual, ϑ(x, 0) = Ioriginal(x) representa a imagem ruidosa inicial, δ(|OGσ ∗ ϑ|)
é uma função suave não crescente com δ(0) = 1, δ(s) ≥ 0, δ(s) → 0 como s → ∞.
A escolha usual para δ é δ(s) = 1(1+ks)2 , permitindo realizar uma suavização seletiva
de acordo com o tamanho do gradiente da imagem no ponto x. A constante σ a ser
usada no cálculo de Gσ, é tomada como o desvio padrão de ruído da Ioriginal e Gσ é
uma função gaussiana. δ pode ser representado como na Equação 4.7, sendo k uma
constante dependente [50].
δ = δ(|GσIoriginal ∗Oϑ|) = 11 + k|GσIoriginal ∗Oϑ|2 (4.7)
Capítulo 4. Algoritmo/Equações 96
Aplicando a Equação 4.6, é visto que, os pixels da imagem foram filtrados corre-
tamente e com agilidade durante o processo, como visualizado na Figura 4.2. Todos os
resultados obtidos com essas técnicas serão apresentados no capítulo 5.
Figura 4.2 – Comparação entre a Ioriginal com ruído e a Iresult (baseado em [41]).
Capítulo 4. Algoritmo/Equações 97
4.3 High Dynamic Range
O algortimo criado para o HDR, tanto em JavaScript ou Java, seguem o mesmo
padrão. A primeira etapa do algoritmo é obter as imagens com suas respectivas infor-
mações [42]. Na Equação 4.8, é representado cada imagem por x, mas todas contêm em
suas informações os dados de tempo de exposição (∆tj) e a radiância (Ei) [44], repre-
sentado na Equação 4.9.
Zij = f (x) (4.8)
Zij = f (Ei∆tj) (4.9)
Após essa análise, é criado um valor Zij para cada valor de intensidade do pixel
representativo, que é uma função não-linear com relação aos valores de exposição x,
representado na Equação 4.10 e Equação 4.11.
f−1(Zij) = Ei∆tj (4.10)
ln f−1(Zij) = lnEi + ln∆tj (4.11)
Nas equações apresentadas, os valores conhecidos são Zij e ∆tj de cada imagem.
Os valores a serem obtidos são Ei, assim como, uma nova função g(Zij). Essa nova
função, representada na Equação 4.12, possui um intervalo de domínio finito e bem
definido de valores (0− 255), que é o valor dos pixels RGB, já que o domínio do brilho
associado a cada um desses pixel é finito [44].
g(Zij) = lnEi + ln∆tj (4.12)
Nesse caso, é preciso utilizar uma análise matemática para encontrar os pontos
de g(Zij) e Ei que minimizam o erro quadrático da função, representada na Equa-
Capítulo 4. Algoritmo/Equações 98
ção 4.13.
$ =N
∑i=1
P
∑j=1
[g(Zij)− lnEi − ln∆tj]2 + λ
Zmax−1
∑z=Zmin+1
g′′(z)2 (4.13)
Onde P é o número de fotos disponíveis, N é o número de pixels avaliados, Zmax
são valores máximos de intensidade dos pixels e Zmin são valores mínimos de intensi-
dade dos pixels. Utilizando a Equação 4.13, a imagem não fica adequada para a aplica-
ção, então é criado uma função de peso triangular, suavizando a imagem, representada
na Equação 4.14.
w(z) =
z− Zmin → z ≤ 12(Zmin + Zmax)
Zmax − z→ z > 12(Zmin + Zmax)
(4.14)
Inserindo a suavização na Equação 4.13, a nova função é obtida, representada
por Equação 4.15.
$ =N
∑i=1
P
∑j=1{w(Zij)[g(Zij)− lnEi − ln∆tj]}2 + λ
Zmax−1
∑z=Zmin+1
[w(z)g′′(z)]2 (4.15)
Obtendo os valores de g(Zij), são convertidos para valores de radiância relativos,
assumindo que ∆tj de cada foto é conhecido, representado na Equação 4.16.
lnEi = g(Zij)− ln∆tj (4.16)
Para gerar o mapa de radiância/histograma, são utilizadas as informações das
imagens, realizando uma média ponderada destes valores, representado na Equação 4.17.
lnEi =∑P
j=1 w(Zij(g(Zij)− ln∆tj)
)∑P
j=1 w(Zij)(4.17)
Após efetuar todos esses cálculos matemáticos dentro do algoritmo, é criado o
modelo de visualização com a técnica Tone Mapping. A informação de cor confiável
do mundo real é extraída pelo sistema visual humano e introduzido por escala única
Capítulo 4. Algoritmo/Equações 99
(TMss) e escala múltipla (TMms) [51]. O TMss é representado na Equação 4.18.
Ri(x, y) = log(
Ii(x, y))− log
(F(x, y) ∗ Ii(x, y)
)(4.18)
Onde (x, y) são as coordenadas dos pixels na imagem, Ri(x, y) é o resultado do
cálculo com a banda espectral, Ii(x, y) é a distribuição da imagem na sua banda es-
pectral, ∗ representa a operação de convolução e F(x, y) é a função gaussian, que é
representada na Equação 4.19.
F(x, y) = Ke−x2+y2
c2 (4.19)
No qual, c é uma constante de espaço gaussiano e K é um fator de normalização.
Além disso, TMms é representada na Equação 4.20.
RTMmsi(x, y) =N
∑n=1
ωnRni(x, y) (4.20)
Nesse caso, o N é o número de escalas, Rni(x, y) representa o i-ésimo componente
da n-ésima escala, RTMmsi(x, y) representa o componente espectral da saída TMms e ωn
é o peso associado à n-ésima escala. Os objetivos do TMms são reduzir os artefatos em
torno das bordas de alto contraste, manter o equilíbrio com a compactação do inter-
valo dinâmico e a renderização das cores. O TMms produz uma boa compactação de
faixa dinâmica, mas sofre com a qualidade dos artefatos. Além disso, o TMss com a pe-
quena constante de espaço que agrega, faz com que grandes regiões uniformes fiquem
grudadas e com imagens de aparência plana [51].
Existem dois processos para ser efetuado pelo algoritmo agora, o Tone Mapping
global e o local. O global simula o estágio inicial do sistema visual humano, que detecta
o brilho como uma função logarítmica aproximada, de acordo com a lei de Weber-
Capítulo 4. Algoritmo/Equações 100
Fechner [52], que é representado na Equação 4.21.
Lg(x, y) =log( Lw(x,y)
L̄w+ 1)
log( Lw max
L̄w+ 1) (4.21)
Onde o Lg(x, y) é a saída global, Lw(x, y) são os valores de luminância de en-
trada, Lw max é o valor máximo de luminância e L̄w é a luminância média logarítmica,
como representado na Equação 4.22.
L̄w = e1m ∑x,y log
(δ+Lw(x,y)
)(4.22)
O m é o número total de pixels de um único canal e δ é um valor muito baixo,
somente para evitar a singularidade que ocorre se os pixels pretos estiverem marcantes
na imagem. Além disso, os valores de luminância de entrada Lw(x, y) são derivados,
como representado na Equação 4.23.
Lw(x, y) = 0.299Red(x, y) + 0.587Green(x, y) + 0.114Blue(x, y) (4.23)
O Red, Green e Blue da Equação 4.23, representam os canais de cores RGB da
imagem de entrada, como apresentado no Algoritmo 4.1 e Algoritmo 4.2.
Algorithm 4.1 Implementação em JavaScript do Tone Mapping Global.
function toneMappingGlobal(display, image, a) {var averageLuminance = a / estimateAverageLuminance(image);var newImage = [];for (var j = 0; j < image.length; j += 4) {
var avg = image[j+3] * averageLuminance; avg /= 1 + avg;newImage[j+0] = image[j+0] / image[j+3] * avg;newImage[j+1] = image[j+1] / image[j+3] * avg;newImage[j+2] = image[j+2] / image[j+3] * avg;newImage[j+3] = 0;
} return newImage; }function estimateAverageLuminance(image) { var sum = 0;
for (var j = 0; j < image.length; j += 4) {sum += Math.log(0.0001 + image[j+3]);
} return Math.exp(sum / (image.length / 4) - 0.0001); }
Capítulo 4. Algoritmo/Equações 101
Algorithm 4.2 Implementação em Java do Tone Mapping Global.
private static List<Mat> toneMappingGlobal(Mat b, Mat g, Mat r, int rows, intcols){
Mat Lw = new Mat(rows, cols, r.type());Core.multiply(r, new Scalar(rParam), r); // rParam = 0.299Core.multiply(g, new Scalar(gParam), g); // gParam = 0.587Core.multiply(b, new Scalar(bParam), b); // bParam = 0.114Core.add(r, g, Lw); Core.add(Lw, b, Lw);double LwMax = Core.minMaxLoc(Lw).maxVal;Mat Lw_ = Lw.clone();Core.add(Lw_, new Scalar(0.001), Lw_);double LwAver = Math.exp(Core.sumElems(Lw_).val[0] / (rows * cols));Mat Lg = Lw.clone();Core.divide(Lg, new Scalar(LwAver), Lg);Core.add(Lg, new Scalar(1.0), Lg);Core.divide(Lg, new Scalar(Math.log(LwMax / LwAver + 1.0)), Lg);List<Mat> list = new ArrayList<>();list.add(Lw); list.add(Lg);return list;
}
O Tone Mapping local é aplicado após o processo global. A saída do TMss e do
TMms, sofre de artefatos fortes e com aparência artificial. A fim de lidar com essas des-
vantagens, um filtro para preservar a borda da imagem é usado, substituindo assim,
o filtro gaussian do algoritmo anterior para reduzir os efeitos dos artefatos. O filtro
para preservar a borda depende das diferenças de luminância apresentada na imagem
original [51]. O Tone Mapping local é representado na Equação 4.24.
Ll(x, y) = log Lg(x, y)− log Hg(x, y) (4.24)
No qual, Ll(x, y) representa a saída do modelo local e Hg(x, y) indica a saída do
resultado do modelo global, com o filtro para preservar a borda da imagem, represen-
tado na Equação 4.25.
Hg(x, y) =1|ω| ∑
(ζx,ζy)∈ω(x,y)
(a(ζx, ζy)Lg(x, y) + b(ζx, ζy)
)(4.25)
Nesse caso, o ζx, ζy são as coordenadas dos pixels de vizinhança, ω(x, y) é um
Capítulo 4. Algoritmo/Equações 102
quadrado local de raio r, centrado em um determinado pixel (x, y), |ω| representa o
número de pixels em ω(x, y), enquanto a(ζx, ζy) e b(ζx, ζy) são coeficientes lineares,
calculados na Equação 4.26.
a(ζx, ζy) =µ2(ζx, ζy)− µ2(ζx, ζy)
σ2(ζx, ζy) + ε
b(ζx, ζy) = µ(ζx, ζy)− a(ζx, ζy)µ(ζx, ζy)
(4.26)
Onde µ(ζx, ζy) e σ2(ζx, ζy) são as médias e as variâncias de Lg em ω(ζx, ζy),
µ2(ζx, ζy) é a média de L2g em ω(ζx, ζy) e ε é o parâmetro de regularização, obtendo
assim, o Hg final.
Depois de obter o resultado global com o filtro para preservar a borda da ima-
gem, em vez de aplicar diretamente a equação local, dois fatores são inseridos para
evitar a aparência plana causada pelo filtro e melhorar o desempenho do algoritmo.
Um é o fator de aumento de contraste e o outro é o offset de não-linearidade adaptável.
O fator de aumento de contraste é calculado na Equação 4.27.
α(x, y) = 1 + ηLg(x, y)Lg max
(4.27)
No qual, η é o parâmetro de controle de contraste e Lg max é o valor máximo
de luminância da saída do modelo global. E o offset de não-linearidade adaptável é
calculado na Equação 4.28.
β = λL̄g (4.28)
Esse valor depende do conteúdo presente no quadrado gerado anteriormente
(ω(x, y), na Equação 4.25), λ é o parâmetro de controle de não linearidade e o L̄g é
a luminância média logarítmica da saída do modelo global. Após derivar esses dois
fatores, o modelo local fica representado pela Equação 4.29.
Lout(x, y) = α(x, y) log(
Lg(x, y)Hg(x, y)
+ β
)(4.29)
Capítulo 4. Algoritmo/Equações 103
Onde Lout(x, y) é a saída do Tone Mapping local final. Após o modelo local, os
valores de luminância processados são redimensionados de 0 a 1. Finalmente, a ima-
gem Tone Mapping resultante final é obtida a partir dos valores de luminância da saída
do modelo local e da imagem HDR de entrada, como apresentado no Algoritmo 4.3 e
Algoritmo 4.4. Todos os resultados obtidos com esses algoritmos e técnicas serão apre-
sentados no capítulo 5.
Algorithm 4.3 Implementação em JavaScript do Tone Mapping Local.
function toneMappingLocal(display, image, key, sharpening) {var blurred = []; var onePixelGaussian = 1 / (2 * Math.sqrt(2));for (var i = 0; i < sharpening; i ++) {
if (i == 0) {var blurbase = [];for (var j = 0; j < image.length; j += 4) {
blurbase[j/4] = image[j+3];}var gaussian = gaussianKernelHalf(onePixelGaussian);var blurred0 = gaussianBlur(display, blurbase, gaussian);blurred.push(blurred0);
} else {var r1 = Math.pow(1.6, i-1) * onePixelGaussian;var r = Math.pow(1.6, i) * onePixelGaussian;var r2 = Math.sqrt(r * r - r1 * r1);var gaussian = gaussianKernelHalf(r2);var blurredI = gaussianBlur(display, blurred[i-1], gaussian);blurred.push(blurredI); } }
var localEnvironment = [];var epsilon = 0.001; var scaler = Math.pow(2, sharpening) * key;for (var i = 0; i < blurred[0].length; i ++) {
var j;for (j = 0; j < blurred.length - 1; j ++) {
var v = blurred[j][i] - blurred[j+1][i];v /= scaler / Math.pow(1.6, j * 2) + blurred[j][i];
} localEnvironment[i] = blurred[j][i]; }var averageLuminance = 1 / estimateAverageLuminance(image);var newImage = [];for (var j = 0; j < image.length; j += 4) {
avg = averageLuminance / (1 + localEnvironment[j/4]* averageLuminance);
newImage[j+0] = image[j+0] * avg;newImage[j+1] = image[j+1] * avg;newImage[j+2] = image[j+2] * avg; newImage[j+3] = 0;
} return newImage; }
Capítulo 4. Algoritmo/Equações 104
Algorithm 4.4 Implementação em Java do Tone Mapping Local.
private static Mat toneMappingLocal(Mat Lg, int rows, int cols) {int krnlSz = Arrays.asList(3.0, rows * krnlRatio, cols * krnlRatio)
.stream().max(Double::compare).get().intValue();Mat Lg_ = new Mat();Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
new Size(krnlSz, krnlSz), new Point(-1,-1));Imgproc.dilate(Lg, Lg_, kernel);Mat Hg = Filters.GuidedImageFilter(Lg, Lg_, r, eps);return Hg;
}
...Mat alpha = new Mat(m, n, rChannel.type());Core.divide(Lg, new Scalar(Core.minMaxLoc(Lg).maxVal / eta), alpha);Core.add(alpha, new Scalar(1.0), alpha);Mat Lg_ = new Mat(m, n, rChannel.type());Core.add(Lg, new Scalar(1.0 / 255.0), Lg_);double beta = Math.exp(Core.sumElems(Lg_).val[0] / (m * n)) * lambda;Mat Lout = new Mat(m, n, rChannel.type());Core.divide(Lg, Hg, Lout);Core.add(Lout, new Scalar(beta), Lout);Core.normalize(alpha.mul(Lout), Lout, 0, 255, Core.NORM_MINMAX);...Mat gain = obtainGain(Lout, Lw, m, n);Core.divide(rChannel.mul(gain), new Scalar(Core.minMaxLoc(rChannel)
.maxVal / 255.0), rChannel); // Red ChannelCore.divide(gChannel.mul(gain), new Scalar(Core.minMaxLoc(gChannel)
.maxVal / 255.0), gChannel); // Green ChannelCore.divide(bChannel.mul(gain), new Scalar(Core.minMaxLoc(bChannel)
.maxVal / 255.0), bChannel); // Blue ChannelMat outval = new Mat();Core.merge(new ArrayList<>(Arrays.asList(bChannel, gChannel, rChannel))
, outval);outval.convertTo(outval, CvType.CV_8UC1);...
private static Mat obtainGain(Mat Lout, Mat Lw, int rows, int cols) {Mat gain = new Mat(rows, cols, Lout.type());for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {if (Lw.get(i, j)[0] == 0)
gain.put(i, j, Lout.get(i, j)[0]);else
gain.put(i, j, Lout.get(i, j)[0] / Lw.get(i, j)[0]);}
} return gain;}
Capítulo 4. Algoritmo/Equações 105
4.4 Processadores
Um processador é uma espécie de microchip especializado. A sua função é ace-
lerar, endereçar, resolver ou preparar dados, dependendo da aplicação. Basicamente,
um processador é uma poderosa máquina de calcular que recebe um determinado vo-
lume de dados, orientados em padrão binário 0 e 1 e tem a função de responder a
esse volume, processando a informação com base em instruções armazenadas em sua
memória interna [53].
O primeiro passo sobre os processadores é entender como eles e os sistemas ope-
racionais (SO) trabalham com as aplicações. Basicamente, a execução de uma aplicação
dá-se, em um primeiro instante, em uma ação do sistema operacional. Quando o usuá-
rio executa uma ação, ou seja, abre qualquer das aplicações, web ou local, o sistema
operacional interpreta a ação e requisita que os arquivos relacionados a esse software
sejam executados.
Sabendo que qualquer atividade do sistema operacional está sujeita à operação
do processador, seja CPU (Central Process Unit) ou GPU (Graphics Processing Unit). To-
davia, antes que uma aplicação esteja aberta e realmente requisite o trabalho de um
processador, ele é apenas carregado na memória RAM (Random Access Memory).
Ao efetuar o carregamento da aplicação, o sistema operacional trabalha com pro-
cessos (threads). Cada software possui um processo (alguns utilizam árvores de proces-
sos), cada qual com respectivas instruções para o processador saber como proceder na
hora de efetuar qualquer requisição [53].
Os chamados “processos” são módulos executáveis, os quais contêm linhas de
código para que a execução do programa seja realizada apropriadamente. Isso quer
dizer que o processo é uma lista de instruções, a qual informa ao processador que
passos devem ser executados e em quais momentos isso acontece [53].
Os processadores trabalham muito bem com os processos, mas a execução de
muitos processos simultaneamente acarreta em lentidão, para evitar esse ponto, é pre-
ciso saber o limite que existe no hardware escolhido para o trabalho e fazer a divisão
Capítulo 4. Algoritmo/Equações 106
correta entre as atividades da CPU e GPU.
4.4.1 Central Process Unit
O processador, também chamado de CPU, é o componente de hardware respon-
sável por processar dados e transformar em informação. Ele também transmite estas
informações para a placa mãe, que por sua vez as transmite para onde é necessário
(como o monitor, impressora, outros dispositivos). A placa mãe serve de ponte entre
o processador e os outros componentes de hardware da máquina, outras funções do
processador são fazer cálculos e tomar decisões lógicas [54]. Existem algumas caracte-
rísticas específicas para conhecer em uma CPU para fazer o processamento digital de
imagem/vídeo, como visualizado na Tabela 4.1.
Tabela 4.1 – Características Específicas - Central Process Unit (baseado em [54]).
Características DescriçãoClock (Hz - hertz) Define a capacidade do processador em processar in-
formações ao mesmo tempo.Core É o núcleo do processador.Cache É um tipo de memória auxiliar, que faz diminuir o
tempo de transmissão de informações entre o proces-sador e outros componentes.
Potência (W - watt) É a quantidade de energia consumida por segundo,1W = 1J/s.
CPU é um dispositivo programável de entrada e saída de dados, que processa os
dados digitais de entrada e, associando as instruções armazenadas em sua memória,
fornece como saída os dados resultantes do processamento, composta pela unidade
lógica e aritmética (ULA), que executa as operações aritméticas e lógicas; unidade de
controle (UC), que extrai instruções da memória e as decodifica e executa, requisitando
a ULA quando necessário; e os registradores e memória cache, no qual, armazena da-
dos para o processamento [55].
A velocidade de processamento das informações em um computador está dire-
tamente relacionada à velocidade do processador. Quanto mais rápido o processador,
maior a velocidade de processamento.
Capítulo 4. Algoritmo/Equações 107
4.4.2 Graphics Processing Unit
Uma placa de vídeo é composta por diversos circuitos e elementos eletrônicos,
porém seu papel mais importante é o de comportar um processador dedicado especi-
almente para a renderização de gráficos em tempo real [56]. Este tipo de processador é
chamado de GPU, como visualizado na Figura 4.3.
Figura 4.3 – Localização da GPU na placa de vídeo (adaptado de [56]).
Normalmente, a GPU fica localizada na parte mais central de uma placa de ví-
deo, rodeada pelos demais componentes do dispositivo. Como estes processadores ge-
ram muito calor enquanto trabalham, quase todos os fabricantes incluem um conjunto
de dissipador e ventoinha acoplado ao chip para mantê-lo na temperatura ideal.
A diferença entre a CPU (apresentado na subseção 4.4.1) e a GPU, é que a CPU
pode fazer qualquer tipo de cálculo de processamento, incluindo os gráficos, porém,
o processo através da CPU seria lento demais e por isto é utilizado um processador
específico para esta função, no caso, a GPU [56].
Existem algumas características específicas para conhecer em uma placa de vídeo
para fazer o processamento digital de imagem/vídeo, como visualizado na Tabela 4.2.
A GPU possui mais unidades de processamento que a CPU, ou seja, mais threads.
Porém, os processadores presentes na GPU são mais simples e geralmente mais lentos
Capítulo 4. Algoritmo/Equações 108
Tabela 4.2 – Características Específicas - Graphics Processing Unit (baseado em [56]).
Características DescriçãoClock (hertz) É o sistema de velocidade de informações, quanto
maior o número do clock, mais rápida será a respostado processador gráfico.
Memória (bytes) É o tamanho do armazenamento de memória, ela nãorepresenta qualidade em termos de potência para aplaca, mas obviamente, quanto mais espaço livre, me-lhor será a circulação das informações.
Quadros/s Significa a quantidade de imagens que a placa de vídeoconsegue reproduzir por segundo.
Clock de Memória É voltado especificamente para a memória da placa, equanto maior o número de clock, maior será a rapidezcom que as informações serão exibidas na tela.
que os processadores das CPUs, desta forma, aplicações muito iterativas, tais como
editores de texto, cálculos matemáticos, entre outros, não se beneficiariam muito do
poder de processamento das GPUs. Por outro lado, aplicações em que exista muito
paralelismo de dados, como imagens/quadros, são perfeitos para esse ambiente [57].
A GPU, em seu núcleo, implementa um modelo computacional chamado SIMD
(Single Instruction Multiple Data), que são vários processadores, mais somente uma uni-
dade de processamento. A NVIDIA, costuma usar a expressão STMD (Single Thread
Multiple Data) para caracterizar as GPUs dela, além das placas de vídeo da marca su-
portarem até 768 threads ativas por multiprocessador, algumas GPUs elevando este
número a 1.024 [58].
É natural que um hardware seja programado com uma linguagem de programa-
ção heterogênea, em que o programador possa especificar quais partes do programa
devem executar sobre a CPU e quais partes devem executar sobre a GPU. Existe a lin-
guagem CG, que é uma linguagem de shading que foi inventada pela própria NVIDIA
em colaboração com a Microsoft e, surgiu para ser mais uma linguagem de alto nível
para substituir o Assembly. Outra linguagem é a HLSL (High Level Shading Language),
que é uma linguagem de programação de alto nível utilizada na criação de shaders, que
são utilizados no pipeline gráfico da GPU [57] [58].
Utilizando essas linguagens foi desenvolvido um CUDA (Compute Unified Device
Capítulo 4. Algoritmo/Equações 109
Architecture), que é uma API (Application Programming Interface) destinada a computa-
ção paralela, GPGPU (General Purpose Graphics Processing Unit), e computação hetero-
gênea, criada pela NVIDIA.
A plataforma CUDA dá acesso ao conjunto de instruções virtuais da GPU e a ele-
mentos de computação paralela, para a execução de núcleos de computação, contendo
um corpo principal, que será executado sobre a CPU, e várias funções especiais, nor-
malmente chamadas kernels, que serão executadas na GPU [58]. Ao observar um kernel,
existe a impressão de que o texto se trata de um programa sequencial, mas este mesmo
código será simultaneamente executado por centenas de threads, como apresentado no
Algoritmo 4.5, no qual, processa uma matriz imagem/quadro.
Algorithm 4.5 Implementação em CG/HLSL do CUDA
void Mul(const float* A, const float* B, int width, float* C){int size = width * widht * sizeof(float);
float* Ad;cudaMalloc((void**)&Ad, size);cudaMemcpy(Ad, A, size, cudaMemcpyHostToDevice);
float* Bd;cudaMalloc((void**)&Bd, size);cudaMemcpy(Bd, B, size, cudaMemcpyHostToDevice);
float* Cd;cudaMalloc((void**)&Cd, size);
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);dim3 dimGRID(wB / dimBlock.x, hA / dimBlock.y);
Muld«<dimGRID, dimBlock»>(Ad, Bd, width, Cd);
cudaMemcpy(C, Cd, size, cudaMemcpyDeviceToHost);
cudaFree(Ad);cudaFree(Bd);cudaFree(Cd);
}
Capítulo 4. Algoritmo/Equações 110
4.4.3 Threads
A thread é uma divisão do processo principal de um software. As linhas de ins-
truções dos processos adquiriram características únicas, que possibilitaram separá-las
para execuções em diferentes núcleos, de certa maneira, uma linha de instrução é uma
tarefa que o processador deverá realizar.
Enfim, o problema é que nem todos os processos são divididos em múltiplas
threads, assim como nem todos os processadores são capazes de trabalhar com uma
quantidade grande de threads. Os mais recentes processadores (CPU) vêm com especi-
ficações quanto aos núcleos e às threads [59]. Verificando no site da fabricante, o pro-
cessador Intel Core i9-8950HK, como visualizado na Figura 4.4, utilizado para os testes
nas aplicações web (JavaScript) e local (Java), vem com seis núcleos e tem suporte para
trabalhar com até doze threads, como visualizado na Tabela 4.3. No caso, são utilizados
dois processadores Intel Core i9-8950HK, dando um máximo de vinte e quatro threads.
Figura 4.4 – Processador Intel Core i9-8950HK (adaptado de [59]).
Para os processadores (GPU), eles não vêm com especificações quanto aos nú-
cleos e às threads [60], mas são utilizadas três placas de vídeo NVIDIA GeForce GTX
1070 Ti, como visualizado na Figura 4.5, isso significa, três GPUs disponíveis para pro-
cessar a parte gráfica das aplicações. No site da fabricante, é possível ter algumas ca-
racterísticas importantes da placa, como visualizado na Tabela 4.4.
Capítulo 4. Algoritmo/Equações 111
Tabela 4.3 – Características - Processador Intel Core i9-8950HK (baseado em [59]).
Características DescriçãoDesempenhoNúmero de Núcleos 6Número de Threads 12Frequência Baseada em Processador 2,90 GHzFrequência Turbo Max 4,80 GHzCache 12 Mb SmartCacheVelocidade do Barramento 8 GT/s DMIThermal Design Power (TDP) 45 WMemóriaTamanho Máximo Memória 64 GbTipos de Memória DDR4-2666, LPDDR3-2133Número Máximo de Canais 2Largura de Banda Máxima 41,8 Gb/s
Figura 4.5 – Placa de vídeo GeForce GTX 1070 Ti (adaptado de [60]).
Capítulo 4. Algoritmo/Equações 112
Tabela 4.4 – Características - Placa de vídeo: GeForce GTX 1070 Ti (baseado em [60]).
Características DescriçãoArquitetura PascalCores 2432Framebuffer GDDR5 de 8 GbTipo de Memória - Velocidade 8 Gb/sBoost Clock Relativo 1.4xBoost Clock Real 1683 MHzLargura Interface da Memória 256-bitLargura Banda da Memória 256 Gb/s
O algoritmo criado para executar as threads inseridas no código de processa-
mento digital de imagem/vídeo foi desenvolvido em Clojure [61], que é um dialeto
da linguagem de programação Lisp. É uma linguagem de programação de propósito
geral com ênfase em programação funcional e executada na Java Virtual Machine (JVM)
por padrão, mas existem versões alternativas para outros ambientes de execução.
No Algoritmo 4.6 (Parte 1) e Algoritmo 4.7 (Parte 2), o processador percorre a
imagem escolhida, linha por linha, no qual, um número de threads específico, edita uma
linha de cada vez da imagem, sem colisão. No caso, a quantidade de threads empregada
no sistema, vai depender do modelo do processador alocado para essa função.
O interessante é que a linguagem Clojure, interage com o JavaScript (web) e o
Java (local), podendo assim, usar o mesmo algoritmo para as duas aplicações. A ma-
cro (multithreader), inicia declarando um conjunto de funções que executam um loop de
um índice inicial para um final, ou seja, uma função que usa múltiplas threads e final-
mente, divide o processo em duas partes, CPU (apresentado na subseção 4.4.1) e GPU
(apresentado na subseção 4.4.2).
Todos os cálculos matemáticos e de pixels são feitos pela CPU, mas como visu-
alizado na Figura 4.6, a CPU não consegue processar de forma rápida a parte gráfica
de uma imagem, então todos os processos relacionados a essa parte serão da GPU,
fazendo essa separação de forma precisa e detalhada, os resultados das imagens, com-
parando o tempo de processamento, são muito expressivos. Após cada parte executar
os seus processos, a imagem resultante é apresentada no software.
Capítulo 4. Algoritmo/Equações 113
Algorithm 4.6 Implementação em Clojure do multithreaded (Parte 1).
(defn do-it [start end](map println
(range start end)))
(defn do-it-iterating [start end](doseq [i (range start (+ 1 end))]
(println i)))
(defn do-times [start end](dotimes [i (range start end)]
(println i)))
(defn do-it-looping [start end](loop [i start]
(if (<= i end)(do
(println i)(recur (inc i))))))
(defn do-it-multithreaded [start end](let [ai (AtomicInteger. start)]
(defn looper [](loop [i (.getAndIncrement ai)]
(if (< i (+ 1 end))(do
(println i)(try(Thread/sleep 100)(catch Exception e (.printStackTrace e)))(recur (.getAndIncrement ai))))))
(dotimes [i (.availableProcessors (Runtime/getRuntime))](.start (Thread. looper)))))
(defn printer [i](println i)(try
(Thread/sleep 100)(catch Exception e (.printStackTrace e))))
Capítulo 4. Algoritmo/Equações 114
Algorithm 4.7 Implementação em Clojure do multithreaded (Parte 2).
(defmacro multithreader [start end fun & args](let [ai# (AtomicInteger. start)]
(defn looper [](loop [i# (.getAndIncrement ai#)]
(if (< i# end)(do
( fun i# @args)(recur (.getAndIncrement ai#))))))
(let [threads# (map (fn [x#] (Thread. looper (str "Looper-"x#)))(range (.availableProcessors (Runtime/getRuntime))))]
(doseq [t# threads#](.start t#))
(doseq [t# threads#](.join t#)))))
(let [r (Random. (System/currentTimeMillis))](defn line-randomizer [row #f̂loats pixels width]
(let [offset (int (* width row))](dotimes [i width]
(aset pixels (+ i offset) (.nextFloat r))))))
(ij.process FloatProcessor))
(let [width (int 512)height (int 512)#ÎmagePlus imp (IJ/createImage width height 1)#f̂loats pixels (.getPixels (.getProcessor imp))]
(multithreader 0 heightline-randomizer pixels width)
(.setMinAndMax (.getProcessor imp) 0 1)(.show imp))
Figura 4.6 – Comparativo do PDI, entre CPU e GPU (adaptado de [56]).
Capítulo 4. Algoritmo/Equações 115
Para ajudar no processo e garantir o melhor desempenho da thread no algoritmo
desenvolvido na linguagem Clojure [61], a função chamada doItMultithreaded executa
um processo em paralelo nos núcleos da CPU e garante o processamento gráfico na
GPU. A função multithreader foi desenvolvida para aplicar filtros em um processo se-
parado com thread, deixando o sistema sempre estável para a chegada de novas funcio-
nalidades, como apresentado no Algoritmo 4.8. Todos os resultados obtidos com esses
algoritmos e técnicas serão apresentados no capítulo 5.
Algorithm 4.8 Implementação em JavaScript do multithreaded extra.
function doItMultithreaded(start, end) {var threads = java.lang.reflect.Array.newInstance(java.lang.Thread
.class, java.lang.Runtime.getRuntime().availableProcessors());var ai = new java.util.concurrent.atomic.AtomicInteger(start);var body = {
run: function() {for (var i=ai.getAndIncrement(); i<=end; i=ai.getAndIncrement()) {java.lang.Thread.sleep(100);
} } }for (var i = 0; i < threads.length; i++) {
threads[i] = new Thread(new Runnable(body));threads[i].start();
} }
function multithreader(fun, start, end) {var threads = java.lang.reflect.Array.newInstance(java.lang.Thread
.class, java.lang.Runtime.getRuntime().availableProcessors());var ai = new java.util.concurrent.atomic.AtomicInteger(start);var args = new Array();var b = 0;for (var a = 3; a < arguments.length; a++) {
args[b] = arguments[a];b++;
}var body = {run: function() {
for (var i=ai.getAndIncrement(); i<=end; i=ai.getAndIncrement()) {fun(i, args);
} } }for (var i = 0; i < threads.length; i++) {
threads[i] = new java.lang.Thread(new java.lang.Runnable(body));threads[i].start();
} }
Capítulo 4. Algoritmo/Equações 116
4.5 Discrete Cosine Transform
A DCT faz uso de números reais e é muito utilizada em processamento digital
de imagem/vídeo e compressão de dados. Expressa uma sequência finita de pontos
de dados em termos de uma soma de funções do cosseno oscilando em frequências
diferentes, onde pequenos componentes de alta frequência podem ser descartados [62].
O olho humano é mais sensível a mudanças no brilho do que a mudanças de
cor, por isso, a representação de cores é convertida de RGB para YCbCr, consistindo
em uma componente de brilho Y e duas componentes de cores Cb e Cr (b de blue e r
de red), isso significa que os dados da imagem são divididos em uma componente de
luminância e em duas de crominância. A DCT reduz as componentes espaciais de altas-
frequências da imagem, uma vez que o observador humano é mais sensível a erros
de reconstrução de componentes de baixas frequências. Diante da afirmação, a DCT
permite que os dados sejam representados em termos de coeficientes de frequência
dos seus componentes [63].
Existem vários formatos de imagem, é muito difícil decidir qual é o melhor para
cada tipo de aplicação, principalmente quando é necessário armazenar a imagem em
um banco de dados. Cada uma das extensões possui características próprias, sendo
indicadas para situações diferentes, o JPEG (Joint Photographic Experts Group) é mais
utilizado na web por seu pequeno tamanho, mas o PNG (Portable Network Graphics) é
mais versátil e recomendado para quando se deseja melhor qualidade [63].
Levando em consideração esses fatos, foi escolhido o formato PNG para o canvas
do HTML [64], e o JPEG para o armazenamento e aplicação da transformada discreta
do cosseno. Para aplicar a DCT em uma imagem, é necessário, a fim de otimizar os
cálculos e melhorar a taxa de compressão, dividir a imagem original em blocos, 4x4,
8x8 ou 16x16, podendo usar até blocos de 32x32 ou 64x64. O padrão para JPEG são
blocos de 8x8, como visualizado na Figura 4.7. O tamanho dos blocos tem grande im-
pacto na taxa de compressão, sendo que quanto maiores os blocos, menor será a taxa
de compressão.
Capítulo 4. Algoritmo/Equações 117
Figura 4.7 – Exemplo de uma imagem/quadro em blocos 8x8 (adaptado de [63]).
Assim, foi desenvolvido o Algoritmo 4.9 (Parte 1) e Algoritmo 4.10 (Parte 2) que
realiza a compressão JPEG utilizando a linguagem de programação JavaScript para a
versão web e para a local, foi utilizado o mesmo padrão de implementação, usando o
Lisp, ele interpreta o HTML/JavaScript e converte para o Java, como na subseção 3.1.2.4.
Algorithm 4.9 Implementação em JavaScript da DCT/IDCT (Parte 1).
function DiscreteCosineTransform(){this.main = function(){
var dctHelper = DiscreteCosineTransformHelper;var samplesNormalizedAndMinMax = dctHelper
.samplesNormalize(samplesOriginal);var samplesNormalized = samplesNormalizedAndMinMax[0];var sampleMin = samplesNormalizedAndMinMax[1];var sampleMax = samplesNormalizedAndMinMax[2];var samplesInFrequencyDomain = dctHelper
.samplesSpatialToFrequencyDomain(samplesNormalized);var samplesInSpatialDomain = dctHelper
.samplesFrequencyToSpatialDomain(samplesInFrequencyDomain);var samplesDenormalized = dctHelper.samplesDenormalize
(samplesInSpatialDomain, sampleMin, sampleMax);DisplayHelper.samplesDraw("Original", displaySize, samplesOriginal);DisplayHelper.samplesDraw("Normalizado", displaySize,
samplesNormalized);DisplayHelper.samplesDraw("DCT", displaySize,
samplesInFrequencyDomain);DisplayHelper.samplesDraw("IDCT", displaySize,
samplesInSpatialDomain);DisplayHelper.samplesDraw("Desnormalizado", displaySize,
samplesDenormalized);} }
Esse algoritmo divide a matriz de luminância e as duas matrizes de crominân-
Capítulo 4. Algoritmo/Equações 118
Algorithm 4.10 Implementação em JavaScript da DCT/IDCT (Parte 2).
function DiscreteCosineTransformHelper(){}{DiscreteCosineTransformHelper.samplesDenormalize = function
(samplesToDenormalize, sampleMin, sampleMax){var returnValues = [];var sampleRange = sampleMax - sampleMin;for (var s = 0; s < samplesToDenormalize.length; s++){
var sampleNormalized = samplesToDenormalize[s];var sampleDenormalized = (sampleNormalized + 1)/2
* sampleRange + sampleMin;returnValues[s] = sampleDenormalized;
} return returnValues; }DiscreteCosineTransformHelper.samplesNormalize = function
(samplesToNormalize){var samplesMinAndMax = MathHelper
.minAndMaxOfNumbers(samplesToNormalize);var sampleMin = samplesMinAndMax[0];var sampleMax = samplesMinAndMax[1];var sampleRange = sampleMax - sampleMin;var samplesNormalized = [];for (var s = 0; s < samplesToNormalize.length; s++){
var sample = samplesToNormalize[s];var sampleNormalized = (sample - sampleMin)/sampleRange* 2 - 1;samplesNormalized[s] = sampleNormalized;
} var returnValues = [samplesNormalized, sampleMin, sampleMax];return returnValues; }
DiscreteCosineTransformHelper.samplesSpatialToFrequencyDomain =function(samplesToConvert){ var samplesTransformed = [];var numberOfSamples = samplesToConvert.length;for (var i = 0; i < numberOfSamples; i++){
var sampleTransformed = 0;for (var j = 0; j < numberOfSamples; j++){
sampleTransformed += samplesToConvert[j]* Math.cos(Math.PI* i* (j + .5)/numberOfSamples);
} samplesTransformed[i] = sampleTransformed;} return samplesTransformed; }
DiscreteCosineTransformHelper.samplesFrequencyToSpatialDomain =function(samplesToConvert){ var samplesTransformed = [];var numberOfSamples = samplesToConvert.length;for (var i = 0; i < numberOfSamples; i++){
var sampleTransformed = samplesToConvert[0] / 2;for (var j = 1; j < numberOfSamples; j++){
sampleTransformed += samplesToConvert[j]* 2* Math.cos(Math.PI* (i + .5)* (j)/ numberOfSamples);
} sampleTransformed /= numberOfSamples;samplesTransformed[i] = sampleTransformed;
} return samplesTransformed; }} new DiscreteCosineTransform().main();
Capítulo 4. Algoritmo/Equações 119
cia em inúmeras matrizes, cada uma com o tamanho de 8x8 pixels. Portanto, tem-se
as várias matrizes compostas de 64 pixels, conhecidas como sample values. Sobre estas
matrizes é aplicado a DCT, gerando outras matrizes, denominadas de “Coeficientes de
DCT”, cuja maioria dos elementos tem valores próximos a zero, esse processo trans-
lada a informação do domínio do espaço para o domínio da frequência, utilizando uma
normalização dos valores, apresentado na Equação 4.30, que é, aplicar um conjunto de
regras que visa, principalmente, a organização dos dados para reduzir a redundância,
aumentar a integridade e o desempenho alcançado no armazenamento [62].
Z =X− α
θ(4.30)
Onde, o X é o valor a ser normalizado, α é a média aritmética da distribuição e
θ é o desvio padrão da distribuição. A DCT para uma matriz (ou seja, uma imagem/-
quadro) de tamanho NxM é apresentado na Equação 4.31.
F(µ, ϑ) =
(2N
) 12(
2M
) 12 N−1
∑i=0
M−1
∑j=0
∆(i)∆(j)cos[πµ
2N(2i + 1)
]cos[
πϑ
2M(2j + 1)
]f (i, j)
(4.31)
No qual, F(µ, ϑ) representa o coeficiente no domínio da transformada, µ é o eixo
horizontal no domínio da transformada, o ϑ é o eixo vertical no domínio da transfor-
mada, ∆(x) = 1√2
para x = 0, ∆(x) = 1 para x 6= 0, x = µ|ϑ, f (i, j) é a amplitude no
domínio do tempo, o i é eixo horizontal no domínio do tempo e o j é o eixo vertical no
domínio do tempo. A inversa (Inverse Discrete Cosine Transform - IDCT), é apresentada
na Equação 4.32.
F−1(µ, ϑ) (4.32)
Fazendo a aplicação da Equação 4.31, a DCT ocupa mais espaço do que a sua
matriz original, já que, os valores da matriz original são do tipo byte, ou inteiro, e os
coeficientes da DCT são reais. Para reduzir esses valores, é realizada a quantização,
que é o processo de reduzir o número de bits necessários para armazenar um valor
reduzindo a precisão de um inteiro. É neste processo de quantização, que acontece a
Capítulo 4. Algoritmo/Equações 120
perda da informação, ou seja, os valores dos coeficientes que eram reais, agora passam
a ser inteiros, perdendo a parte decimal, mas reduzindo o número de bits necessários
para armazenar os valores [62]. Para o formato JPEG, a quantização é apresentada pela
Equação 4.33.
Q [i] [j] = 1 + (1 + i + j)δ (4.33)
Onde o δ é um valor para a qualidade da imagem, sendo de 1 a 25. Valores mai-
ores do que 25 comprometem em muito a qualidade da imagem, perdendo completa-
mente as informações nela existente. Na Tabela 4.5, é apresentado os valores de quali-
dade aplicados a uma imagem de 400x400 pixels, resultando em uma dada compressão.
Tabela 4.5 – Fatores de Qualidade (baseado em [62]).
Qualidade (δ) 2 5 10 15 20 25Taxa de Compressão (%) 20.59 10.38 5.82 4.22 3.43 3.00Perda de Informação (%) 8.39 10.07 11.55 12.23 12.49 13.84Identificador (id) 1 2 3 4 5 6
Após o procedimento de quantização, a imagem/quadro é armazenada no banco
de dados com um tamanho reduzido, podendo voltar para as aplicações desenvolvi-
das quando for necessário executar um PDI/V, utilizando a IDCT. Para o sistema de
armazenamento das imagens/quadros foram utilizados comandos da linguagem SQL
(Structured Query Language) implementada juntamente ao JavaScript, com uma lingua-
gem de script PHP (Hypertext Preprocessor) para fazer toda a comunicação entre as apli-
cações, web/local e o banco de dados [65]. O driver utilizado foi o MySQL, que é um
SGBD (Sistema de Gerenciamento de Banco de Dados), que utiliza a linguagem SQL
como interface [66].
Aplicando a Equação 4.32, é visto que, quando recuperado os pixels da imagem,
os valores foram bem próximos dos originais, provando que as perdas são desprezí-
veis, somente as altas frequências foram descartadas, como visualizado na Figura 4.8.
Todos os resultados obtidos com esses algoritmos e técnicas serão apresentados no ca-
pítulo 5.
Capítulo 4. Algoritmo/Equações 121
Figura 4.8 – Comparação entre a imagem/quadro original e a IDCT (baseado em [63]).
122
5 Resultados
5.1 Partial Differential Equation
O primeiro teste da Partial Differential Equation [67] foi para medir o tempo de
processamento de três imagens/quadros na etapa de filtragem de um ruído, como vi-
sualizado na Figura 5.1. A razão entre o sinal-ruído (SNR - Signal to Noise Ratio) é uma
maneira útil e universal de comparar as quantidades relativas de sinal e ruído para
qualquer sistema eletrônico, no qual, razões altas terão pouco ruído visível enquanto
o oposto vale para baixas razões. Sendo assim, foi utilizado um SNR de grau interme-
diário, ou seja, ruído aleatório, que é caracterizado por flutuações de intensidade e tom
de cor em relação a imagem/quadro original, deixando menos nítido.
Figura 5.1 – Comparativo do tempo de processamento da filtragem: (A) Algoritmo 1;e (B) Algoritmo 2.
Como resultado, o “Algoritmo 1” (representado como a técnica padrão de filtra-
gem com uso de máscara e análise de pixels por vizinhança [10]) gerou em média a
matriz MxN das três imagens/quadros em 73,1 segundos e a análise e padronização
do histograma em 42 segundos, enquanto o “Algoritmo 2” (representado como a téc-
Capítulo 5. Resultados 123
nica apresentada na pesquisa) em 58 segundos e 32,4 segundos, respectivamente. Em
relação as três imagens/quadros (Figura 5.2, Figura 5.3 e Figura 5.4), o tempo médio
de processamento no “Algoritmo 1” foi de 24,6 segundos, enquanto no “Algoritmo 2”
foi de 20,13 segundos, com isso, gerou uma economia em tempo de 4,47 segundos.
O segundo teste gerado, é para analisar o perfil em termos de qualidade dos
pixels, para isso, as três imagens/quadros (Figura 5.2, Figura 5.3 e Figura 5.4) foram
matricialmente comparadas a nível de pixel. Para essa análise comparativa foram uti-
lizadas três placas de vídeo NVIDIA GeForce GTX 1070 Ti e dois processadores Intel
Core i9-8950HK, demorando 37 horas, 14 minutos e 02 segundos para conclusão. Como
resultado, o “Algoritmo 2” atingiu em média 91% de qualidade e precisão nos pixels
gerados, enquanto o “Algoritmo 1” atingiu 83%.
Para calcular o valor médio do PSNR (Peak Signal to Noise Ratio), que é usado para
definir a relação entre a máxima energia de um sinal e o ruído que afeta sua represen-
tação fidedigna, se faz a formulação do MSE (Mean Squared Error) (representado na
Equação 5.1) e depois aplica a relação sinal-ruído (representado na Equação 5.2).
MSE =1
MN
M−1
∑i=0
N−1
∑j=0‖ Imagem1(i, j)− Imagem2(i, j)) ‖2 (5.1)
PSNR = 20log10 (255)− 10log10 (MSE) (5.2)
Para o “Algoritmo 1” o valor médio do PSNR atingido foi de 31,90dB, mas no
“Algoritmo 2” o valor foi de 45,09dB, com isso, gerou um ganho de 13,19dB. E o úl-
timo teste realizado foi a nível de histograma, comparando as três imagens/quadros
(Figura 5.2, Figura 5.3 e Figura 5.4), como visualizado na Figura 5.5, classificando o
“Algoritmo 2” como melhor a nível de qualidade de histograma, apresentando em
cada camada RGB um número maior de pixels localizados na zona de tons médios.
O “Algoritmo 1”, por sua vez, teve uma concentração maior de pixels nas zonas de
sombras e luzes altas.
Capítulo 5. Resultados 124
Figura 5.2 – Aplicação da técnica de filtragem - Exemplo 1: (A) Imagem Original 4K;(B) Imagem com ruído; (C) Filtragem Normal (31,92dB); e (D) Partial
Differential Equation (46,58dB).
Capítulo 5. Resultados 125
Figura 5.3 – Aplicação da técnica de filtragem - Exemplo 2: (A) Imagem Original 4K;(B) Imagem com ruído; (C) Filtragem Normal (32,57dB); e (D) Partial
Differential Equation (44,55dB).
Capítulo 5. Resultados 126
Figura 5.4 – Aplicação da técnica de filtragem - Exemplo 3: (A) Imagem Original 4K;(B) Imagem com ruído; (C) Filtragem Normal (31,23dB); e (D) Partial
Differential Equation (44,15dB).
Capítulo 5. Resultados 127
Figura 5.5 – Comparativo do histograma das imagens/quadros filtrados: (A)Algoritmo 1; e (B) Algoritmo 2.
Capítulo 5. Resultados 128
5.2 High Dynamic Range
O primeiro teste de High Dynamic Range [67] foi para medir o tempo de proces-
samento na geração da imagem resultante, utilizando para isso a Figura 5.6.
Figura 5.6 – Imagem resultante HDR utilizada no primeiro teste.
Como resultado, o “Algoritmo 1” (representado como Debevec and Malik [44])
processou a imagem em 19,8 segundos, enquanto o “Algoritmo 2” (representado como
a técnica apresentada na pesquisa) em 12,4 segundos, obtendo um ganho de 7,4 segun-
dos do anterior, como visualizado na Figura 5.7.
Figura 5.7 – Comparativo do tempo de processamento HDR: (A) Algoritmo 1; e (B)Algoritmo 2.
O segundo teste realizado foi a nível de histograma, já que, o “Algoritmo 2”
efetua uma padronização dos pixels da imagem resultante HDR, ou seja, faz uma aná-
lise matricial e gráfica previamente, obtendo as melhores combinações dos pixels de
vizinhança, sendo assim, a Figura 5.6 é comparada, como visualizado na Figura 5.8,
classificando o “Algoritmo 2” como melhor a nível de qualidade de histograma, apre-
sentando em cada camada RGB um número maior de pixels localizados na zona de
Capítulo 5. Resultados 129
tons médios. O “Algoritmo 1”, por sua vez, teve uma concentração maior de pixels nas
zonas de sombras e luzes altas.
Figura 5.8 – Comparativo do histograma da imagem HDR: (A) Algoritmo 1; e (B)Algoritmo 2.
O terceiro teste gerado, é para analisar o perfil em termos de qualidade dos pi-
Capítulo 5. Resultados 130
xels na imagem resultante HDR, para isso, uma nova imagem resultante foi gerada
matricialmente e comparadas a nível de pixel. Para essa análise comparativa foram uti-
lizadas três placas de vídeo NVIDIA GeForce GTX 1070 Ti e dois processadores Intel
Core i9-8950HK, demorando 7 horas, 12 minutos e 23 segundos para conclusão. Como
resultado, o “Algoritmo 2” atingiu 93% de qualidade e precisão nos pixels gerados,
enquanto o “Algoritmo 1” atingiu 77%, como visualizado na Figura 5.9.
Figura 5.9 – Comparativo na qualidade da Imagem HDR: (A) Algoritmo 1; e (B)Algoritmo 2.
Capítulo 5. Resultados 131
O último teste gerado leva em consideração a técnica de Tone Mapping [47], o
primeiro passo foi medir o tempo de processamento na geração da técnica HDR/Tone
Mapping. Como resultado, o “Algoritmo 2” desempenhou tempos mais baixos de pro-
cessamento do que o “Algoritmo 1”, como visualizado na Figura 5.10, tendo como base
seis imagens diferentes para esse teste.
Figura 5.10 – Comparativo do tempo de processamento da técnica HDR/ToneMapping: (A) Algoritmo 1; e (B) Algoritmo 2.
O segundo passo, foi analisar o perfil em termos de qualidade dos pixels entre
o Tone Mapping normal (“Algoritmo 1”) e o Tone Mapping resultante (“Algoritmo 2”),
podendo perceber que no modelo resultante os pixels alcançaram um poder de visuali-
zação quase igual ao da Imagem HDR (também gerado em “Algoritmo 2”), como visu-
alizado na Figura 5.11, Figura 5.12, Figura 5.13, Figura 5.14, Figura 5.15 e Figura 5.16.
Para esse feito, uma máscara de filtro “controle dinâmico de brilho e aproximação”
desenvolvida juntamente com a técnica do “Algoritmo 2” na pesquisa, foi alocada na
frente da imagem gerada para que o valor pixel seja aproximado ao valor real HDR,
dando assim aos pixels de vizinhança um valor mais visível do que realmente é nos
monitores comuns. Para a análise nas seis imagens comparativas foram utilizadas três
placas de vídeo NVIDIA GeForce GTX 1070 Ti e dois processadores Intel Core i9-8950HK,
demorando 86 horas, 34 minutos e 12 segundos para conclusão.
Capítulo 5. Resultados 132
Figura 5.11 – Aplicação da técnica HDR/Tone Mapping - Exemplo 1: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 133
Figura 5.12 – Aplicação da técnica HDR/Tone Mapping - Exemplo 2: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 134
Figura 5.13 – Aplicação da técnica HDR/Tone Mapping - Exemplo 3: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 135
Figura 5.14 – Aplicação da técnica HDR/Tone Mapping - Exemplo 4: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 136
Figura 5.15 – Aplicação da técnica HDR/Tone Mapping - Exemplo 5: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 137
Figura 5.16 – Aplicação da técnica HDR/Tone Mapping - Exemplo 6: (A) Tone Mappingnormal; (B) Imagem HDR; e (C) Tone Mapping resultante.
Capítulo 5. Resultados 138
5.3 Discrete Cosine Transform
O primeiro teste da Discrete Cosine Transform [67] foi para medir o tempo de pro-
cessamento de duas imagens/quadros, como visualizado na Figura 5.17. Como resul-
tado, o “Algoritmo 1” (representado como a técnica padrão da aplicação DCT/IDCT
[62]) processou em média as duas imagens/quadros em 33,3 segundos, enquanto o
“Algoritmo 2” (representado como a técnica apresentada na pesquisa) em 25,7 segun-
dos, com isso, gerou uma economia em tempo de 7,6 segundos.
Figura 5.17 – Comparativo do tempo de processamento na DCT/IDCT: (A) Algoritmo1; e (B) Algoritmo 2.
O segundo teste gerado, é para analisar o perfil em termos de qualidade dos pi-
xels na imagem/quadro, para isso, as duas imagens/quadros (Figura 5.18 e Figura 5.19)
foram matricialmente comparadas a nível de pixel. Para essa análise comparativa fo-
ram utilizadas três placas de vídeo NVIDIA GeForce GTX 1070 Ti e dois processadores
Intel Core i9-8950HK, demorando 16 horas, 07 minutos e 14 segundos para conclusão.
Como resultado, o “Algoritmo 2” atingiu em média 98% de qualidade e precisão nos
pixels gerados, enquanto o “Algoritmo 1” atingiu 91%.
Capítulo 5. Resultados 139
Figura 5.18 – Comparativo na qualidade da imagem/quadro usando DCT/IDCT -Exemplo 1: (A) Original; (B) Algoritmo 1; e (C) Algoritmo 2.
Capítulo 5. Resultados 140
Figura 5.19 – Comparativo na qualidade da imagem/quadro usando DCT/IDCT -Exemplo 2: (A) Original; (B) Algoritmo 1; e (C) Algoritmo 2.
Capítulo 5. Resultados 141
O terceiro teste realizado foi a nível de histograma, comparando as duas ima-
gens/quadros (Figura 5.18 e Figura 5.19), como visualizado na Figura 5.20, classifi-
cando o “Algoritmo 2” como melhor a nível de qualidade de histograma, apresentando
em cada camada RGB um número maior de pixels localizados na zona de tons médios.
O “Algoritmo 1”, por sua vez, teve uma concentração maior de pixels nas zonas de
sombras e luzes altas.
Figura 5.20 – Comparativo do histograma das imagens/quadros com DCT/IDCT: (A)Algoritmo 1; e (B) Algoritmo 2.
O quarto teste realizado foi a visualização gráfica dos sessenta e quatro pixels ini-
ciais da Figura 5.18 em cada fase da DCT/IDCT, aplicados com a técnica apresentada
na pesquisa, comprovando que a imagem/quadro original que foi aplicado a DCT, de-
pois de recuperar do armazenamento em banco de dados e aplicado a IDCT, voltou
em quase 100% de igualdade, como visualizado na Figura 5.21.
Capítulo 5. Resultados 142
Figura 5.21 – Gráficos das etapas dos pixels na DCT/IDCT.
Capítulo 5. Resultados 143
O último teste realizado foi a demonstração/aplicação de duas imagens/qua-
dros (Figura 5.22 e Figura 5.23), inserindo a IDCT na fase de armazenamento do banco
de dados, podendo ser visualizado com dimensões de 4x2px à 2048x1024px. No caso,
as duas aplicações (JavaScript e Java) utilizam as dimensões de 32x16 para armazenar
no BD (que tem um tamanho médio de 1,55Kb, muito menor do que o tamanho da
imagem/quadro original que tem em média 3,5Mb), já que de todos os testes feitos fo-
ram o de melhor proporção, gerando resultado de quase 100% com a imagem/quadro
original.
Figura 5.22 – Aplicação da técnica DCT/IDCT - Exemplo 1.
Capítulo 5. Resultados 144
Figura 5.23 – Aplicação da técnica DCT/IDCT - Exemplo 2.
145
6 Conclusão
Em síntese, a pesquisa avalia o impacto na qualidade, tempo de processamento
e o armazenamento de três técnicas/algoritmos desenvolvidas para o processamento
digital de imagem/vídeo, que são: Partial Differential Equation, High Dynamic Range e
Discrete Cosine Transform, com o uso máximo dos processadores (Central Process Unit e
Graphics Processing Unit) e das threads. Para isso, foram criados modelos matemáticos e
análises precisas dos pixels, baseado em sua matriz de vizinhança.
Sendo assim, as três técnicas/algoritmos desenvolvidas na pesquisa tiveram re-
sultados melhores comparados aos modelos convencionais. Esse novo modelo permite
a busca dos melhores pixels de forma matricial, permitindo que os pixels da vizinhança
sejam padronizados, além do uso do histograma para avaliar a melhor posição dos
pixels nas áreas médias.
Essa padronização é baseada na técnica MSAA (MultiSample Anti-Aliasing), no
qual cria um processo inteligente de renderização de múltiplas cópias de cada pixel e a
interpolação entre eles, recebendo um ganho de qualidade em até 2,3%.
Em relação aos ganhos das três técnicas/algoritmos desenvolvidas (Partial Dif-
ferential Equation, High Dynamic Range e Discrete Cosine Transform), o valor médio do
PSNR (Peak Signal to Noise Ratio) ficou em aproximadamente 8dB, comparando os ga-
nhos de todos os testes feitos nas imagens/quadros durante a pesquisa.
A qualidade das imagens/quadros gerados, teve em média um aumento de 12%
em relação a imagem/quadro original, isso em termos de precisão dos pixels, compa-
rando todos os testes feitos durante a pesquisa, além do ganho significativo em tempo
de execução. Todo o conteúdo será utilizado para trabalhos futuros na área de proces-
samento digital de imagem/vídeo.
146
7 Trabalhos Futuros
7.1 Doutorado
No Doutorado, a área de pesquisa será voltada para animações 3Ds (três dimen-
sões) inteligentes e com alto desempenho no processamento dos dados. A animação
3D é uma das técnicas mais utilizadas para o desenvolvimento de desenhos animados
e produções de cinema. Com a evolução da tecnologia, o modelo digital permitiu a cri-
ação de camadas de cor, além de diferentes ângulos nas animações, sendo esses fatores
fundamentais para o desenvolvimento das animações 3Ds, o ponto considerado crítico
para esta tecnologia é o tempo gasto de desenvolvimento das animações [68].
Pelas pesquisas já analisadas na área, é possível extrair informações, utilizando
ferramentas de reconhecimento facial, que possibilitam a obtenção de movimentos fa-
ciais com precisão e qualidade para gerar as futuras animações automaticamente, se
baseando nos movimentos do próprio rosto do intérprete e, em cada frame capturado
é gerado uma varredura de análises matemáticas para o aprendizado da “máquina”
através da tecnologia de inteligência artificial, por exemplo, deep learning e machine le-
arning. [68].
Sendo assim, para realizar todas as etapas corretamente, é preciso seguir uma
ordem sequencial de passos, o primeiro, é gravar a interpretação do ator, fazendo a
captura de todos os movimentos e expressões da face. Na coleta de cada frame é feito
o uso da inteligência artificial para aprender como cada movimento é realizado sendo
armazenado no banco de dados para posterior uso. O próximo passo é criar uma pré-
modelagem 3D do rosto para dar início a criação do personagem. Por fim, a animação
3D é gerada, automaticamente, a partir dos movimentos feitos pelo seu próprio intér-
prete [68].
147
Referências
[1] G. Câmara, R. C. M. Souza et al., “Spring: Integrating remote sensing and gis by
object-oriented data modelling,” Elsevier - Computers & Graphics, vol. 20, pp. 395–
403, Atlanta, Georgia / USA: Elsevier Ltd, May-June 1996.
[2] A. M. Barbosa, Abordagem Triangular no Ensino das Artes e Culturas Visuais, 1st ed.
Perdizes, São Paulo / Brazil: Cortez Editora, January 2010.
[3] O. Dictionaries, Oxford Dictionary of English, 3rd ed. Oxford, United Kingdom /
England: OUP Oxford, July 2010.
[4] W. K. Guthrie, The Greek Philosophers: From Thales to Aristotle, 1st ed. New York
City, New York / USA: Harper & Row, August 1975.
[5] J. Marenbon, Medieval Philosophy: An Historical and Philosophical Introduction,
1st ed. Abingdon-on-Thames, United Kingdom / England: Routledge, November
2006.
[6] E. Pound, Hugh Selwyn Mauberley, 1st ed. Fulton, Missouri / USA: Ovid Press,
September 1920.
[7] C. T. Harrison, Bacon, Hobbes, Boyle and the Ancient Atomists, 15th ed. Cambridge,
Massachusetts / USA: Harvard University Press, July 1933.
[8] A. P. Martinich, F. Allhoff, and A. J. Vaidya, Early Modern Philosophy: Essential Re-
adings with Commentary, 1st ed. Hoboken, New Jersey / USA: Wiley-Blackwell,
January 2007.
[9] I. Kant, Crítica da razão pura, 4th ed. Petrópolis, Rio de Janeiro / Brazil: Editora
Vozes Ltda, January 2012.
[10] R. Gonzalez and P. Woods, Digital Image Processing, 3rd ed. New York City, New
York / USA: Pearson, June 2007.
Referências 148
[11] J. Bezerra, “Revolução industrial,” https://www.todamateria.com.br/revolucao-
industrial/, November 2018.
[12] C. B. Silveira, “O que é indústria 4.0?” https://www.citisystems.com.br/industria-
4-0/, November 2018.
[13] B. Jähne, Digital Image Processing, 1st ed. Tiergartenstraße, Heidelberg / Ger-
many: Springer-Verlag Berlin Heidelberg, April 2005.
[14] T. Acharya and A. K. Ray, Image Processing: Principles and Applications, 1st ed. Ho-
boken, New Jersey / USA: John Wiley & Sons, September 2005.
[15] R. E. Woods and R. C. Gonzalez, Digital Image Processing, 2nd ed. Upper Saddle
River, New Jersey / USA: Prentice Hall, April 1992.
[16] A. N. Rencz and R. A. Ryerson, Remote Sensing for the Earth Sciences, 3rd ed. Ho-
boken, New Jersey / USA: John Wiley & Sons, July 1999.
[17] D. Forsyth and J. Ponce, Computer Vision: A modern approach, 2nd ed. New York
City, New York / USA: Pearson, November 2001.
[18] C. D. Hansen and C. R. Johnson, The Visualization Handbook, 1st ed. Cambridge,
Massachusetts / USA: Academic Press, December 2004.
[19] “Instituto nacional de metrologia, qualidade e tecnologia - inmetro, sistema inter-
nacional de unidades - si,” http://www4.inmetro.gov.br/, August 2019.
[20] J. Serra, Image Analysis and Mathematical Morphology, 1st ed. Lincoln, United King-
dom / England: Academic Press, December 1982.
[21] J. C. Russ, The Image Processing Handbook, 6th ed. Boca Raton, Florida / USA:
CRC Press, April 2011.
[22] D. Flanagan, JavaScript: The Definitive Guide, 1st ed. Sebastopol, California / USA:
O’Reilly Media, June 2011.
Referências 149
[23] S. Oaks, Java Performance: The Definitive Guide: Getting the Most Out of Your Code,
1st ed. Sebastopol, California / USA: O’Reilly Media, May 2014.
[24] J. Duckett, HTML and CSS: Design and Build Websites, 1st ed. Hoboken, New
Jersey / USA: Wiley, November 2011.
[25] M. S. Silva, Fundamentos de HTML5 e CSS3, 1st ed. Santa Terezinha, São Paulo /
Brazil: Novatec, June 2015.
[26] J. Duckett, JavaScript and Jquery: Interactive Front-End Web Development, 1st ed. Ho-
boken, New Jersey / USA: Wiley, June 2014.
[27] B. Eisenman, Learning React Native: Building Native Mobile Apps with JavaScript,
2nd ed. Sebastopol, California / USA: O’Reilly Media, April 2017.
[28] S. Powers, Learning Node: Moving to the Server-Side, 2nd ed. Sebastopol, California
/ USA: O’Reilly Media, May 2016.
[29] L. Bassett, Introdução ao JSON: Um Guia Para JSON que vai Direto ao Ponto, 1st ed.
Santa Terezinha, São Paulo / Brazil: Novatec, September 2015.
[30] D. R. F. Izario, Y. Iano et al., “Development of a Digital Image Processing Web Tool
for a Monitoring System Relying on an Unmanned Ground Vehicle,” Proceedings
of the 3rd Brazilian Technology Symposium, vol. 1, pp. 111–116, New York City, New
York / USA: Springer International Publishing, April 2018.
[31] “Ffmpeg,” https://www.ffmpeg.org/, October 2018.
[32] S. G. de Oliveira and J. T. de Assis, “A Methodology for Identification of Finger-
prints based on Gabor Filter,” IEEE Latin America Transactions, vol. 4, New York
City, New York / USA: IEEE, March 2006.
[33] B. Bhanu and X. Tan, Computational Algorithms for Fingerprint Recognition, 1st ed.
New York City, New York / USA: Springer, June 2004.
Referências 150
[34] J. Serra, “Introduction to mathematical morphology,” Journal Computer Vision,
Graphics and Image Processing, vol. 35, pp. 283–305, San Diego, California / USA:
Academic Press Professional, Inc, April 1986.
[35] T. Zemel, “Filtros css3,” http://desenvolvimentoparaweb.com/ css/filtros-css3/,
October 2018.
[36] P. Graham, On Lisp, 1st ed. Upper Saddle River, New Jersey / USA: Prentice
Hall, June 1993.
[37] M. Shokeen, “Editando imagens no css: Filtros,”
https://code.tutsplus.com/pt/tutorials/editing-images-in-css-filters–cms-
25948, October 2018.
[38] D. R. F. Izario, I. M. de Oliveira et al., “UGV Solutions: Processamento digital de
imagem/vídeo e sensoriamento utilizando PLX-DAQ,” Artigo de TCC (Graduação -
Engenharia de Computação), pp. 1–23, Santa Rita do Sapucaí, Minas Gerais / Brazil:
Instituto Nacional de Telecomunicações - INATEL, April 2017.
[39] A. Yadav and P. Yadav, Digital Image Processing, 1st ed. Darya Ganj, New Delhi
/ India: Laxmi Publications Pvt Ltd, December 2009.
[40] W. Burger, Principles of Digital Image Processing: Core Algorithms, 1st ed. New York
City, New York / USA: Springer, July 2009.
[41] D. R. F. Izario, Y. Iano et al., “Técnicas de suavização para eliminação de ruídos e
detecção de bordas em imagens,” BTSym 2017 Proceedings, vol. 1, Campinas, São
Paulo / Brazil: Brazilian Technology Symposium - BTSym, April 2017.
[42] D. Izario, Y. Iano et al., “Técnicas de processamento digital de imagem (High-
Dynamic Range),” BTSym 2018 Proceedings, vol. 1, Campinas, São Paulo / Brazil:
Brazilian Technology Symposium - BTSym, December 2018.
[43] R. Concepcion, The HDR Book: Unlocking the Pros’ Hottest Post-Processing Techni-
ques, 1st ed. San Francisco, California / USA: Peachpit Press, July 2011.
Referências 151
[44] P. E. Debevec and J. Malik, “Recovering high dynamic range radiance maps from
photographs,” Special Interest Group on Computer Graphics and Interactive Techni-
ques, vol. 1, New York City, New York / USA: SIGGRAPH ACM, August 2008.
[45] K. Herrmann, “HDR Before-and-After,” https://farbspiel-photo.com/learn/hdr-
before-and-after, October 2018.
[46] F. McCollough, “What is HDR Photography?” http://www.hdr-
photography.com/articles/ what_is_hdr_photography.php, October 2017.
[47] Macphun, “Tone Mapping in HDR. What It is and How to Use It?”
https://macphun.com/blog/what-is-tone-mapping, October 2017.
[48] D. R. F. Izario, Y. Iano et al., “Edge-Detection Noise-Smoothing Image Filter Tech-
niques,” Proceedings of the 3rd Brazilian Technology Symposium, vol. 1, pp. 117–122,
New York City, New York / USA: Springer International Publishing, April 2018.
[49] M. Boaventura, C. A. Z. Barcelos, and E. C. S. Jr., “A well-balanced flow equa-
tion for noise removal and edge detection,” IEEE Transactions on Image Processing,
vol. 12, pp. 751–763, Hoboken, New Jersey / USA: IEEE Xplore, July 2003.
[50] C. A. Z. Barcelos, M. Boaventura, and E. C. S. Jr., “Edge detection and noise re-
moval by use of a partial differential equation with automatic selection of para-
meters,” Computational & Applied Mathematics, vol. 24, Petrópolis, Rio de Janeiro /
Brazil: Sociedade Brasileira de Matemática Aplicada e Computacional, April 2005.
[51] E. H. Land and J. J. McCann, “Lightness and Retinex Theory,” Journal of the Optical
Society of America, vol. 61, pp. 1–11, Washington, District of Columbia / USA: OSA
Publishing, December 1971.
[52] L. M. Surhone, M. T. Timpledon, and S. F. Marseken, Weber-Fechner Law: Stimu-
lus, Quantitative Research, Gustav Fechner, Ernst Heinrich Weber, Constant of Integra-
tion, Natural Logarithm, 1st ed. Saarbrücken, Saarland / Germany: Betascript
Publishing, August 2010.
Referências 152
[53] F. Garrett, “Saiba o que é processador e qual sua função,”
https://www.techtudo.com.br/artigos/noticia/2012/02/o-que-e-
processador.html, October 2018.
[54] Y. Pacievitch, “Processador,” https://www.infoescola.com/informatica/proces
sador/, November 2018.
[55] “Significado de cpu,” https://www.significados.com.br/cpu/, November 2018.
[56] W. W. Hwu, GPU Computing Gems Emerald Edition, 1st ed. Burlington, Massa-
chusetts / USA: Morgan Kaufmann, February 2011.
[57] R. J. da Silva Martins, “Coastline Watch - Processamento de imagens com GPU em
algoritmos de monitorização da linha da costa,” Faculdade de Ciências e Tecnologia,
vol. 1, Lisbon, Lisbon / Portugal: Universidade Nova de Lisboa, September 2015.
[58] F. M. Q. Pereira, “Técnicas de Otimização de Código para Placas de Processa-
mento Gráfico,” Universidade Federal de Minas Gerais, vol. 1, Belo Horizonte, Minas
Gerais / Brazil: Departamento de Ciência da Computação - DCC, May 2018.
[59] “Intel,” https://www.intel.com.br/content/www/br/pt/homepage.html, Octo-
ber 2018.
[60] “NVIDIA GeForce,” https://www.nvidia.com/pt-br/geforce/, October 2018.
[61] A. Miller, S. Halloway, and A. Bedra, Programming Clojure, 3rd ed. Raleigh, North
Carolina / USA: Pragmatic Bookshelf, March 2018.
[62] K. R. Rao and P. Yip, Discrete Cosine Transform: Algorithms, Advantages and Applica-
tions, 1st ed. Cambridge, Massachusetts / USA: Academic Press, June 1990.
[63] D. R. F. Izario, Y. Iano et al., “Digital Image Processing with Data Storage for Se-
curity Applications,” Proceedings of the 3rd Brazilian Technology Symposium, vol. 1,
pp. 103–109, New York City, New York / USA: Springer International Publishing,
April 2018.
Referências 153
[64] S. Fulton and J. Fulton, HTML5 Canvas: Native Interactivity and Animation for the
Web, 2nd ed. Sebastopol, California / USA: O’Reilly Media, November 2013.
[65] L. Thomson and L. Welling, PHP and MySQL Web Development, 5th ed. Boston,
Massachusetts / USA: Addison-Wesley Professional, June 2016.
[66] C. Technology, SQL QuickStart Guide: The Simplified Beginner’s Guide to SQL, 1st ed.
Albany, New York / USA: ClydeBank Media LLC, June 2015.
[67] D. R. F. IZARIO, Y. IANO et al., “Technical review on digital image/video pro-
cessing algorithms,” SET International Journal of Broadcast Engineering, pp. 34–39,
São Paulo, São Paulo / Brazil: SET International Journal of Broadcast Engineering,
December 2018.
[68] D. IZARIO, Y. IANO et al., “Face recognition techniques using artificial intelli-
gence for audio-visual animations,” SET International Journal of Broadcast Enginee-
ring, pp. 78–82, São Paulo, São Paulo / Brazil: SET International Journal of Broad-
cast Engineering, December 2017.
Apêndices
155
APÊNDICE A – Publicações do Autor
Artigos completos publicados em periódicos:
1. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; CASTRO, D. A. P.. Technical review on di-
gital image/video processing algorithms. SET International Journal of Broadcast Engineering,
p. 34-39, 2018. [ISSN Print: 2446-9246]. [ISSN Online: 2446-9432]. [doi:10.18580/setijbe
.2018.4].
2. CASTRO, D. A. P.; IANO, Y.; CARDOSO, P. E. R.; BARBIERI, R. O.; IZARIO, D. R. F.;
CHUMA, E. L.; CARVALHO, S. M.. A Technical Study on Cooperative Structure of a Hy-
brid Network for Video Content Delivery. SET International Journal of Broadcast Engineering,
p. 17-22, 2018. [ISSN Print: 2446-9246]. [ISSN Online: 2446-9432]. [doi:10.18580/setijbe
.2018.2].
3. IZARIO, D. R. F.; IZARIO, B. R. F.; CASTRO, D. A. P.; IANO, Y.. Face recognition te-
chniques using artificial intelligence for audio-visual animations. SET International Journal of
Broadcast Engineering, p. 78-82, 2017. [ISSN Print: 2446-9246]. [ISSN Online: 2446-9432].
[doi:10.18580/setijbe.2017.11].
4. CASTRO, D. A. P.; IANO, Y.; CARDOSO, P. E. R.; CABELLO, F.; LEÓN, J.; BARBIERI,
R. O.; IZARIO, D. R. F.; IZARIO, B. R. F.. A Technical Study on the Transmission of HDR
Content over a Broadcast Channel. SET International Journal of Broadcast Engineering, p. 29-
35, 2017. [ISSN Print: 2446-9246]. [ISSN Online: 2446-9432]. [doi:10.18580/setijbe.2017.4].
Capítulos de livros publicados:
1. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; MARINS, C. N. M.. Estudo do aqueci-
mento de um Raspberry Pi 3 em manipulação de imagem e implementação de sistema
térmico. As Ciências Exatas e da Terra no Século XXI. 1ed. Ponta Grossa/PR: Atena
Editora, 2019, v. 1, p. 72-82. [ISBN: 978-85-7247-351-4]. [doi:10.22533/at.ed.514192405].
APÊNDICE A. Publicações do Autor 156
2. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; CASTRO, D. A. P.. Digital Image Proces-
sing with Data Storage for Security Applications. Proceedings of the 3rd Brazilian Technology
Symposium. 1ed. New York/United States: Springer International Publishing, 2019, v. 1, p.
103-109. [ISBN Print: 978-3-319-93111-1]. [ISBN Online: 978-3-319-93112-8]. [doi:10.1007
/978-3-319-93112-8_11].
3. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; MAGALHAES, L. P.; CASTRO, D. A. P..
Development of a Digital Image Processing Web Tool for a Monitoring System Relying on an
Unmanned Ground Vehicle. Proceedings of the 3rd Brazilian Technology Symposium. 1ed. New
York/United States: Springer International Publishing, 2019, v. 1, p. 111-116. [ISBN Print:
978-3-319-93111-1]. [ISBN Online: 978-3-319-93112-8]. [doi:10.1007/978-3-319-93112-8_
12].
4. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; CASTRO, D. A. P.; MARINS, C. N.
M.. Edge-Detection Noise-Smoothing Image Filter Techniques. Proceedings of the 3rd Brazi-
lian Technology Symposium. 1ed. New York/United States: Springer International Publishing,
2019, v. 1, p. 117-122. [ISBN Print: 978-3-319-93111-1]. [ISBN Online: 978-3-319-93112-
8]. [doi:10.1007/978-3-319-93112-8_13].
5. ESTRELA, V. V.; HEMANTH, J.; SAOTOME, O.; GRATA, E. G. H.; IZARIO, D. R.
F.. Emergency Response Cyber-Physical System for Flood Prevention with Sustainable Electro-
nics. Proceedings of the 3rd Brazilian Technology Symposium. 1ed. New York/United States:
Springer International Publishing, 2019, v. 1, p. 319-328. [ISBN Print: 978-3-319-93111-1].
[ISBN Online: 978-3-319-93112-8]. [doi:10.1007/978-3-319-93112-8_33].
6. IZARIO, D. R. F.; MARINS, C. N. M.. UGV Solutions: UGVs e suas aplicações para
cidades inteligentes. Gestão da Produção em Foco. 1ed. Belo Horizonte/MG: Pois-
son, 2018, v. 19, p. 157-171. [ISBN: 978-85-93729-95-9]. [doi: 10.5935/978-85-93729-95-
9.2018B001].
Trabalhos completos publicados em anais de congressos:
1. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; MARINS, C. N. M.. Estudo do aqueci-
APÊNDICE A. Publicações do Autor 157
mento de um Raspberry Pi 3 em manipulação de imagem e implementação de sistema
térmico. Incitel - Congresso de Iniciação Científica do Inatel. Anais do Congresso de
Iniciação Científica do Inatel - Incitel. Santa Rita do Sapucaí/MG: INATEL, 2018. p.
84-88. [ISSN: 2359-6457].
2. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; MARINS, C. N. M.. Técnicas de pro-
cessamento digital de imagem (High-Dynamic Range). Brazilian Technology Symposium -
BTSym. BTSYM 2018 Proceedings. Campinas/SP: BTSym, 2018. v. 1. [ISSN: 2447-8326].
3. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; MARINS, C. N. M.. Técnicas para se-
gurança em aplicações web - baseado em message-digest algorithm. Incitel - Congresso
de Iniciação Científica do Inatel. Anais do Congresso de Iniciação Científica do Inatel -
Incitel. Santa Rita do Sapucaí/MG: INATEL, 2018. p. 162-166. [ISSN: 2359-6457].
4. IZARIO, D. R. F.; MAGALHAES, L. P.; MARINS, C. N. M.. UGVs e suas aplica-
ções para Cidades Inteligentes. Simpósio de Excelência em Gestão e Tecnologia - SE-
GeT. XIV SEGeT - Simpósio de Excelência em Gestão e Tecnologia. Resende/RJ: AEDB,
2017. p. 29-29. [ISSN: 2448-2676].
5. IZARIO, D. R. F.; IANO, Y.; IZARIO, B. R. F.; CASTRO, D. A. P.; MARINS, C. N.
M.. Técnicas de suavização para eliminação de ruídos e detecção de bordas em ima-
gens. Brazilian Technology Symposium - BTSym. BTSYM 2017 Proceedings. Campinas/SP:
BTSym, 2017. v. 1. [ISSN: 2447-8326].
6. IZARIO, D. R. F.; OLIVEIRA, I. M.; MAGALHAES, L. P.; ANDRADE, S. C.; MA-
RINS, C. N. M.. Bender - UGV. FETIN - Feira Tecnológica do Inatel. Revista Inatel.
Santa Rita do Sapucaí/MG: Inatel, 2017. v. 4. p. 26-27. [ISSN: 2316-5286].
7. IZARIO, D. R. F.; GONCALVES, E. D. C.; BRANCALHONE FILHO, J. L.; AN-
DRADE, S. C.; MARINS, C. N. M.. FisioGlove. FETIN - Feira Tecnológica do Inatel.
Revista Inatel. Santa Rita do Sapucaí/MG: Inatel, 2015. v. 3. p. 58-59. [ISSN: 2316-5286].
8. IZARIO, D. R. F.; TELLES, P. H. L. S.; MARINS, C. N. M.. Implementação de rotina
em MatLab para simulação no projeto de antenas. Incitel - Congresso de Iniciação Ci-
entífica do Inatel. Anais do Congresso de Iniciação Científica do Inatel - Incitel. Santa
Rita do Sapucaí/MG: Inatel, 2015. p. 204-207. [ISSN: 2359-6457].
9. IZARIO, D. R. F.; TELLES, P. H. L. S.; ANDRADE, S. C.; BORGES, S. M.; MARINS,
APÊNDICE A. Publicações do Autor 158
C. N. M.. As Aventuras de Inatelzinho II. FETIN - Feira Tecnológica do Inatel. Revista
Fetin. Santa Rita do Sapucaí/MG: Inatel, 2014. v. 3. p. 10-11. [ISSN: 2316-5286].
10. IZARIO, D. R. F.; TELLES, P. H. L. S.; BOAVIDA, H. G. C.; JORGE, G. F.; MARINS,
C. N. M.. As Aventuras de Inatelzinho. FETIN - Feira Tecnológica do Inatel. Revista
Inatel. Santa Rita do Sapucaí/MG: Inatel, 2013. v. 2. p. 8-9. [ISSN: 2316-5286].
11. IZARIO, D. R. F.; TELLES, P. H. L. S.; SOUSA, M. C.; SILVA, B. L.; GOMES, E. L. B..
Sarfex Software. FETIN - Feira Tecnológica do Inatel. Revista Fetin. Santa Rita do Sapu-
caí/MG: Inatel, 2012. v. 1. p. 32-33. [ISSN: 2316-5286].
Resumos publicados em anais de congressos:
1. IZARIO, D. R. F.; NOVAIS, F. R. M. A. P.; FREITAS, W. V. P.; MATIAS, N. T.; RI-
BEIRO, R. B.. Eu Jovem, em Busca da Profissão. VI Encontro de Iniciação Científica e
IV Mostra de Pós Graduação - UNIFATEA. Lorena/SP: ISPIC - Instituto Superior de
Pesquisa e Iniciação Científica, 2009. [ISBN: 85-99189-06-9].