Caixa de ferramentas de processamento de imagens para Numerical Python Relatório No 1 10 de janeiro de 2001 No do Processo: 00/13671-0 Autor: Orientador: Perı́odo: Alexandre Gonçalves Silva Prof. Dr. Roberto de Alencar Lotufo janeiro de 2001 à janeiro de 2002 Abstract Este trabalho consiste no estudo, desenvolvimento e implementação de uma caixa de ferramentas de processamento de imagens. Para tanto, é utilizada a linguagem Python [1] associada ao pacote de processamento numérico multidimensional chamado Numerical [2], ambos pertencentes à linha “Open Source” de distribuição de software. Python é uma linguagem moderna, interpretada, de “altı́ssimo” nı́vel, orientada a objetos, bastante eficiente e apropriada para o desenvolvimento rápido de aplicações. A caixa de ferramentas é elaborada utilizando-se as ferramentas do projeto Adesso [3] de desenvolvimento de software de computação cientı́fica. 1 Introdução A intenção deste relatório é descrever as atividades desenvolvidas e os resultados alcançados nesta pesquisa, decorrido um ano da concessão da bolsa FAPESP. Este texto está organizado da seguinte forma: a Seção 2 apresenta um resumo do plano de trabalho; a Seção 3 faz uma apanhado geral do que fora realizado neste perı́odo; na Seção 4, tem-se os resultados obtidos até agora; na Seção 5, são feitas considerações sobre o andamento e futuro do projeto; as conclusões são feitas na Seção 6; e finalmente, são listadas as referências bibliográficas utilizadas. 2 Proposta inicial Existem hoje em dia diversas ferramentas computacionais apropriadas para processamento de imagens tanto comerciais como gratuitas. Entre elas podemos citar Khoros, MATLAB, Mathematica, VisiLog, PV-WAVE, AVS, IDL, ImageMagick, entre outras. Existem também esforços nacionais para o desenvolvimento de ferramentas similares: PhotoPix [4]. 1 Entre 1991 e 1997 o DCA-FEEC-UNICAMP adotou a plataforma Khoros. Este é um ambiemte apropriado para processamento de imagens constituindo de uma programação visual bastante atrativa para iniciantes na área, além de oferecer um sistema de ajuda de autoria de software, permitindo sua extensão para novas funções dentro do contexto de caixa de ferramentas. No DCA foram desenvolvidas três caixa de ferramentas: V3DTOOLS [5] de processamento e visualização tridimensional; MMACH de Morfologia Matemática [6]; e DIPCOURSE de ensino de processamento de imagens [7] [8]. Este último foi o primeiro curso de processamento de imagens disponı́vel na internet. Porém, o grupo de desenvolvimento do Khoros enfrentou problemas internos e não acompanhou os avanços tecnológicos de software e, ao mesmo tempo, houve uma polı́tica de venda. Outras desvantagens do Khoros são: pouca documentação e de baixa qualidade; dificuldade de instalação; dificuldade de criação de novas funções, e de ser dedicado a problemas de processamento de imagens, apesar dos esforços do grupo para considerá-lo como ambiente genérico de desenvolvimento de software. Em conseqüência, o Khoros deixou de ser adotado no DCA como ferramenta preferencial, dando lugar ao MATLAB. Já foram desenvolvidas várias caixas de ferramentas nesta plataforma, sendo uma delas repassada à indústria dentro do projeto Softex [9]. O MATLAB é um ambiente genérico de computação cientı́fica muito difundido nos cursos de Engenharia, apresenta uma linguagem matricial extremamente simples, compacta e muito próxima da notação matemática, e possui uma comunidade bastante grande. Sua maior desvantagem é seu alto custo. Poucas instituições têm condições de adquiri-lo. Outra desvantagem seria a falta de ferramentas de autoria de caixa de ferramentas. Apesar de ser muito fácil criar um conjunto de funções voltadas a um problema, não existe nenhum suporte para a geração de documentação para internet, papel, etc. É intenção, a longo prazo, do grupo desenvolver um ambiente computacional que contenha o melhor das duas plataformas. Neste sentido já existe o esforço associado ao projeto Adesso em cooperação com o ITI - Instituto Nacional de Tecnologia da Informação. A idéia deste projeto é integrar a linguagem Python ao sistema Adesso permitindo que as bibliotecas hoje disponı́veis no MATLAB [10] e no Tcl/Tk [11] estejam também disponı́veis ao Python (transformação wrapper). Ao mesmo tempo, o Adesso será usado para o desenvolvimento de uma caixa de ferramentas de processamento de imagens a ser usada como plataforma aberta de pesquisa e ensino, contendo as principais funções e diversos exemplos e demonstrações. Esta caixa de ferramentas deverá ser distribuı́da gratuitamente para que possa ser compartilhada pelo comunidade acadêmica da área. O sistema Adesso, de autoria de software de computação cientı́fica, é um ambiente de desenvolvimento de componentes onde a maior parte da informção é armazenada em uma base de dados XML [12]. A partir desta organização, código, documentação e produto final podem ser automaticamente gerados utilizando-se a máquina de transformação do Adesso. Esta metodologia permite um menor esforço de manutenção e gerenciamento da informação, consistência na produção de interfaces, flexibilidade na apresentação, no que se refere à forma, do produto, graças ao esquema de folhas de estilos (stylesheets), maior imunidade a erros, entre outras caracterı́sticas. Python tem a flexibilidade de Perl, associado ao poder numérico e facilidade de programação do MATLAB; é disponibilizado em um ambiente “Open Source”, além de ser facilmente estendido para C/C++ através do conceito de API (Application Programmer’s Interface). Em algumas situações, sobretudo quando se trata de algoritmos iterativos, é essencial a programação em linguagem de mais baixo nı́vel para se ter um desempenho de execução aceitável. 2 1o T rimestre 2o T rimestre 3o T rimestre 4o T rimestre 5o T rimestre 6o T rimestre 7o T rimestre 8o T rimestre 1 X 2 X X 3 X X 4 X X 5 6 X X X X X 7 X X X 8 9 10 X X X X X X X X X Table 1: cronograma previsto para o trabalho. 3 Objetivos alcançados A Tabela 1 mostra o cronograma trimestral previsto para o trabalho referente às atividades listadas a seguir. O itens 1, 2, 4, 6, 7, 8, 9 e 10 são atividades já desenvolvidas. Houve, portanto, uma alteração no planejamento inicial sem, no entanto, causar prejuı́zo ao andamento da pesquisa. 1. Estudar a linguagem Python (finalizado) 2. Estudar o pacote Numerical (finalizado) 3. Comparar o ambiente Python/Numerical com o MATLAB e com o Tcl 4. Desenvolver interfaces para biblioteca em C de forma manual (finalizado) 5. Desenvolver código de geração de interface entre a biblioteca C e o Python, integrando-o no ambiente Adesso 6. Especificar as funções disponı́veis na caixa de ferramentas de processamento de imagens (finalizado) 7. Estudar e escolher as ferramentas para exibição de imagens e de gráficos (finalizado) 8. Desenvolver as funções de PI da caixa de ferramentas (finalizado) 9. Desenvolver demonstrações associadas à caixa de ferramentas de PI (finalizado) 10. Confeccionar home-page da caixa de ferramentas usando as ferramentas do ambiente Adesso. Esta home-page deverá ser a forma de distribuição e comunicação com os usuários interessados (finalizado) Neste primeiro ano, foi possı́vel se ter uma boa experiência em relação aos ambientes Python, MATLAB e Tcl, mas ainda não foi feita uma comparação mais formal a respeito, sugerida no item 3. Para o término do trabalho é importante dar atenção aos itens 4 e 5. O interfaceamento entre C e Python já foi testado mas ainda resta incluir esta informação no Adesso de modo que este processo seja automatizado. Para isto, algumas particularidades do próprio sistema Adesso devem ser compreendidas. Em relação às disciplinas, já foram cursados os 60 créditos necessários ao mestrado em Engenharia Elétrica da FEEC-UNICAMP. As ementas estudadas foram: • Visão Computacional: Imagens digitais. Dispositivos de exibição e aquisição de imagens. Cor. Transformações espaciais e interpolação em intensidade. Transformadas de imagens. Melhoramento de imagens. Filtros. Segmentação de imagens. Descritores. Reconhecimento de padrões. Aplicações. 3 • Análise de Imagens por Morfologia Matemática e Tópicos em Engenharia de Computação I: Introdução à Morfologia Matemática. Operadores Elementares; Dilatações e Erosões. Função Distância, Distância Geodésica; Filtros Morfológicos. Aberturas e Fechamentos. Filtros Alternantes Sequenciais. Sup-Geradores, Afinamento e Homotopia. Reconstrução Algoritmo de Linhas Divisores de Água. Exemplo de Segmentação de Imagens usando Morfologia Matemática. • Visão Robótica: Métodos de calibração de câmeras. Localização (posição e orientação) de objetos no espaço. Principais métodos. Aplicações industriais. Integrações de sensores. • Introdução ao Processamento de Imagem Digital: Fundamentos de Imagem Digital. Transformações Radiométricas. Convolução e Correlação. Filtragem no Domı́nio Espacial. Análise de Fourier. Filtragem no Domı́nio da Freqüência. Técnicas de Restauração. Segmentação de Imagens. Introdução à Morfologia Matemática. • Computação Gráfica I: Introdução à área de Computação de Imagens. Revisão de periferia Gráfica. Transformações de coordenadas. Recorte. Window/Viewport. Pacotes gráficos. Algoritmos de linhas e superfı́cies escondidas. Rasterização de imagens. Preenchimento de Polı́gonos. Tonalização de imagens: flat, Gouraud, Phong. Técnicas de modelagem: visão introdutória da área. • Tópicos em Sistemas: Sinais contı́nuos e discretos. Sistemas lineares invariantes no tempo: circuitos elétricos. Equações diferenciais lineares ordinárias invariantes no tempo. Transformada de Laplace. Série de Fourier. Transformada de Fourier. Amostragem de sinais. Transformada Z. Transformada Z aplicada à probabilidade. Ortogonalização de sinais. Transformada discreta de Fourier. • Estudos Especiais I: Estudos realizados sobre temas especı́ficos voltados para o tema de tese. • Seminário de Computação: Assuntos diversos em computação. Na maioria dos cursos citados, os conteúdos teóricos foram reforçados com exercı́cios de laboratório. Com isto, além das ementas estudadas, houve uma grande familiaridade em relação à linguagem C e, sobretudo, ao uso do MATLAB. Para este semestre já está feita a matrı́cula em “Tese de Mestrado” e “Programa Estágio Docente II”. A primeira disciplina consiste no desenvolvimento da tese em si e a segunda, de auxı́lio didático ao curso de “Sistemas de Informações Gráficas” oferecido na graduação. Para a pesquisa, o primeiro passo foi a aprendizagem da linguagem Python e do pacote Numerical. A seguir, surgiram alguns questionamentos sobre qual a melhor forma de exibir uma imagem ou um gráfico em Python, elementos importantes na análise de imagens. Foram estudados então os módulos Tkinter e Gnuplot [13], referências bastante comuns a usuários Python. O passo seguinte foi o aprendizado da linguagem XML e a forma como a máquina Adesso trata estas estruturas de marcação. No Anexo 1, tem-se o conteúdo de um seminário apresentado na FEEC-Unicamp, em abril de 2001. É feito um resumo geral do projeto, incluindo uma introdução sobre a linguagem Python, o módulo Numeric e o projeto Adesso. Neste tempo, foi elaborado um pôster (de 50cm x 90cm) e uma breve apresentação para o XIV Simpósio Brasileiro de Computação Gráfica e Processamento de Imagens (SIBGRAPI 2001) entitulado “Toolbox of Image Processing for Numerical Python”. Tanto o mini-artigo publicado [14] quanto o pôster podem ser visto no Anexo 2. Foram implementadas uma série de funções da caixa de ferramentas, já no contexto de produção de software do Adesso. Foram criadas folhas de estilos para geração de código-fonte 4 Figure 1: Script para demonstração do “iashow” Python (incluindo geração de: funções em si, scripts de demostração da caixa de ferramentas, e testsuites para verificação de correção das funções implementadas), e folhas de estilos para geração de documentação em HTML (HyperText Markup Language). Além de um incremento do tratamento automático de parâmetro padrão (valor default) na folha de estilo de geração de código MATLAB existente. Por fim, foi desenvolvido um protótipo de correção automática de scripts Python, via internet, com bons resultados. Esta poderá ser uma ferramenta auxiliar de ensino, no que diz respeito à avaliação, já que se pode gerar estatı́sticas a respeito de cada aluno, a partir do registro de cada submissão feita. 4 Resultados Nesta seção, será dada uma breve introdução dos ambientes de trabalho e os resultados obtidos nesta pesquisa. 4.1 A linguagem Python Python é uma moderna linguagem, interpretada, orientada a objetos, de alto nı́vel, de rápida prototipação, com um sintaxe simples (quase como um “pseudo-código”), estensı́vel, extremamente portável. A linguagem é bastante flexı́vel (assim como Perl) e é livremente distribuı́da, além de ter seu código aberto. Pode ser facilmente instalada a partir de www.python.org nas mais diversas plataformas. É suficientemente eficiente para utilização em processamento de imagens quando associada ao pacote Numerical. Este também segue a linha “Open Source” e pode ser livremente adquirido em www.pfdubois.com/numpy. Como é todo programado em C e Python, é tão portável como próprio Python. A combinação Python e Numerical permite um poder numérico e facilicidade de uso como do MATLAB. 4.1.1 Exibição de imagens A exibição de imagens é possı́vel através do uso do módulo Tkinter. Este é o pacote padrão GUI (Graphical User Interface) do Python. O Tkinter é uma interface, orientada a objetos, para as funcionalidades do Tcl/Tk. Para criação de objetos gráficos, portanto, se faz necessário o aprendizado do Tk. No entanto, na caixa de ferramentas já implementada, a função “iashow” se encarrega de oferecer uma interface ainda mais trivial ao usuário. Na Figura 1 tem-se um script, no qual se faz uso da exibição de imagens. A Figura 2 mostra as janelas gráficas geradas a partir de cada “iashow” do script. >>> from ia636py import * >>> f = iaread(’cameraman.pgm’) >>> (g, a) = iasobel(f) >>> s = iashow(f) (256, 256) Min= 0.0 Max= 251.0 Mean=137.066 Std=87.20 >>> s = iashow(g) (256, 256) Min= 0.0 Max= 1067.79024157 Mean=98.274 Std=179.78 5 (a) (b) Figure 2: (a) Imagem original; (b) Logaritmo do filtro de Sobel da imagem (a) Figure 3: Script para demonstração do “iaplot” 4.1.2 Exibição de gráficos Existem várias ferramentas de exibição de gráficos que podem ser localizadas no site do Python. Foi escolhido o gnuplot por ser uma ferramenta bastante poderosa e, até certo ponto, comum a usuários Unix. O gnuplot é utilizado, por exemplo, no Octave [15], um clone de diversas funcionalidades do MATLAB, e livremente distribuido (licença GLP-GNU). A interface com o Python, o Gnuplot.py, é simples de ser instalada e utilizada. Assim como na exibição de imagens, também foi feita uma interface de mais alto nı́vel para exibição de gráficos através da função implementada “iaplot”. Na Figura 3, obseva-se um exemplo de uso desta função. A Figura 4 mostra a janela gerada com o gráfico em questão. >>> from ia636py import * >>> h = ialog([200, 300], [100, 150], 20) >>> iaplot(h[100, :]) 4.2 O sistema Adesso O Adesso é um ambiente computacional de suporte ao desenvolvimento de aplicações cientı́ficas. É um projeto de desenvolvimento conjunto entre a Fundação CTI e a FEEC-UNICAMP, apoiados pelo projeto FAPESP 98/13817-3 de auxı́lio à pesquisa. O Adesso explora o modelo de programação baseado em componentes reutilizáveis, cada vez mais comum em programas de última geração, para fornecer suporte ao desenvolvimento de componentes e sua integração a diversas plataformas de programação cientı́fica. O Adesso configura-se em uma base de dados de componentes (algoritmos) representada em XML e em um conjunto de ferramentas de transformação (stylesheets) para geração de código, documentação e empacotamento dos componentes. A Figura 5 mostra o esquema de como esta transformação ocorre. Há uma base de dados XML, de entrada, contendo informações quaisquer tais como algoritmos C, Python e meta-informações. Há também um conjunto de folhas de estilo, também em formato XML, cada qual para uma saı́da especı́fica que pode ser código-fonte C ou Python, documentação 6 Figure 4: Linha 100 da imagem do Laplaciano de Gaussiana LATEX, HTML, entre inúmeras outras possibilidades. A máquina XSL se encarrega de ler as duas entradas (arquivos XML) e gerar a saı́da. Esta máquina é implementada através do tDOM [16], um eficiente pacote para Tcl que facilita o processamento XML/DOM. 4.3 Geração de código Uma das folhas de estilos implementada foi a de geração de código-fonte Python. Na Figura 6 pode-se ver um trecho da organização XML contendo informações a respeito da função “iacos”. As meta-informações (na parte entre <Documentation> e </Documentation>) consistem em um trecho de descrição da função (em Descr name=’’Description’’), um trecho com exemplos de uso da função (em Descr name=’’Examples’’, e um trecho com a equação, se existir, escrita em LATEX (em Descr name=’’Equation’’). Segue a ( 100,20).c ( 100,20)Makefile Base de Dados -XML - ( 100,20).py Linguagem C( 90,30)Máquina B@ XSL B@ R Python ( 110,50) 6 B A B ( 100,20)LTEX B BN ( 90,30)Folhas de Estilo ( 100,20)HTML Figure 5: Máquina Adesso 7 Figure 6: Trecho XML a respeito da função “iacos” descrição da variável de retorno da função (em Return), e os argumentos de entrada necessários (em Args). Após isto, vem o corpo do código-fonte (em Source). O que a máquina XSL faz é percorrer toda a base de dados XML, nesta estrutura de árvore, fazendo as substituições necessárias. A Figura 7 mostra o código gerado automaticamente a partir da interpretação do trecho XML da Figura 6. O Anexo 3 exemplifica a forma de uma folha de estilo apresentando o núcleo da que foi implementada paraa geração de código-fonte Python. Além de um módulo completo da caixa de ferramentas, esta folha de estilo gera as demonstrações e os testsuites. A Figura 8 exibe o ambiente Python e a solicitação de ajuda à função “iacos”, quando em sua utilização na prática, a partir do módulo importado com a função gerada da Figura 7. Esta mesma informação, encaranda como help no código-fonte, é aproveitada na documentação HTML ou LATEX. <AdPythonFunction> <Documentation> <Descr name="Description">Generate a cosenosoid image of size s with amplitude 1, period T, phase phi and wave direction of theta. The output image is a double array.</Descr> <Descr name="Examples"> <PYcode>import Numeric f = <Self/>([128,256], 100, Numeric.pi/4, 0) iashow(ianormalize(f, [0,255]))</PYcode> </Descr> <Descr name="Equation"> <Eq>f(x,y) &amp; = &amp; sin( 2\pi (f_x x + f_y y) + \phi) \\ ... </Eq> </Descr> </Documentation> <Return name="f" type="mmIMAGE" output="yes"> <Args> <Arg name="s" type="mmIMAGE" dir="in" optional="no" default="" hidden="no"> <Descr>size: [rows cols].</Descr> </Arg> ... </Args> <Source> <Code>cols, rows = s[1], s[0] x, y = iameshgrid(range(cols),range(rows)) freq = 1./t fcols = freq * Numeric.cos(theta) frows = freq * Numeric.sin(theta) f = Numeric.cos(2*Numeric.pi*(fcols*x + frows*y) + phi)</Code> </Source> <Platforms>windows linux sunos</Platforms> </AdPythonFunction> def iacos(s,t,theta,phi): """ o Purpose Create a cossenoidal image. o Synopsis f = iacos(s,t,theta,phi) o Input s: size: [rows cols]. t: Period: in pixels. theta: spatial direction of the wave, in radians. 0 is a wave on the horizontal direction. phi: Phase o Output f: o Description Generate a cosenosoid image of size s with amplitude 1, period 8 Figure 7: Código-fonte da função “iacos” gerado automaticamente Figure 8: Help da função “iacos” no IDLE Python T, phase phi and wave direction of theta. The output image is a double array. o Examples import Numeric f = iacos([128,256], 100, Numeric.pi/4, 0) iashow(ianormalize(f, [0,255])) """ cols, rows = s[1], s[0] x, y = iameshgrid(range(cols),range(rows)) freq = 1./t fcols = freq * Numeric.cos(theta) frows = freq * Numeric.sin(theta) f = Numeric.cos(2*Numeric.pi*(fcols*x + frows*y) + phi) return f 4.4 Geração de documentação A geração de documentação consiste em se descrever toda a caixa de ferramentas implementada. Alguns requisitos são considerados essenciais a uma boa documentação. O primeiro item é descrever as funções em si, dizer qual a finalidade de cada uma, qual sua sintaxe e seus parâmetros de entrada e saı́da. O segundo, é determinar alguns exemplos e as saı́das que devem ser produzidas quando os mesmos são interpretados pela linguagem em uso. Outro item é o estabelicimento de fórmulas, sempre que possı́vel, pois facilitam, muitas vezes, o entendimento do algoritmo. Por fim, para cada função, é importante listar as demais funções associadas e seu algoritmo ou código-fonte. Foi elaborada uma folha de estilo para geração de documentação HTML, para Python, a partir do Adesso, que cobre os itens citados. No Anexo 4, pode-se visualizar as saı́das geradas em relação a documentação das funções até então implementadas. As informações a 9 respeito das funções, seus parâmetros, são implementadas basicamente como na geração de código-fonte vista anteriormente. Já os exemplos requerem um pouco mais de cuidado. São basicamento quatro formas de gerações automáticas distintas: incluisão de saı́das numéricas ou texto, de imagens, de gráficos e de equações. Já foi dito que é utilizado o tDOM para análise de estruturas XML. Portanto, foi necessário, abrir um interpretador Python dentro do Tcl para que pudessem ser gerados os resultados esperados. Houve uma pesquisa em cima deste tema e foi encontrada uma interface neste sentido chamada Tclpython [17]. A partir daı́, os scripts Python puderam ser normalmente executados e suas saı́das mapeadas em variáveis Tcl. Quando na passagem por um “iashow”, por exemplo, há um tratamento diferenciado dentro do Tcl. O interpretador Python aberto passa a gravar em arquivo (usando o próprio “iawrite” da caixa de ferramentas) a imagem, em questão, em memória. Algo similar acontece quando se detecta um “iaplot”. A folha de estilo agora busca utilizar as funcionalidades do Gnuplot para gravar as figuras. Gravadas as mesmas, o Tcl passa a fazer chamadas a sotwares de conversão de formatos, no caso de PS (Postscript) para GIF (Graphics Interchange Format) ou PNG (Portable Network Graphics). A geração de equações depende apenas da existência de uma interpretador para sintaxe de fórmulas do LATEX. O Tcl desta vez faz a compilação do trecho XML a respeito. No caso de HTML, são criadas imagens GIF, pela conversão de PS ou PDF (Portable Document Format) gerado. Se a documentação fosse em LATEX propriamente dito não haveria esta necessidade. 4.5 Funções implementadas A seguir, são listadas as funções implementadas até agora. O prefixo “ia” tem origem no nome das disciplinas de pós-graduação da FEEC-UNICAMP, em especial, o curso IA636 (Visão Computacional), no qual se poderá utilizar a caixa de ferramentas desenvolvida. No Anexo 4, pode-se ver as páginas HTML geradas automaticamente sobre tais funções. • iabwlp - Calcula o filtro em freqüência, passa-baixo, de Butteworth • iacircle - Cria uma imagem binária de cı́rculo • iacos - Cria uma imagem de cossenóide • iacrop - Corta uma imagem para encontrar o retângulo mı́nimo • iadct - Calcula a Transformada Discreta de Cossenos • iadctmatrix - Gera a matriz base para a transformada DCT • iadft - Calcula a Transformada Discreta de Fourier • iadftmatrix - Gera a matriz base para a transformada DFT • iadftview - Gera o espectro ótico de Fourier para visualizar o resultado da DFT • iaffine - Realiza uma transformação afim • iafftshift - Desloca a componente de freqüência zero para o centro do espectro • iagaussian - Gera uma imagem Gaussiana 2D • iageorigid - Faz uma transformação geométrica de corpo rı́gido 2D • iahaarmatrix - Gera a matriz base para a Transformada de Haar • iahadamard - Calcula a Transformada de Hadamard • iahadamardmatrix - Gera a matriz base para a Transformada de Hadamard • iahistogram - Calcula o histograma de uma imagem • iahwt - Calcula a Transformada Wavelet Haar 10 • iaidct - Obtém a Transformada Discreta Inversa de Cossenos • iaidft - Obtém a Transformada Discreta Inversa de Fourier • iaifftshift - Desfaz o efeito do uso da função iafftshift • iaihadamard - Transformada Inversa de Hadamard • iaihwt - Transformada Inversa Wavelet Haar • iaind2sub - Converte ı́ndices lineares em coordenadas XY • iaisdftsym - Verifica se uma matriz complexa é conjugada simétrica • ialog - Gera uma imagem do Laplaciano de Gaussiana • ialogfilter - Calcula o filtro do Laplaciano de Gaussiana • iameshgrid - Cria uma malha de coordenadas • ianormalize - Normaliza os valores dos pixels dentro de uma escala especificada • iaotsu - Calcula o Thresholding de Otsu • iapconv - Calcula a convolução periódica 2D • iaplot - Exibe o gráfico de uma função • iaptrans - Faz uma translação periódica • iaread - Lê um arquivo de imagem (PBM, PGM e PPM) • iarectangle - Cria uma imagem binária de retângulo • iashow - Exibe uma imagem • iasobel - Faz a detecção de aresta de Sobel • iasub2ind - Converte coordenadas XY em ı́ndices lineares • iavarfilter - Calcula o filtro de variância • iawrite - Escreve em um arquivo de imagem (PBM, PGM e PPM) Foi confeccionada uma página para o curso de IA636 contendo, entre outras informações, a caixa de ferramentas completa (código-fonte e documentação) e dicas de instalação [18]. 4.6 Geração de demonstrações Além do elemento AdPythonFunction na estrutura XML, como visto na Figura 6, há também o elemento AdPythonDemo responsável especificamente por armazenar informações a fim de demonstrar, ou até mesmo, realizar um pequeno curso, sobre determinada função ou conjunto de funções. A folha de estilo de geração de documentação HTML também se encarrega de gerar as demostrações existentes na caixa de ferramentas. Um exemplo pode ser visto na Figura 9 quando se dá alguns exemplos da Transformada de Fourier em imagens sintéticas. Outra abordagem é dada pela folha de estilo de geração de código-fonte que se encarrega de por todos os exemplos de um elemento AdPythonDemo em um arquivo de script Python devidamente formatado. Feita a geração de código, estes scripts são automaticamente criados. Sua execução gera as mesmas saı́das que se apresentam nas páginas HTML, mas dentro do ambiente Python. Neste caso, pode-se rapidamente modificadar os testes, conforme o desejado, e verificar os novos resultados. 11 12 Figure 9: Exemplo de demonstração gerada em formato HTML 13 Figure 10: Teste da função “iacircle” 4.7 Geração de testes (testsuites) A última tarefa do gerador de código é a de criar scripts Python de teste de toda caixa de ferramentas implementada. Esta informação de teste também está armazenada em XML juntamente com as funções. Os testsuites nada mais são que exemplos com saı́das supostamente corretas e, quase sempre, gerada analiticamente sem uso do computador. Os scripts citados vão então testar função por função comparando as saı́das geradas nos exemplos fornecidos com as saı́das esperadas. Com isto, espera-se cobrir o máximo de casos de erro, e melhorar cada vez mais a correção da caixa de ferramentas. A Figura 10 mostra um trecho de teste para exemplificar a verificação da função “iacircle”. print ’testing iacircle’ correto = ‘iacircle([5,7], [[0, 0, 0, 0, 0, [0, 0, 0, 0, 1, [0, 0, 0, 1, 1, [0, 0, 1, 1, 1, [0, 0, 0, 1, 1, 5 2, 0, 0, 1, 1, 1, [3,4])‘ == ‘Numeric.array( 0], 0], 0], 1], 0]])‘ Continuidade do trabalho O curso de Visão Computacional (IA636) utilizará tanto a caixa de ferramentas do MATLAB como a do Python, através de exercı́cios práticos. Isto permitirá testar de fato a caixa de ferramentas implementada neste projeto e verificar suas vantagens e desvantagens comparadas ao MATLAB. Todo o projeto de pesquisa pode ser visto em http://www.dca.fee.unicamp .br/˜alexgs. Uma página definitiva, disponı́vel ao público, será feita em julho de 2002. Foi discutida a viabilidade de se criar páginas dinâmicas na internet, através das facilidades do módulo cgi (Common Gateway Interface) do Python, com o propósito de implementar algoritmos de processamento de imagens e ser mais uma ferramenta de aprendizagem. Neste caso, o usuário precisaria de apenas um navegador de internet para executar seus scripts. Um pequeno teste para o cálculo do filtro de média foi feito, usando cgi/Python, e os resultados foram satisfatórios (Figura 11). Seria interessante automatizar este processo de criação de cgi, elaborando-se uma nova caixa de ferramentas neste sentido. Seria uma nova forma de transformação de informação suportado pelo Adesso. Até agora foi tratado apenas um formato de arquivo de imagem (do tipo PBM/PGM/PPM). Seria interessante o suporte a outros formatos, embora haja conversores como ImageMagick [19] com este fim, para facilitar o trabalho do usuário final. Uma solução que está em estudo é o uso do pacote Img [20] do Tk, porém, há certa dificuldade de interface com o Python, mais precisamente o Tkinter. Sabe-se, porém, que ao menos o formato GIF, mais comumente utilizado, é suportado independentemente pelo Tkinter e pode ser facilmente adaptado ao “iaread” e “iawrite” da caixa de ferramentas. É preciso acrescentar mais demonstrações a outras funções implementadas, além de terminar todos os testsuites faltantes. Estas tarefas são basicamente de preenchimento de um conjunto de arquivos XML com trechos de scripts adequados. Conforme a necessidade, novas funções também poderão ser criadas. O principal objetivo agora é a criação de uma folha de estilo para estabelecer a interface entre a linguagem C e o Python de forma automática. Com isto, muito do que já está programado, e é utilizado em MATLAB e Tcl/Tk, passará a ser aproveitado em Python, sem custo adicional de programação. 14 Figure 11: CGI para obtenção do filtro de média Devido ao cumprimento de grande parte da proposta, existe a possibilidade do término do trabalho antes do previsto. Para uma consolidação maior da pesquisa, um artigo sobre este projeto está sendo elaborado no momento. 6 Conclusões O ambiente Python/Numerical, dentro do contexto Adesso, permite agregar (e acrescentar) vantagens de sistemas como Khoros e MATLAB, seja na facilidade de instalação, seja na facilidade de uso, seja no custo, ou na possibilidade de criação de documentação, entre outras. A estensı́vel linguagem Python permite a implementação eficiente de algoritmos para processamento de imagens. A caixa de ferramentas implementada deverá ser disponı́vel de forma aberta e gratuita, permitindo que a comunidade nacional seja beneficiada com este esforço. Ter-se-á uma opção às ferramentas de processamento de imagens já existente em MATLAB, desenvolvida no DCA-FEEC-UNICAMP e usada em cursos de graduação. Além deste principal resultado, podemos citar outros: contribuição ao sistema Adesso com a inclusão de uma nova plataforma suportada, verificando sua generalidade e consolidação do 15 uso deste sistema na geração de uma nova caixa de ferramentas. O ambiente produzido será útil tanto em ensino e pesquisa como para o desenvolvimento de aplicações finais. References [1] G. Rossum, Python Tutorial, F. L. Drake Jr., editor, April 15, 2001. http://www.python.org/doc/current/tut/tut.html [2] D. Ascher, P. F. Dubois, K. Hinsen, J. Hugunin, and T. Oliphant’, Numerical Python, LLNLL, University of California, June 1, 2001. http://www.pfdubois.com/numpy/html2/numpy.html [3] R. C. Machado, R. A. Lotufo, “Adesso: Ambiente Computacional para Desenvolvimento Rápido de Aplicações”. DCA-FEEC-UNICAMP/FCTI Activities Report, Maio, 2000, Campinas. [4] De Almeida, A.C.R. et al. PhotoPix, Plataforma em Java para Implementação de Algoritmos de Processamento Digital de Imagens, SIBGRAPI, 1998. [5] Luppi R. M. S., Kligerman D. M., Falcão A. X., Braga Neto U. M., Vieira A. J. e Lotufo R. A. V3DTOOLS : A KHOROS Toolbox for 3D Imaging, World Congress on Medical Physics and Biomedical Engineering 94, Rio de Janeiro, agosto de 1994. [6] J. Barrera, G. J. F. Banon, R. A. Lotufo, and R. Hirata Jr., MMach: a Mathematical Morphology Toolbox for the Khoros System, Journal of Electronic Imaging, vol 7, no. 1, pp.174-210, January 1998. [7] Lotufo R. A., Jordan R. Hands-On Digital Image Processing, IEEE Frontiers in Education - 26th Annual Conference, FIE-96 pp 1199-1202, Volume 3, Nov. 6-9, 1996. Salt Lake City, Utah, USA. [8] R. Jordan, R. A. Lotufo, Interactive Digital Image Processing Course on the WorldWide Web, Proccedings of the 1996 International Conference on Image Processing. IEEE Signal Processing Society. pp.433-436. September 16-19, 1996, Lausanne, Switzerland. [9] SDC Information Systems, SDC Morphology Toolbox for MATLAB http://www.mmorph.com [10] The MathWorks, The Language of Technical Computing http://www.mathworks.com [11] Welch, Brent B. Pratical Programming in Tcl an Tk, 3rd ed., Prentice Hall PTR, 1999. [12] W3C Recommendation 6 October 2000, Extensible Markup Language (XML) 1.0 (Second Edition) http://www.w3.org/TR/2000/REC-xml-20001006 [13] Gnuplot.py http://gnuplot-py.sourceforge.net/ [14] Silva, A. G.; Lotufo, R. A., R.; Machado, R. C. Toolbox of Image Processing for Numerical Python, Proceedings of XIV Brazilian Symposium on Computer Graphics and Image Processing. p. 402. October 2001, Florianópolis, Brazil. [15] Eaton, John W., GNU Octave, a high-level interactive language for numerical computations, 3rd ed., February 1997. http://www.octave.org/doc/octave− toc.html [16] Loewer, Jochen, tDOM - A fast XML/DOM/XPath package for Tcl written in C http://www.tu-harburg.de/skf/tcltk/papers2000/tDOM3.pdf [17] Fontaine, Jean-Luc, tclpython, a Python package for Tcl http://jfontain.free.fr/tclpython.htm [18] Página do Curso de Visão Computacional (IA636) http://www.dca.fee.unicamp.br/ alexgs/curso 16 [19] ImageMagick, Convert, Edit and Compose Images http://www.imagemagick.org/ [20] Img Home Page http://members1.chello.nl/ j.nijtmans/img.html 17