Caixa de ferramentas de processamento de

Propaganda
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) & = & 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
Download