tarsusmagnus@gmail.com
Este projeto foi realizado como trabalho de conclusão para o curso Introdução ao Processamento de Imagens, do primeiro período de do ano de 2013 do curso de mestrado em Engenharia de Sistemas da COPPE - UFRJ, ministrado pelo professor Ricardo Marroquim.
A escolha do assunto e da proposta foi sugestão do próprio professor que, apesar de deixar os alunos livres para a escolha de um projeto, solicitou que algum grupo escolhesse a panografia como tema de projeto pois esta seria uma interessante maneira de estudar algoritimos importantes para a compreensão do assunto do curso.
Panografia é a prática de montagem de imagens distintas que, unidas, formam uma imagem maior, contínua, como é ilustrado abaixo.
A panografia é usada em diversas áreas, da cartografia às artes plásticas. Nasceu de trabalhos manuais, onde técnicos e artistas realizavam as colagens e montavam "no olho" as imagens.
Com o advento da computação, em especial das técnicas de computação gráfica, surgiram programas capazes de reproduzir estas tarefas e ajudar na composição, com maior ou menor grau de intervenção manual.
Como se pode afirmar a informática potencializa estas técnicas e consegue unir imagens a partir de uma infinidade de pedaçoes menores sem intervenção direta da habilidade manual e produzir rapidamente incríveis resultados.
Um exemplo simpeles, mas que resume a importância das aplicações da panografia, é a montagem de imagens aéreas na produção de mapas que, apesar de parecerem contínuos e sem interrupção são, de fato, a união de diversas outras imagens menores, obtidas em sobrevôos de avião ou de satélites, que são justapostas em sequência até que se forme uma imagens contínua e sem vestígios de união.
Há diversas técnicas para implementar programas que produzam resultados panográficos automaticamente. Todas partem do princípio da detecção e seleção de pontos importantes na imagem - arestas e cantos que definem contornos. Uma rápida busca na Internet nos apresenta uma diversidade deles.
Para a realização deste projeto, sob a orientação do professor Marroquim e baseado no trabalho realizado em 2012 pelo aluno Vítor Silva Souza que apresentou para esta disciplina trabalho desenvolvido sobre o mesmo tema, utilizaremos o seguinte fluxograma para o funcionamento do sistema.
Para simplificar as ações e, consequentemente a complexidade do projeto, o primeiro passo é dessaturar as imagens, reduzindoas informações dos pixels em uma sequencia de 256 tons de cinza, do branco ao preto. Para isto foi utilizada uma conta balanceada de acordo com a fórmula:
I = 0.59*R + 0.3*G + 0.11*B;Sendo I o valor resultante (em escala de cinza) R, G e B as componentes vermelho, verde e azul, respectivamente.
Com o objetivo de desvalorizar vértices e arestas menos interessantes, foi passado pela imagem um filtro de média, onde a partir de uma janela 3x3 não balanceada convolucionada sobre a malha de pixels da imagem, cada pixel assumiu a média dos valores dele e dos vizinhos.
Foi implementado o algoritmo de Harris & Stephens / Plessey / Shi–Tomasi, onde foram computados os somatórios dos quadrados das diferenças, vertical e horizontal, balanceadas por valores baseados no triângulo de Pascal em uma máscara de 3x3 pixels (vizinhos). Desta soma obteve-se um índice I (Ix, Iy) que foi aplicado a uma matrix com a fórmula:
[[Ix2, Ix*Iy] [Ix*Iy, Iy2]]Desta matriz, é calculado um fartor H (Harris) através da fórmula:
H = Det(A) + 0.06*Traço(A)2;Este valor é um índice que, dependendo das condições da imagem, atinge valores de diversas ordens, então, deve-se estabelecer um parâmetro F para realizar uma seleção dos valores mais altos, que são os desejados "feature points". Neste projeto foi estabelecido
H > 109;
Foi realizado (redundantemente) o cálculo das raízes das diferenças entre o quadrados dos valores obtidos e mais uma vez estabelecido um fator de corte para realizar-se a identificação dos pontos com potencial de igualdade. No caso, o estabelecido foi:
SSD < 5;Um detalhe importante a ser oservado, e que será melhor explicado nas conclusões, foi o motivo da redundância de alguns cálculos neste processo.
Para efetuar o deslocamento das imagens para as posições corretas foi feita a interpolação dos pontos de cada nuvem encontrada e assim obter os valores dos deslocamentos horizontal e vertical das imagens.
O opção pela implementação nas lingragens HTML 5 (com estilos CSS) + JavaScript se deu primeiramente pela familiaridade com as linguagens, o que, em tese, facilitaria a implementação e permitiria o foco no estudo e compreensão dos algoritimos utilizados.
Outro aspecto importante é que esta tríade é interpretada por diversos navegadores, em diversas plataformas, e isto facilita a apresentação de um protótipo, que, em tese, disponibilizado na Internet, estará acessível a quaquer pessoa que visite seu endereço, com acesso também ao seu código fonte.
Por outro lado, de antemão era sabido que a tecnologia que permite o acesso aos pixels de uma imagem envolvendo o Javascript (através da tag CANVAS, do HTML5) ainda é muito insipiente e, apesar de promissora, não funciona perfeitamente em todos os navegadores. Espera-se que, em breve, seja uma realidade. Ao menos é o que apontam as previsões.
Por fim, para uma avaliação inicial, por se tratar de uma linguagem interpretada, simples e desprovida de recursos de baixo nível de abstração, como a tipificação minuciosa de variáveis, não se pode esperar um bom desempenho nas operações, especialmente em se tratando de leituras de pixels, convoluções e aplicação de inúmeras operações exaustivas de potenciação, radiciação e outras. Espara-se que a flexibilidade na implementação suplante estas carências e faça valer a pena esta opção.
O desejo inicial para o projeto era que ele funcionasse eficientemente para quaisquer imagens, fotografadas em posições diferentes e sem muita precservação alngular. Como as demonstradas abaixo.
Já nos primeiros experimentos, isto se mostrou improdutivo. Para início de implementação, foi decidido experimentar com imagens resultantes de recortes de uma imagem única, maior.
O Javascript, apesar das diversas vantagens ligadas à facilidade de implementação e divulgação do experimento, cobra seu preço no baixo desempenho da aplicacão. Por isto, foi decidido usar imagens pequenas, o que facilitou o precesso de testes e implementação do código.
Nos primeirs experimentos, foram usadas imagens com variações horizontais, apenas. Após sucesso nos resultados é que foram experimentadas imagens com pequenas variações angulares.
Por fim, para experimento do algoritimo final, foram usadas imagens que variavam na horizontal e vertical, mas sem nenhum giro.
Apesar dos percalços iniciais, o resultado obtido foi surpreendentemente bom, de acordo com as limitações propostas.
As limitações de desempenho da linguagem foram um desafio constante no desenvolvimento do projeto. Cada linha de código precisava ser concisa e eficiente, apesar da simplicidade que o Javascript oferece - justamente por este motivo - sua interpretação pode ser penosa para os navegadores e a implementação ótima de algoritimos que tratam de convoluções de matrizes quadradas sobre uma malha da ordem de parcos milhares de pixels transforma o que a princípio seria um trabalho modesto para os computadores atuais em uma hercúlea tarefa.
Outro aspecto importante, que dificultou em demasia o desempenho foi a implementação em mais de uma etapa de cálculos complicados envolvendo raízes e potenciação que poderiam ser experimentados guardados e reutilizados em mais de uma etapa. O filtro de Sobel poderia muito bem ser exprimentado com substituto do SSD na etapa de comparação dos pontos. Para efeito de desempenho e, até mesmo, organização da estrutura do código, poderia ter sido preparada uma estrutura sob medida para preparar e guardar matrizes contendo estes valores, que poderiam ser experimentados mais uma vez, pelo menos, na etapa de comparação dos pontos detectados como importantes na imagem. O objeto ImageData do Javascript, que foi extensivamente usado no código, acumula as informações de cor (e alpha) das imagens em um vetor de valores inteiros (0 a 255) que não aceita nnúmeros do tipo "ponto flutuante". Desta maneira, acumular resultados deste tipo, na referida estrutura se torna deficitário.
A implementação de um objeto específico de modo que se pudesse experimentar esta possibilidade, devido ao prazo para a entrega do projeto, não foi feita.
O que se pode resumir sobre a experiência obtida neste trabalho é que a tecnologia é promissora e, apesar das limitações apresentadas, pode vir a ser um ambiente promissor para implementação de sistemas que funcionem via Web facilitando o acesso de pessoas comuns a serviços do tipo.
O resultado do experimento pode ser visualizado no link http://www.tarsusmagnus.com.br/mestrado/panografia/panografia.html. Para visualizar o código, use a opção "exibir código fonte" (ou semelhante) do seu navegador.
WikiPedia: Método dos mínimos quadrados. Disponível em: http://pt.wikipedia.org/wiki/M%C3%A9todo_dos_m%C3%ADnimos_quadrados. Visitado em: 17/06/2013.
WikiPedia: Corner detection. Disponível em: http://en.wikipedia.org/wiki/Corner_detection. Visitado em: 18/06/2013.
SOUZA, Vítor Silva. Trabalho Final de Processamento de Imagens: Panografia. Disponível em: http://www.lcg.ufrj.br/Cursos/cos756/trabalhos-2012/Panografia.pdf. Visitado em: 15/06/2013.