Você está na página 1de 37

Gaudi-AFIS:

Manual de Referncia, Utilizao e Desenvolvimento

Murilo Santos de Lima

Universidade Federal da Bahia - Instituto de Matemtica


Departamento de Cincia da Computao
Grupo de Engenharia de Algoritmos e Programao Distribuda
Av. Adhemar de Barros, S/N, Campus de Ondina
CEP: 40170-110 - Salvador/BA
muca@dcc.ufba.br

SUMRIO

Introduo

Instalao

2.1

Obtendo o cdigo-fonte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Pacotes necessrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Compilando o sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.4

Congurando o diretrio base nos scripts de teste . . . . . . . . . . . . . . . .

10

3.1

Classicao de impresses digitais . . . . . . . . . . . . . . . . . . . . . . .

10

3.2
4

Reconhecimento de impresses digitais: mtodos utilizados

Comparao de impresses digitais . . . . . . . . . . . . . . . . . . . . . . . .

12

Utilizao e exemplos

13

4.1

Diretrios do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

4.2

Comandos do sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

4.2.1

Subsistema de classicao . . . . . . . . . . . . . . . . . . . . . . .

14

4.2.2

Subsistema de comparao . . . . . . . . . . . . . . . . . . . . . . . .

19

4.2.3

Programas auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

Bibliotecas auxiliares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

4.3.1

Biblioteca de manipulao de imagens em tons de cinza . . . . . . . .

25

4.3.2

Biblioteca de manipulao de sinais 2D . . . . . . . . . . . . . . . . .

26

4.3.3

Biblioteca de lista ligada . . . . . . . . . . . . . . . . . . . . . . . . .

28

4.3.4

Biblioteca de la de prioridades . . . . . . . . . . . . . . . . . . . . .

29

4.3

4.3.5
5

Biblioteca de mensagens de erro padro . . . . . . . . . . . . . . . . .

Diculdades associadas ao desenvolvimento

30
32

Referncias Bibliogrcas

33

Apndice A -- Licenciamento

35

A.1 Biblioteca IM - Tecgraf / PUC-Rio . . . . . . . . . . . . . . . . . . . . . . . .

36

A.2 Funes Matlab para Processamento de Imagens de Peter Kovesi . . . . . . . .

36

INTRODUO

As impresses digitais constituem-se no identicador biomtrico mais amplamente utilizado, tanto por sua aceitao no meio jurdico, forense e civil, quanto por sua praticidade,
segurana e baixo custo. Entidades como agncias de polcia utilizam o reconhecimento de
impresses digitais para diversos ns, incluindo o auxlio investigao criminal pela identicao de indivduos atravs de impresses latentes.
Essa identicao no entanto no pode ser feita manualmente, visto que tais entidades dispem de largas bases de dados. O processo automatizado, ento, por um Sistema Automtico
de Identicao de Impresses Digitais (AFIS - Automatic Fingerprint Identication Systems).
Notou-se que: o tema pouco explorado no Brasil (em especial na Bahia); h demanda
pela utilizao de tais sistemas (inclusive da Secretaria de Segurana Pblica do Estado da
Bahia); trata-se de um tema atual e com vrias questes a serem solucionadas; h carncia de
ferramentas livres que auxiliem seu estudo.
Estas consideraes levaram necessidade de implementao de um AFIS, mesmo que
incompleto e em forma de prottipo, para ns acadmicos. Este texto documenta a implementao de tal sistema pelo grupo Grupo de Engenharia de Algoritmos e Programao Distribuda
(Gaudi) (http://gaudi.dcc.ufba.br/) do DCC/UFBA, no contexto do projeto BIOMTRICA, sob
auxlio da Fundao de Amparo Pesquisa do Estado da Bahia (Fapesb).
Agradeo ao Prof. Perlino Jr., orientador do projeto de iniciao cientca que originou
este trabalho, ao colega Amadeu Jnior por sua colaborao em diversas etapas, Profa . Fabola Greve (co-orientadora do referido projeto) pelos sbios conselhos e FAPESB pelo apoio
nanceiro. A todos que de alguma forma contriburam, em especial ao Deus de Abrao, Isaque
e Jac pelo Seu constante auxlio.

INSTALAO

Este captulo descreve a instalao do sistema Gaudi-AFIS em um sistema Debian GNU/Linux1 e foi testada na verso Lenny RC2. A instalao em outras distribuies do GNU/Linux
ou em sistemas Microsoft Windows no foi testada. Para instalaes em Microsoft Windows
necessrio o uso de sistemas como Cygwin2 ou MinGW3 .

2.1

OBTENDO O CDIGO-FONTE

O cdigo-fonte do Gaudi-AFIS est disponvel no seguinte endereo eletrnico, clicando


no item cdigo-fonte do projeto:

http://wiki.dcc.ufba.br/Gaudi/ProjetoICMuriloBiometrica

2.2

PACOTES NECESSRIOS

Para compilar o sistema, os seguintes pacotes so necessrios:


gcc
make
fftw-dev
A biblioteca IM, do laboratrio Tecgraf/PUC-Rio4 fornecida juntamente com o cdigo,
na verso 2.6. O licenciamento da mesma descrito no Apndice A.
1 http://www.debian.org/
2 http://www.cygwin.com/
3 http://www.mingw.org/

4 http://www.tecgraf.puc-rio.br/im/

Existe um programa de gerao de nmeros aleatrios na pasta test escrito em linguagem


Pascal. Apesar de no ter sido utilizado, para compilar tal programa necessrio o pacote gpc.
A ferramenta conv_jpgtiff utiliza o programa GIMP5 em tempo de execuo.
A ferramenta conv_cjpegb utiliza comandos do sistema NFIS do NIST/FBI6 em tempo de
execuo. Tal ferramenta, no entanto, s utilizada para testar o sistema com a basa de dados
NIST Special Database 14 (WATSON, 1993), fornecida juntamente com o NFIS. O usurio que
desejar realizar tais testes deve solicitar o sistema NFIS diretamente ao NIST7 .
Para executar alguns scripts de teste, so necessrios os seguintes pacotes:
octave2.1
octave2.1-forge
gnuplot
imagemagick
Alguns scripts de teste tambm utilizam comandos do sistema NFIS.
Alguns scripts de teste utilizam as funes de processamento de imagens para Matlab desenvolvidas por Peter Kovesi (KOVESI, 2005). As funes esto disponibilizadas, com pequenas modicaes para utilizao no Octave, no diretrio share/octave/peter_kovesi/.
Consulte o licenciamento no Apndice A.
Para visualizao dos arquivos com resultados de testes (no formato ODS), necessrio o
uso da aplicao OpenOfce.org Calc8 .

2.3

COMPILANDO O SISTEMA

Para compilar o sistema, extraia o pacote para um diretrio, por exemplo, /usr/local/gaudi-afis/:

cd /usr/local
tar -zxvf gaudi-afis.tar.gz
5 http://www.gimp.org/

6 http://fingerprint.nist.gov/NFIS/
7 Membros

do grupo Gaudi tm acesso a um CD-ROM com uma verso do NFIS.

8 http://www.openoffice.org/product/calc.html

Entre no diretrio onde o sistema foi extrado, abra o arquivo Makefile com um editor de
texto simples. Altere a varivel PROJDIR para o diretrio no qual o sistema foi extrado:

...
SHELL=/bin/sh
PROJDIR= /usr/local/gaudi-afis
...
Caso queira compilar o sistema para Microsoft Windows, altere tambm a varivel EXEEXT
para o valor .exe:

...
CFLAGS =
CDEFS =
EXEEXT = .exe
...
Para compilar o sistema, execute os comandos:

make install
Os arquivos executveis sero disponibilizados na pasta bin. Para que os mesmos estejam acessveis no terminal, edite o arquivo .bash_profile no seu diretrio pessoal (diretrio
"home"), adicionando a seguinte linha no nal do arquivo:

export PATH=$PATH:/usr/local/gaudi-afis
Novamente, substitua /usr/local/gaudi-afis pelo diretrio no qual voc instalou o sistema.
Nota para futuro mantenedor: Na verso atual, o comando make est com problemas,
uma vez que as bibliotecas recm-compiladas ainda no estaro na pasta lib. Por isso apenas
o comando make install deve ser executado. O futuro mantenedor deve corrigir isto.

2.4

CONFIGURANDO O DIRETRIO BASE NOS SCRIPTS


DE TESTE

Alguns scripts de teste necessitam que seja congurado o diretrio no qual o sistema est
instalado.
Especicamente, para realizar testes no console do Octave, necessrio acrescentar varivel LOADPATH os caminhos que contm cdigo a ser utilizado. Algumas funes no diretrio

share/octave/peter_kovesi/ so utilizadas por diversos scripts de teste, portanto em alguns diretrios h um arquivo inicializa.m que atualiza a varivel LOADPATH da seguinte
forma:

LOADPATH=strcat(LOADPATH, "/usr/local/gaudi-afis/share/octave/peter_kovesi/");
Novamente, substitua /usr/local/gaudi-afis/ pelo diretrio no qual o sistema est
instalado. Para utilizar tais funes no console do Octave, execute o cdigo acima ou crie um
link simblico do arquivo test/inicializa.m para o diretrio no qual voc est trabalhando
e execute inicializa();. Para executar um script Octave (utilizando o comando octave -q)
que utilize as funes acima, necessrio que o arquivo inicializa.m esteja no diretrio
corrente.
Eis uma listagem dos arquivos de teste que devem ter o diretrio do sistema congurado:

share/octave/example_scripts/kovesi_script.m
share/octave/example_scripts/pankanti_script
test/inicializa.m
test/script_exec.sh
test/script_exec_kovesi.sh
test/teste.sh
test/nfis/script_exec.sh
test/performance/script_exec_kovesi.sh
test/performance/script_exec.sh
test/performance/teste.sh

test/performance/comparativo/script_exec*.sh
test/performance/novo_teste/teste.sh
Alguns scripts de teste supem que o usurio possui o sistema NFIS instalado no diretrio

/usr/local/nfis/. Caso o usurio queira utilizar tais scripts e tenha o sistema NFIS instalado
em outro diretrio, deve congurar os seguintes arquivos:

test/script_exec.sh
test/script_exec_kovesi.sh
test/nfis/script_exec.sh
test/performance/script_exec_kovesi.sh
test/performance/script_exec.sh
test/performance/comparativo/script_exec*.sh
Os scripts de teste na pasta test/performance/comparativo/ supem que existem imagens de teste na pasta test/performance/comparativo/imgs/ no formato WSQ (formato
do NFIS). Essas imagens no so fornecidas com o sistema. Uma opo copiar algumas
imagens da base de imagens fornecida com o NFIS. Para os resultados que so apresentados no
arquivo test/performance/comparativo/comparativo.ods, foram utilizadas 198 imagens
(200 menos 2 que no puderam ser classicadas).
Nota para futuro mantenedor: para facilitar a congurao do diretrio do sistema, podese criar um arquivo no diretrio raiz do projeto que centralize a congurao. Os demais scripts
utilizariam o dado desse arquivo.

10

RECONHECIMENTO DE
IMPRESSES DIGITAIS:
MTODOS UTILIZADOS

Este captulo descreve os elementos bsicos de um AFIS e os mtodos que foram implementados no Gaudi-AFIS.
O trabalho de um AFIS consiste em identicar um indivduo atravs de sua impresso
digital. O sistema compara uma digital com uma massa de digitais disponibilizadas em um
banco de dados. Dois problemas bsicos precisam ser resolvidos: (1) como comparar se duas
imagens so do mesmo dedo e (2) como classicar as imagens de forma a otimizar a busca em
grandes bases de dados. Os mtodos apresentados neste captulo so agrupados em torno desses
dois problemas.
Para uma abordagem completa sobre reconhecimento de impresses digitais, consulte (MALTONI et al., 2003).

3.1

CLASSIFICAO DE IMPRESSES DIGITAIS

O mtodo de classicao empregado no Gaudi-AFIS baseado na anlise de pontos singulares (KARU; JAIN, 1999; COSTA, 2001). As imagens so classicadas em uma das classes
de Henry (THE. . . , 2003). Os resultados foram apresentados em (LIMA; FERREIRA JNIOR,
2007).
A classicao utiliza a arquitetura exibida na Figura 3.1. Obtm-se a imagem direcional
da imagem, dos quais so identicados os pontos singulares com base no clculo do ndice
de Poincar. Segmenta-se a imagem do plano de fundo, removendo pontos singulares falsos.
Classica-se ento a impresso digital com base em avaliaes geomtricas das coordenadas
dos pontos singulares.
Foram implementados os mtodos de segmentao de Maio (MAIO; MALTONI, 1997;

11

Figura 3.1: Arquitetura do sistema de classicao


MALTONI et al., 2003, p. 95) e Amengual (AMENGUAL et al., 1997, seo Fingerprint
image preprocessing); os mtodos de Karu (KARU; JAIN, 1999, p. 10), de Pankanti (JAIN;
PANKANTI, 1999, p. 10), de Hong (JAIN; HONG; BOLLE, 1997, p. 1112) e de Kovesi
(KOVESI, 2005) de clculo da imagem direcional, sendo os trs ltimos baseados num mesmo
princpio descrito em (MALTONI et al., 2003, p. 89), com pequenas variaes.
(COSTA, 2001) descreve, para o mtodo de Karu, dois mtodos de suavizao da imagem direcional, denominados mtodo da moda e do seno-cosseno, sendo o segundo tambm
descrito em (KARU; JAIN, 1999). Ambos foram implementados, juntamente com uma suavizao utilizando um borramento gaussiano (que, conforme (MALTONI et al., 2003, p. 88-89),
no funciona). Sugere-se tambm implementar uma suavizao utilizando ltros sequenciais
alternados (MAINTZ, 2007, p. 157158).
Duas variaes do clculo do ndice de Poincar foram implementadas, a descrita em
(KARU; JAIN, 1999, p. 58), que utiliza blocos do tipo 3 3 e gira no sentido horrio, e a
descrita em (MALTONI et al., 2003, p. 97100), que utiliza blocos 2 2 e gira no sentido antihorrio. A classicao realizada utilizando os mtodos em (KARU; JAIN, 1999, p. 58),
(MALTONI et al., 2003, p. 97100) e (COSTA, 2001, p. 6569), mais algumas modicaes
sugeridas em (LIMA; FERREIRA JNIOR, 2007).

12

3.2

COMPARAO DE IMPRESSES DIGITAIS

Iniciou-se a implementao da comparao de impresses digitais segundo a arquitetura


descrita em (COSTA, 2001; JAIN; PANKANTI, 1999) e em (MALTONI et al., 2003, p. 113):
aplicam-se ltros para melhorar a qualidade da imagem; em seguida-se, aplica-se a binarizao, transformando a imagem em preto e branco e anamento, que reduz a espessura das linhas
(cristas) da impresso digital a um pixel. Com base na imagem anada, identica-se as mincias. Utilizando a posio das mincias e a angulao das cristas adjacentes, compara-se duas
impresses digitais, utilizando um algoritmo de casamento de padres.
Foi implementado o mtodo de melhoramento de imagem de Hong (HONG; WAN; JAIN,
1998; MALTONI et al., 2003, p. 107), embora no tenham sido obtidos resultados satisfatrios
(o resultado no inuenciou positivamente na classicao) e iniciou-se a implementao da
ltragem com ltros de Gabor (ver Seo 4.2.2) (JAIN; PANKANTI, 1999, p. 1317), (MALTONI et al., 2003, p. 108111). Sugere-se futuramente a implementao do melhoramento
utilizando ltros sequenciais alternados (MAINTZ, 2007, p. 157158).
A binarizao e o anamento seguem os mtodos descritos em (COSTA, 2001), bastante
abordados na literatura. Adicionalmente, foi implementado o algoritmo de podamento descrito
em (GONZALEZ; WOODS, 2002, p. 545547). No entanto, necessrio ainda complementar
o anamento com algoritmos como staircase removal (FACON, 2004) e extrao de componentes conectados (SERRA, 1982). No diretrio src/inutil h o incio de uma implementao
da extrao de componentes conectados, mas o desempenho est invivel. Uma boa tcnica de
melhoramento da imagem anada que poderia ser implementada o preenchimento de buracos descrito em (AMENGUAL et al., 1997, seo Elimination of Small Holes). Sugere-se
tambm, para efeito de comparao dos resultados, a implementao de outros mtodos de binarizao, tais como os descritos em (JAIN; HONG; BOLLE, 1997, p. 1214, seo Ridge
Detection) e (MALTONI et al., 2003, p. 116117), este ltimo utilizando ltros de Gabor.
A identicao e ltragem das mincias e algoritmos de comparao no foram implementados.

13

UTILIZAO E EXEMPLOS

Este captulo descreve os recursos do Gaudi-AFIS, sua utilizao e alguns exemplos. Apresenta-se uma descrio de cada comando, dos parmetros identicados como bons, assim como
das bibliotecas auxiliares.
O sistema Gaudi-AFIS executa em uma arquitetura do tipo canos e ltros (do ingls pipe
and lter1 ), em que cada etapa do processamento consiste em um programa individual, que
utiliza arquivos (geralmente imagens) como entrada, executa algum processamento e devolve
outro arquivo como sada. Para automatizar a execuo de vrios ltros, o usurio pode utilizar
cdigo ShellScript2 ; ver, por exemplo, o arquivo test/script_exec.sh.

4.1

DIRETRIOS DO SISTEMA

O sistema contm os diretrios a seguir:


bin - aps a compilao, conter os executveis dos programas do sistema e auxiliares
A
doc - contm esta documentao e seu fonte L TEX

etc - (atualmente este diretrio est vazio)


include - contm os arquivos-cabealho das bibliotecas do sistema
inutil - aps a compilao, conter os executveis para programas que no esto funcionando (nota para futuro mantenedor: ver um local melhor para colocar esses programas; cuidado para no misturar com cdigo estvel)
lib - contm bibliotecas de terceiros fornecidas juntamente com o sistema e, aps a
compilao, conter as bibliotecas do sistema
1 http://www.dossier-andreas.net/software_architecture/pipe_and_filter.html
2 http://aurelio.net/shell/

14

res_testes_src - contm resultados de testes de implementao; especicamente, contm o resultado de testes comparativos (visuais) dos algoritmos de clculo da imagem
direcional (ver Seo 3.1)
share - contm arquivos a serem utilizados nos testes no Octave. Note que o Octave
aceita apenas imagens no formato JPG ou em formato de matriz (ver na Seo 4.2.3 a
descrio do programa tiff2octave).
src - contm o cdigo-fonte do sistema
test - contm scripts de teste e os resultados de alguns testes, funcionando tambm como
uma espcie de sandbox. Nos diretrios test/performance e test/performance/novo_teste
esto os testes de tempo de execuo e no diretrio test/performance/comparativo
esto os testes de taxa de acerto na classicao. No diretrio test/performance/problematicas
h uma cpia das imagens do NFIS que no puderam ser classicadas pelo sistema, devido grande quantidade de rudo
thinning - contm arquivos auxiliares ao algoritmo de anamento e podamento (ver
Seo 4.2.2)

4.2

COMANDOS DO SISTEMA

Esta seo descreve o funcionamento de cada comando do sistema. Ao executar um programa com parmetros incorretos, exibida uma mensagem com o formato correto do mesmo.
O cdigo-fonte dos programas tambm contm informao relevante sobre seu funcionamento.
Parmetros entre maior e menor (<>) devem ser substitudos por um valor (numrico ou
textual); parmetros entre colchetes ([]) so opcionais.

4.2.1

SUBSISTEMA DE CLASSIFICAO

Esta seo descreve os programas relacionados ao problema de classicao de impresses


digitais (ver Seo 3.1).
SEGMENTAO DA IMAGEM
Sintaxe do comando:

segmentation <metodo> <imagem> <tam_bloco> <lim_gradiente> [verbose] [octave]

15

<metodo> deve ser maio ou amengual (ver Seo 3.1).


<imagem> deve ser o caminho para uma imagem no formato TIFF3 sem alpha. Ver a
descrio do programa conv_jpgtiff na Seo 4.2.3.

<tam_bloco> deve ser um inteiro informando o tamanho do bloco de segmentao: a imagem dividida em blocos, e cada bloco analisado se pertence imagem ou ao plano de fundo.
Na literatura recomenda-se blocos de tamanho 16.

<lim_gradiente> deve ser um nmero decimal informando o limiar de segmentao.


Para o mtodo de Maio, recomenda-se utilizar o valor .2; para o mtodo de Amengual, .02.
Vericou-se que o valor timo depende, no entanto, da qualidade da imagem.
O parmetro verbose, caso presente, indica que o programa deve exibir mensagens indicando a situao da execuo.
O parmetro octave, caso presente, indica que o programa deve gerar um arquivo no formato de matriz do Octave com a imagem do gradiente, no caso do mtodo de Maio, ou da
varincia, no caso do mtodo de Amengual.
Como sada, gerada a imagem segmentada segmented.tiff.
CLCULO DA IMAGEM DIRECIONAL
Sintaxe do comando:

direction <imagem> <metodo> <PARAMETROS> [octave] [verbose]


<imagem> deve ser o caminho para uma imagem no formato TIFF sem alpha (a mesma
imagem de entrada do programa de segmentao; ver descrio de conv_jpgtiff na Seo
4.2.3)).

<metodo> deve ser karu, kovesi, pankanti ou hong (ver Seo 3.1). Os PARAMETROS
dependem do mtodo:
Karu: <num_direcoes> <dim_bloco> <tipo_suaviz>

<num_direcoes> deve ser 8 ou 16; recomenda-se 8.


<dim_bloco> deve ser um inteiro, dene o tamanho do bloco de subdiviso da imagem.
Aps o clculo da imagem direcional, este mtodo realiza uma suavizao da imagem
3 http://pt.wikipedia.org/wiki/Tagged_Image_File_Format

16

direcional (ver Seo 3.1): a cada bloco atribuda uma nica direo, com base nas
direes dos pixeis no bloco. Recomenda-se 16; recomenda-se tambm utilizar o mesmo
tamanho de bloco da segmentao.

<tipo_suaviz> deve ser 1 para mtodo da moda, 2 para mtodo do seno-cosseno, 3 para
borramento gaussiano e 4 para ltros sequenciais alternados. Nota: Esta ltima opo
ainda no est implementada; ao selecion-la, ser realizado borramento gaussiano.
Kovesi: <desv_gradiente> <desv_momento> <desvio_suaviz>
Os trs parmetros so inteiros e indicam desvios em borramentos gaussianos; consultar
o arquivo share/octave/peter_kovesi/ridgeorient.m. O autor do mtodo recomenda utilizar os valores 1 3 3.
Pankanti e Hong: <dim_bloco> <lim_cons>

<dim_bloco> deve ser um inteiro, dene o tamanho do bloco de subdiviso da imagem


(valor de W em (JAIN; PANKANTI, 1999, p. 10)). Recomenda-se 32.

<lim_cons> deve ser um decimal, dene o limite superior para a consistncia das orientaes em uma regio (valor de Tc em (JAIN; PANKANTI, 1999, p. 10), valor em graus).
Recomenda-se 50.0.
O parmetro octave, caso presente, indica que o programa deve gerar um arquivo no formato de matriz do Octave com a imagem direcional (opcionalmente, com o mapa de consistncia tambm; ver nota abaixo).
O parmetro verbose, caso presente, indica que o programa deve exibir mensagens indicando a situao da execuo.
Como sada gerado o arquivo direcoes.dat contendo a imagem direcional num formato
interno ao sistema. O formato descrito no arquivo src/bin/direction/direction.c, linhas 1722. Nota para futuro mantenedor: Esse formato grava cada direo como um double
inteiro, o que consome muito espao em disco. Utilizar um nmero xo de direes e fazer uma
aproximao no funciona, seria necessrio utilizar um processo de quantizao (GOMES;
VELHO, 1994).

Note que o formato da estrutura de dados para a imagem direcional est no arquivo include/direction
de forma que a imagem direcional possa ser utilizada em outros programas.
Parmetros em tempo de compilao: Alguns parmetros podem ser modicados apenas
em tempo de compilao. Obviamente, sua alterao requer que o sistema seja recompilado
(ver Seo 2.3).

17

O clculo da conabilidade da imagem direcional foi implementado em alguns mtodos


mas no pde ser aproveitado na classicao (mantenedor: futuramente, rever isto),
logo por padro no inserido no arquivo direcoes.dat (nem utilizado por outros
programas). Para modicar esta opo, edite a varivel global GERA_CONF nos arquivos

src/bin/direction/direction.c, linha 74 e src/bin/direction/kovesi.c, linha


67, alterando seu valor de 0 para 1.
Para realizar, nos mtodo de Kovesi e Pankanti, uma suavizao da imagem direcional
similar realizada no mtodo de Karu, modique a varivel TESTA_SUAVIZ nos arquivos

src/bin/direction/kovesi.c, linha 66 e src/bin/direction/pankanti.c, linha


62, aterando seu valor de 0 para 1. No mtodo de Pankanti, isso feito por padro.
Para o mtodo de Pankanti, pode-se imprimir o nmero de melhoras que o programa tentar realizar (isto til para testes): modique a varivel PRINT_MELHORAS no arquivo

src/bin/direction/pankanti.c, linha 61, alterando seu valor de 0 para 1. No entanto, a impresso s ocorre se a opo verbose for indicada.
No mtodo de Pankanti possvel denir o mximo de melhoras que o programa deve
tentar. Por padro utiliza-se 100. Para alterar modique a varivel LIM_MELHORAS no
arquivo src/bin/direction/pankanti.c, linha 60.
Nos mtodos de Pankanti e Hong, possvel denir o tamanho da vizinhana local
(tamanho de D em (JAIN; PANKANTI, 1999, p. 10)). Por padro utiliza-se 5, conforme indicado pelos autores. Para alterar modique a varivel TAM_VIZ nos arquivos

src/bin/direction/pankanti.c, linha 60 e src/bin/direction/hong.c, linha 61.


CLASSIFICAO DE IMPRESSES DIGITAIS
Sintaxe do comando:

classification <direcional> <imagem_original> <vizinhanca> [sem_blocos]


[verbose] [saida_pts]
<direcional> deve ser o caminho para o arquivo gerado pelo programa de clculo da
imagem direcional.

<imagem_original> deve ser o caminho para a imagem original (formato TIFF sem alpha;
ver descrio de conv_jpgtiff na Seo 4.2.3), de preferncia segmentada.

18

<vizinhanca> deve ser 2x2 ou 3x3. Recomenda-se utilizar 2x2; ver Seo 3.2.
O parmetro sem_blocos, caso presente, indica que o clculo do ndice de Poincar (ver
Seo 3.2) deve ser feito pixel a pixel. Recomenda-se utilizar esta opo. Caso no esteja
presente, o clculo feito por blocos (isto , s considerada a direo do bloco inteiro), o que
s deve ser feito se a vizinhana for do tipo 2x2.
O parmetro verbose, caso presente, indica que o programa deve exibir mensagens indicando a situao da execuo.
O parmetro saida_pts, caso presente, indica que o programa deve gerar um arquivo texto

singular_points.txt contendo a informao dos pontos singulares identicados (coordenadas e tipo), juntamente com uma imagem singularity.tiff, que consiste na imagem original
com os pontos singulares pintados (ncleos de vermelho, deltas de verde e verticilos em azul
verticilos, no entanto, no foram encontrados nos testes).
Como sada, o programa imprime na sada-padro o nmero da classe da impresso digital
(0 = arco, 1 = presilha esquerda, 2 = presilha direita, 3 = cicatriz, 4 = arco angular, 5 = verticilo).
Imagens com alto nvel de rudo, que no puderem ser classicadas como uma das classes
padro, sero classicadas como cicatriz (classe 3).
Parmetros em tempo de compilao: Alguns parmetros podem ser modicados apenas
em tempo de compilao. Obviamente, sua alterao requer que o sistema seja recompilado
(ver Seo 2.3).
Caso o clculo do ndice de Poincar seja realizado por blocos, o sistema supe blocos de
tamanho 16 16. Para alterar isto, modique o valor inicial da varivel TAM_BLOCO na
linha 73 do arquivo src/bin/classification/classification.c.
possvel modicar o nmero de mximo suavizaes que o programa deve tentar (pa-

dro = 10): modique o valor comparado com a varivel num_suaviz no arquivo src/bin/classifi
linha 187.
possvel imprimir o nmero de suavizaes que o programa tentar realizar (isto til

para testes): modique a varivel CONTA_SUAVIZ no arquivo src/bin/classification/classific


linha 78, alterando seu valor de 0 para 1. No entanto, a impresso s ocorre se a opo

verbose for indicada. Esta opo habilitada por padro.


Caso a opo saida_pts esteja indicada, possvel visualizar (na imagem singularity.tiff)
a linha que o algoritmo traa ao testar se a digital do tipo arco angular (caso ele alcance

19

esse ponto): modique a varivel VERIFICA_TA no arquivo src/bin/classification/classifica


linha 79, alterando seu valor de 0 para 1.
Caso a opo saida_pts esteja indicada, possvel visualizar (na imagem singularity.tiff)
o caminho que o algoritmo percorre em direo borda ao testar se a digital do tipo
presilha direita ou presilha esquerda (caso ele alcance esse ponto): modique a varivel

VERIFICA_LOOP no arquivo src/bin/classification/classification.c, linha 80,


alterando seu valor de 0 para 1. Para modicar o mximo de pontos percorridos, altere o
valor comparado com a varivel i na linha 456 do mesmo arquivo (padro = 50).
Para alterar o limite de erro no clculo do ndice de Poincar, altere a varivel LIM_ERRO_POINCARE
na linha 55 do arquivo src/bin/classification/poincare.c. O valor deve estar em
graus, deve ser inteiro e seu padro 5.
Para alterar a distncia mnima (exclusiva) entre dois pontos singulares, altere a varivel TAM_LIM_DIST na linha 56 do arquivo src/bin/classification/poincare.c. O
valor deve estar em pixeis, deve ser inteiro e seu padro 16 (a largura de um bloco
padro).

4.2.2

SUBSISTEMA DE COMPARAO

Esta seo descreve os programas relacionados ao problema de comparao de impresses


digitais (ver Seo 3.2).
MELHORAMENTO DE HONG
Sintaxe do comando:

hong_enhancement <imagem> <media> <variancia> [octave] [verbose]


<imagem> deve ser o caminho para uma imagem no formato TIFF sem alpha (ver descrio
de conv_jpgtiff na Seo 4.2.3).

<media> e <variancia> devem ser inteiros no intervalo [0, 255]. Ver referncias na Seo
3.2.
O parmetro verbose, caso presente, indica que o programa deve exibir mensagens indicando a situao da execuo.
Como sada, o programa gera a imagem normalizada normalized.tiff.

20

Parmetros em tempo de compilao: possvel modicar o tamanho do bloco utilizado


no melhoramento (por padro, utiliza-se 16 16). Para tanto, modique a varivel TAM_BLOCO
na linha 56 do arquivo src/bin/enhancement/hong.c. Obviamente, sua alterao requer que
o sistema seja recompilado (ver Seo 2.3).
FILTRAGEM DE GABOR
O programa para melhoramento da imagem com ltros de Gabor (ver Seo 3.2) no foi
concludo. O cdigo encontra-se na pasta src/bin/enhancement/gabor, arquivo gabor.c.
Ali h um scprit compila_gabor.sh que compila o cdigo, gerando o executvel gabor. Para
execut-lo:

gabor <imagem>
H tambm um diretrio octave com funes para teste no Octave. Para execut-los, edite
o arquivo inicializa.m, substituindo o diretrio /usr/local/gaudi-afis pelo diretrio no
qual o sistema foi instalado. Execute octave e, no terminal do Octave, digite os seguintes
comandos:

inicializa();
imgs = enh_gabor('<imagem>');
imagem deve ser o nome do arquivo de uma imagem no formato JPG. A varivel imgs
contm uma matriz de imagens ltradas. Cada imagem pode ser visualizada com o comando

show(imgs(:,:,i,j));, sendo i e j ndices inteiros e i [1, 3], j [1, 8].


H tambm no diretrio gabor uma implementao da FFT (Transformada Rpida de Fourier) (CORMEN et al., 2002, cap. 30) baseada na descrita em (MYLER; WEEKS, 1993), que
no est funcionando (arquivos fft.c e usa_fft.c). Seu uso foi substitudo pela biblioteca
FFTW4 . O script compila_fft.sh compila esse cdigo. Para test-lo, execute ./usa_fft. O
programa utiliza como entrada a imagem teste.tiff e gera como sada as imagens img_fft.tiff
e img_inv_fft.tiff (transformada e inversa da trasformada).
O futuro mantenedor, caso o nalize o programa de ltragem de Gabor, deve mover o
arquivo gabor.c para o diretrio superior (enhancement) e inclu-lo no Makefile. Ver arquivo

src/bin/thinning/Makefile como exemplo de como compilar mais de um programa no


4 http://www.fftw.org/

21

mesmo Makefile. No esquecer de incluir as bibliotecas -lfftw -lrfftw na varivel LLIBS.


Se possvel, criar um programa que integre os melhoramentos de Hong e Gabor (ver como
exemplo o programa src/bin/direction/direction.c). Lembrar tambm que necessrio,
ao recompilar, recriar o wisdom da biblioteca FFTW (consultar documentao referente).
AFINAMENTO
Sintaxe do comando:

thinning <imagem> <arquivo_mascaras> <passo_a_passo>


<imagem> deve ser o caminho para uma imagem no formato TIFF sem alpha (ver descrio
de conv_jpgtiff na Seo 4.2.3). Fornecer, de preferncia, uma imagem segmentada e melhorada.

<arquivo_de_mascaras> deve ser o caminho para um arquivo semelhante a thinning/mask.dat


ou thinning/mask2.dat, contendo mscaras a serem utilizadas no anamento (consulte referncias na Seo 3.2).

<passo_a_passo> deve ser 0 ou 1. Caso seja selecionado 1, o programa gera uma srie de
imagens com nomes no formato temp<i>-<j>.tiff (sendo i e j inteiros) com o passo-a-passo
do processo de anamento. Uma animao pode ser gerada utilizando o comando convert do
pacote ImageMagick5 (consultar documentao referente).
Como sada, o programa gera a imagem binarizada binarizado.tiff, a imagem anada

thin.tiff e imprime na sada-padro o nmero de passos realizados no anamento.


PODAMENTO
Sintaxe do comando:

poda <imagem> <arquivo_mascaras> <passo_a_passo> [verbose]


<imagem> deve ser o caminho para uma imagem anada no formato TIFF sem alpha. Utilizar a imagem fornecida pelo programa de anamento, descrito acima.

<arquivo_de_mascaras> deve ser o caminho para um arquivo semelhante a thinning/mask_poda.da


contendo mscaras a serem utilizadas no podamento (consulte referncias na Seo 3.2).
5 http://www.imagemagick.org/

22

<passo_a_passo> deve ser 0 ou 1. Caso seja selecionado 1, o programa gera uma srie de
imagens com nomes nos formatos original.tiff, temp<i>-<j>.tiff e dilata<i>.tiff
(sendo i e j inteiros) com o passo-a-passo do processo de podamento. Uma animao pode
ser gerada utilizando o comando convert do pacote ImageMagick (consultar documentao
referente).
O parmetro verbose, caso presente, indica que o programa deve exibir mensagens indicando a situao da execuo.
Aps o fornecimento dos parmetros, o programa aguarda na entrada-padro por um inteiro
informando o nmero de passos a ser utilizado no podamento. Recomenda-se utilizar o nmero
de passos fornecido pelo programa de anamento.
Note-se aqui que o usurio pode automatizar o processo de anamento-podamento redirecionando a sada-padro do anamento para um arquivo x e em seguida redirecionar a entradapadro do podamento para x. Por exemplo, supondo que o usurio se encontra no diretrio base
do sistema:

$ thinning img.tiff thinning/mask.dat 0 > x


$ poda thin.tiff thinning/mask_poda.dat 0 < x
Como sada, o programa gera a imagem anada poda.tiff.

4.2.3

PROGRAMAS AUXILIARES

Esta seo descreve o funcionamento dos programas auxiliares ao sistema.


confusion - gera uma matriz de confuso6 com base em um arquivo com os resultados esperados e outro arquivo com os resultados de teste. Os arquivos devem estar em
modo texto e devem conter um inteiro no intervalo [0, MAX_CLASSES[ por linha, cada
inteiro representando uma classe (ver classes na descrio do programa de classicao
na Seo 4.2.1). Os dois arquivos devem possuir o mesmo nmero de resultados. Para
alterar o nmero de classes (padro = 6), edite a varivel NUM_CLASS na linha 39 do arquivo src/etc/confusion.c, altere o caracter-nome das classes na linha 44 do mesmo
arquivo e recompile o sistema (ver Seo 2.3). Parmetros: <arquivo_classes_reais>

<arquivo_classes_teste>. A matriz de confuso impressa na sada-padro.


6 http://en.wikipedia.org/wiki/Confusion_matrix

23

conv_cjpegb - converte uma imagem RAW (gerada pelo comando dwsq do NFIS) numa
imagem no formato JPEGB (ver documentao do NFIS), utilizando o comando cjpegb
do NFIS. Parmetros: <qualidade> <formato> <imagem> <arquivo NCM> (sugere-se
utilizar os valores 95 para a qualidade e jpg para o formato). A imagem convertida gerada com o mesmo nome da fornecida e com o formato especicado. Para utilizar a imagem resultante no sistema, converta-a em seguida utilizando o comando conv_jpgtiff
(ver abaixo).
conv_jpgtiff - converte uma imagem JPEG em uma imagem no formato TIFF aceito
pelo sistema (sem alpha), utilizando o modo Batch do programa GIMP7 . Note que o comando convert da ferramenta ImageMagick no produz o formato desejado. Parmetro:
imagem de entrada. A imagem de sada gerada com o nome digital.tiff.
edit_res - edita o resultado de um arquivo gerado pelo programa testa (ver descrio
abaixo). Limpa o resultado, exibindo apenas o valor de tempo de cada teste. Ao nal,
exibe o valor da mdia e do desvio padro dos dados fornecidos. Parmetros: arquivo de
resultados. O resultado gravado num arquivo com nome idntico ao arquivo de entrada
mais o suxo _ed.
gaussian - efetua um borramento gaussiano sobre uma imagem no formato aceito pelo
sistema (ver descrio de conv_jpgtiff acima). Este programa s deve ser utilizado
para testes, por ser acoplado e ter baixo desempenho; o sistema deve utilizar as funes
da biblioteca de manipulao de sinais (ver Seo 4.3.2). Parmetros: imagem a ser borrada e desvio da funo gaussiana (nmero decimal). O resultado gravado na imagem

gaussian.tiff.
testa - executa testes de desempenho de um programa. Executa o comando 30 vezes,
testando seu tempo de execuo (30 o mnimo necessrio para obter-se uma distribuio
normal das medidas8 ). Para alterar o nmero de testes, modique a varivel NUM_TESTES
na linha 40 do arquivo src/etc/testa.c e recompile o sistema (ver Seo 2.3). Parmetros: arquivo no qual os resultados sero gravados, caminho para o comando a ser
executado nos testes (pode apenas o nome do comando, se o mesmo estiver nos diretrios
do PATH do sistema) e os argumentos para o programa a ser testado. Recomenda-se nalizar todos os aplicativos em execuo (inclusive, se possvel, o gerenciador de janelas)
durante a execuo dos testes, a m de obter-se medidas conveis.
7 http://www.gimp.org/tutorials/Basic_Batch/
8 http://www.ufpa.br/dicas/biome/bionor.htm

24

tiff2octave - converte uma imagem TIFF no padro do sistema (ver descrio de

conv_jpgtiff acima) no formato de imagem-matriz do Octave (que pode ser lido utilizando a funo loadimage. Parmetros: imagem a ser convertida, caminho para o
arquivo a ser gerado. Consultar documentao do Octave para maiores informaes.
xor - calcula a funo ou exclusivo entre duas imagens em tons de cinza (no formato
TIFF sem alpha; ver comando conv_jpgtiff acima) (GONZALEZ; WOODS, 2002).
Parmetros: caminhos para as duas imagens a serem comparados. O resultado gravado
no arquivo xor.tiff.
connected_componentes (executvel no diretrio inutil) - calcula o maior componente conectado de uma imagem (SERRA, 1982, p. 4142). Em seguida, recorta a imagem, deixando apenas a rea do maior componente conectado. Este programa no est
funcionando bem, principalmente por ter um desempenho intratvel. Parmetros: imagem. gravado um arquivo lista_pts.dat com a lista dos pixels da regio calculada;
a imagem recortada gravada no arquivo recorte.tiff.
H ainda, no diretrio src/etc/plota_min, o incio da implementao de um programa
para pintar um conjunto de mincias em uma imagem de impresso digital (arquivo plota.c).
As mincias devem estar descritas em um arquivo no formato XYT do NFIS com o nome

finger.xyt, e a imagem deve estar no formato TIFF sem alpha com o nome finger.tiff
(ver acima descrio de conv_jpgtiff). No se sabe se as coordenadas no arquivo XYT esto
sendo interpretadas corretamente. O resultado gravado no arquivo finger+min.tiff. Para
compilar o programa, execute o script compila_plota.sh. H ainda uma tentativa de obter-se
o mesmo resultado utilizando a ferramenta GNUPlot9 no arquivo combina.sh, no entanto h
uma translao entre a imagem das mincias e a imagem da impresso digital. Mantenedor:
aps obter um resultado razovel e correto, o programa deve ser modicado para receber o
nome dos arquivos de entrada como parmetro.

4.3

BIBLIOTECAS AUXILIARES

Esta seo apresenta uma descrio das bibliotecas do sistema. Para uma descrio da
biblioteca IM, consulte http://www.tecgraf.puc-rio.br/im/.
9 http://www.gnuplot.info/

25

4.3.1

BIBLIOTECA DE MANIPULAO DE IMAGENS EM TONS DE


CINZA

Arquivo-cabealho: include/proc_img.h - declara os tipos Tcor (cor, equivalente a

unsigned char), Imagem e MapaCinza e as consantes PRETO, CINZA, BRANCO (cores) e tam_pal_cinza
(tamanho da paleta e tons de cinza).
Funes:
int abrirImagem (Imagem *img, char *nome_arq);
abre a imagem do arquivo nome_arq. A estrutura img j deve estar alocada, mas no
inicializada. Retorna 0 se obteve sucesso.
Tcor corImagem (Imagem *img, int x, int y, int tipo_ext);
obtm a cor da imagem img no pixel [x, y]. tipo_ext indica o tratamento para pixels
alm das bordas: se 0, retorna PRETO; se 1, retorna BRANCO. Retorna -1 em caso de erro.
void apagarImagem (Imagem *img);
desaloca contedo da estrutura img. No desaloca a estrutura em si.
void inicializa_paleta (void);
inicializa a paleta de tons de cinza.
int criaMapaCinza (MapaCinza *img, int larg, int alt);
cria um mapa de tons de cinza com as dimenses larg e alt. A estrutura img j deve
estar alocada, mas no inicializada. Retorna 0 se obteve sucesso.
Tcor corMapaCinza (MapaCinza *img, int x, int y, int tipo_ext);
obtm a cor do mapa de tons de cinza img no pixel [x, y].tipo_ext indica o tratamento
para pixels alm das bordas: se 0, retorna PRETO; se 1, retorna BRANCO. Retorna -1 em
caso de erro.
int mudaCorMapaCinza (MapaCinza *img, int x, int y, Tcor cor);
altera a cor do mapa de tons de cinza img no pixel [x, y]. Retorna 0 se obteve sucesso.
int gravaMapaCinza (MapaCinza *img, char *nome_arq);
grava o mapa de tons de cinza img no arquivo nome_arq. Retorna 0 se obteve sucesso.
void apagaMapaCinza (MapaCinza *img);
desaloca contedo da estrutura img. No desaloca a estrutura em si.

26

4.3.2

BIBLIOTECA DE MANIPULAO DE SINAIS 2D

Arquivo-cabealho: include/proc_sinal.h - declara o tipo MapaSinal2d. Note que


este tipo declarado como um ponteiro para uma estrutura.
Funes:
int criaMapaSinal2d(MapaSinal2d *img, int larg, int alt);
cria um mapa de sinal 2D com as dimenses larg e alt. O objeto resultante inicializado com zeros e gravado no endereo indicado pelo ponteiro img (mantenedor:
aparentemente, isto est causando vazamento de memria, devido a uma suposio sobre
o comportamento da funo malloc. Quando tenta-se alocar um ponteiro com tamanho

sizeof(MapaSinal2d*), parece estar alocando a estrutura e no apenas o ponteiro. O


mesmo parece ocorrer quando se declara uma varivel do tipo MapaSinal2d). Retorna 0
se obteve sucesso.
int inicializaMapaSinal2d(MapaSinal2d img, double valor);
inicializa o mapa de sinal 2D com o valor valor. Supe que o mapa esteja inicializado
(isto , alocado/criado). Retorna 0 se obteve sucesso.
double valorMapaSinal2d(MapaSinal2d img, int x, int

y, int tipo_ext);
obtm o valor do mapa de sinal 2D img no ponto [x, y]. tipo_ext indica o tratamento
para pontos alm das bordas: se 0, retorna 0.0; se 1, retorna +; se 2, retorna o valor do
ponto da borda mais prximo. Retorna + em caso de erro.
int setaMapaSinal2d(MapaSinal2d img, int x, int y, double valor);
altera o valor do mapa de sinal 2D img no ponto [x, y] para valor. Retorna 0 se obteve
sucesso.
int copiaMapaSinal2d(MapaSinal2d img_in, MapaSinal2d img_out);
copia os valores do mapa de sinal 2D img_in para img_out. Supe que ambas as imagens
j esto inicializadas. Retorna 0 se obteve sucesso.
void apagarMapaSinal2d(MapaSinal2d img);
desaloca contedo da estrutura img e a estrutura em si (mantenedor: problema de vazamento de memria tambm se aplica aqui).

27

MapaSinal2d filtrarMapaSinal2d(MapaSinal2d img,

MapaSinal2d kernel, MapaSinal2d outp);


ltra o mapa img com o ncleo kernel, retornando o resultado (isto , convolui img
com kernel). img e kernel devem estar inicializados. Se outp estiver inicializado, a
sada ser gravada nele; seno, ser alocada uma nova estrutura (passe NULL para sempre
alocar). Caso outp esteja inicializado, deve ter as mesmas dimenses de img. Retorna

NULL em caso de erro.


MapaSinal2d gradienteMS2d(MapaSinal2d img, char var,

MapaSinal2d outp);
calcula o gradiente do mapa img em relao varivel var (que deve ser 'x' ou 'y'. So
utilizadas mscaras de Sobel10 para o clculo. Se outp estiver inicializado, a sada ser
gravada nele; seno, ser alocada uma nova estrutura (passe NULL para sempre alocar).
Caso outp esteja inicializado, deve ter as mesmas dimenses de img. Retorna NULL em
caso de erro.
MapaSinal2d opAritMS2d(MapaSinal2d op1, MapaSinal2d op2,

char op, MapaSinal2d outp);


calcula uma operao aritmtica ponto-a-ponto entre dois mapas. Os dois mapas devem
estar inicializados e devem ter as mesmas dimenses. op dene a operao e deve ser '+',

'-', '*', ou '/'. Se outp estiver inicializado, a sada ser gravada nele; seno, ser alocada uma nova estrutura (passe NULL para sempre alocar). Caso outp esteja inicializado,
deve ter as mesmas dimenses de op1 e op2. Retorna NULL em caso de erro.
MapaSinal2d multEscalarMS2d(MapaSinal2d op, double

escalar, MapaSinal2d outp);


multiplica cada elemento do mapa op pelo escalar escalar. op deve estar inicializado.
Se outp estiver inicializado, a sada ser gravada nele; seno, ser alocada uma nova
estrutura (passe NULL para sempre alocar). Caso outp esteja inicializado, deve ter as
mesmas dimenses de op. Retorna NULL em caso de erro.
MapaSinal2d somaEscalarMS2d(MapaSinal2d op, double

escalar, MapaSinal2d outp);


soma cada elemento do mapa op com o escalar escalar. op deve estar inicializado.
Se outp estiver inicializado, a sada ser gravada nele; seno, ser alocada uma nova
10 http://www.pages.drexel.edu/~weg22/edge.html

28

estrutura (passe NULL para sempre alocar). Caso outp esteja inicializado, deve ter as
mesmas dimenses de op. Retorna NULL em caso de erro.
MapaSinal2d aplicaFuncMS2d(MapaSinal2d op, double

(*f)(double x), MapaSinal2d outp);


aplica uma funo f: double -> double em cada elemento do mapa op. op deve estar
inicializado. Se outp estiver inicializado, a sada ser gravada nele; seno, ser alocada
uma nova estrutura (passe NULL para sempre alocar). Caso outp esteja inicializado, deve
ter as mesmas dimenses de op. Retorna NULL em caso de erro.
MapaSinal2d aplicaFunc2argMS2d(MapaSinal2d op1,

MapaSinal2d op2, double (*f)(double y, double x), MapaSinal2d


outp);
aplica uma funo f: (double, double) -> double em cada par de elementos dos mapas

op1 e op2 de mesma posio. O elemento de op1 fornecido como primeiro parmetro da funo; o elemento de op2 como o segundo. Note que a funo fornecida deve
considerar y como sendo o primeiro parmetro. op1 e op2 devem estar inicializados e
devem ter as mesmas dimenses. Se outp estiver inicializado, a sada ser gravada nele;
seno, ser alocada uma nova estrutura (passe NULL para sempre alocar). Caso outp esteja inicializado, deve ter as mesmas dimenses de op1 e op2. Retorna NULL em caso de
erro.
MapaSinal2d filtroGabor(MapaSinal2d img, int nscale, int

norient, int minWaveLength, int mult, double sigmaOnf, double


dThetaOnSigma);
a implementar.
MapaSinal2d GaussianKernel(int sigma);
retorna um ncleo gaussiano com desvio sigma. Retorna NULL em caso de erro.

4.3.3

BIBLIOTECA DE LISTA LIGADA

Arquivo-cabealho: include/listaligada.h - declara os tipos ChaveLL (o elemento


a ser gravado na lista, composto das coordenadas de um pixel), ElemLL (o n da lista) e

ListaLigada.
Funes:

29

void inicializaLL(ListaLigada *l);


inicializa uma lista ligada. A estrutura l j deve estar alocada, mas no inicializada.
int buscaLL(ListaLigada *l, ChaveLL *ch);
retorna 1 se existe um elemento com chave idntica a ch em l; retorna 0, caso contrrio.
int insereLL(ListaLigada *l, ChaveLL *ch);
insere (ordenadamente) um elemento com chave ch na lista l. Se o elemento j existia na
lista, retorna 1; seno, retorna 0.
int gravaArquivoLL(ListaLigada *l, char *nome_arq);
grava a lista l no arquivo nome_arq. O arquivo gravado em formato binrio, como uma
sucesso de coordenadas x e y. No aceita uma lista vazia. Retorna 0 se obteve sucesso.
void apagarLL(ListaLigada *l);
desaloca contedo da estrutura l. No desaloca a estrutura em si.
Nota para futuro mantenedor: Nesta biblioteca no est sendo feito qualquer tratamento
de erros. Modicar isto.

4.3.4

BIBLIOTECA DE FILA DE PRIORIDADES

Arquivo-cabealho: include/filaprioridade.h - declara os tipos ElemFP (o elemento a


ser gravado na la, composto de um double o valor a ser gravado e um long a prioridade
do elemento na la) e FilaPrioridades. Note que esses tipos so declarados como ponteiros
para estruturas.
Para entender las de prioridades, consulte (CORMEN et al., 2002, Seo 6.5).
Funes:
ElemFP criaElemFP(double valor, long chave);
cria e retorna um elemento da la com valor valor e prioridade chave. Retorna NULL
em caso de erro.
int inicializaFP(FilaPrioridades *f);
cria um la de prioridades e inicializa-a. O objeto resultante gravado no endereo
indicado pelo ponteiro f (mantenedor: vericar problema com vazamento de memria
aqui tambm). Retorna 0 se obteve sucesso.

30

void apagarFP(FilaPrioridades f);


desaloca contedo da estrutura f e a estrutura em si (mantenedor: vericar se problema
de vazamento de memria tambm se aplica aqui).
int insereFP(FilaPrioridades f, ElemFP elem);
insere elemento elem na la de prioridades f. Retorna 0 se obteve sucesso.
int insereValorFPnrep(FilaPrioridades f, double valor);
insere o valor valor na la f, aumentando sua prioridade (evitando repeties de elementos). Retorna 0 se obteve sucesso.
ElemFP maximoFP(FilaPrioridades f);
retorna o elemento com maior prioridade na la f. Em caso de erro, ou se a la estiver
vazia, retorna NULL.
double valorMaximoFP(FilaPrioridades f);
retorna o valor do elemento de maior prioridade na la f. Em caso de erro, naliza o
programa (mantenedor: melhorar isto).
ElemFP retiraMaxFP(FilaPrioridades f);
retira o elemento com maior prioridade na la f e retorna-o. Em caso de erro, retorna

NULL.
int aumentaChaveFP(FilaPrioridades f, long i, ElemFP elem);
substitui o elemento na posio i da la f por elem. A substituio, no entanto, s ocorre
se a prioridade de elem for maior que a prioridade antiga na posio i. Retorna 0 se
obteve sucesso.

4.3.5

BIBLIOTECA DE MENSAGENS DE ERRO PADRO

Arquivo-cabealho: include/erros.h.
Funes:
void erro_img(void);
Mensagem de erro informando imagem no inicializada.

31

void erro_memoria(void);
Mensagem de erro informando erro com alocao de memria.
void erro_escreve_arq(void);
Mensagem de erro informando erro na gravao de arquivo.
void erro_le_arq(void);
Mensagem de erro informando erro na leitura de arquivo.

32

DIFICULDADES ASSOCIADAS AO
DESENVOLVIMENTO

A principal diculdade no desenvolvimento do Gaudi-AFIS foi a no-utilizao de bibliotecas de manipulao de imagens e de processamento de sinais prontas. Tentou-se ainda utilizar
GSL1 , no entanto boa parte do cdigo j estava implementado, logo no valia a pena refazer
tudo.
O fato de a verso utilizada da biblioteca IM (2.6) s funcionar com imagens TIFF sem
alpha tambm foi um incoveniente, j que um bom tempo foi gasto em pesquisa sobre converso
de formatos.
O sistema foi reestruturado diversas vezes, a m de se obter uma estrutura melhor, mas
principalmente (e infelizmente) para obter melhor desempenho, principalmente relacionado a
uso de memria (o que, infelizmente, no foi alcanado por completo).
Uma coisa que ajudou bastante foi o uso de Makeles2 . Alm disso, o fato de sistemas AFIS
terem uma arquitetura bem denida na literatura (do tipo canos e ltros, do ingls pipe and
lter3 ) e de tal tipo de arquitetura ser inerente ao Linux (herdado do UNIX) facilitou bastante o
projeto do sistema.
Pequenos detalhes tambm implicaram em melhorias absurdas de desempenho; a principal
foi a troca da ordem dos fors durante laos em imagens ou mapas de sinais: devido utilizao
de uma matriz, colocar a segunda dimenso (y) no for mais externo leva a um desempenho
melhor, j que o vetor acessado sequencialmente. Problemas em associar as dimenses com
o formato cartesiano xado na mente tambm ocorreram. Outro exemplo: um pequeno erro no
programa de segmentao de imagens (que foi corrigido) levava a uma pssima taxa de acerto
na classicao inteira.

1 http://www.gnu.org/software/gsl/

2 http://www.hsrl.rutgers.edu/ug/make_help.html

3 http://www.dossier-andreas.net/software_architecture/pipe_and_filter.html

33

REFERNCIAS BIBLIOGRFICAS
AMENGUAL, J. C. et al. Real-time minutiae extraction in ngerprint images. In: Sixth
International Conference on Image Processing and Its Applications. Washington, DC, USA:
IEEE Computer Society, 1997. v. 2, p. 871875.
CORMEN, T. H. et al. Algoritmos: teoria e prtica. Rio de Janeiro: Elsevier, 2002. Traduo
da 2a edio americana.
COSTA, S. M. F. Classicao e Vericao de Impresses Digitais. Dissertao (Mestrado)
Universidade de So Paulo, 2001.
FACON, J. Algoritmo de Anamento de Holt. 2004. Pontifcia Universidade Catlica do Paran.
Disponvel em <http://www.ppgia.pucpr.br/~facon/Afinamento/AfinamentoHolt3.
pdf>.
GOMES, J.; VELHO, L. Computao Grca: Imagem. Rio de Janeiro, Brasil: IMPA:
Instituto de Matemtica Pura e Aplicada e SBM: Sociedade Brasileira de Matemtica, 1994.
ISBN 85-244-0088-9.
GONZALEZ, R. C.; WOODS, R. E. Digital Image Processing. 2nd. ed. New York: Prentice
Hall, 2002.
HONG, L.; WAN, Y.; JAIN, A. K. Fingerprint image enhancement: Algorithms and
performance evaluation. IEEE Transactions on Pattern Analysis and Machine Intelligence,
v. 20, n. 8, p. 777789, 1998. ISSN 0162-8828.
JAIN, A.; PANKANTI, S. Fingerprint Classication and Matching. Department of Computer
Science, Michigan State University, East Lansing, MI, USA, 1999. Technical Report
MSU-CPS-99-5.
JAIN, A. K.; HONG, L.; BOLLE, R. On-line ngerprint verication. IEEE Transactions on
Pattern Analysis and Machine Intelligence, v. 19, n. 4, p. 302313, 1997.
KARU, K.; JAIN, A. K. Fingerprint Classication. Department of Computer Science,
Michigan State University, East Lansing, MI, USA, 1999. Technical Report MSU-CPS-99-21.
KOVESI, P. Matlab Functions for Image Processing. 2005. University of Western Australia.
Acessado em: Julho de 2007. Disponvel em: <http://www.csse.uwa.edu.au/~pk/
research/matlabfns/>.
LIMA, M. S. de; FERREIRA JNIOR, P. E. Classicao de impresses digitais via anlise
de pontos singulares. In: Workshop of Undergraduate Work, XX Brazilian Symposium
on Computer Graphics and Image Processing. Belo Horizonte, MG, Brazil: Sociedade
Brasileira de Computao, 2007. Disponvel em <http://wiki.dcc.ufba.br/pub/Gaudi/
Publicacoes/wuw-sibgrapi2007-published.pdf>.

34

MAINTZ, T. Digital and Medical Image Processing. 2007. Utrecht University. Disponvel em
<http://www.cs.uu.nl/docs/vakken/imgp/>.
MAIO, D.; MALTONI, D. Direct gray-scale minutiae detection in ngerprints. IEEE
Transactions on Pattern Analysis and Machine Intelligence, v. 19, n. 1, p. 2740, 1997.
MALTONI, D. et al. Handbook of Fingerprint Recognition. New York: Springer-Verlag, 2003.
MYLER, H. R.; WEEKS, A. R. Computer Imaging Recipes in C. Englewood Cliffs, NJ, USA:
Prentice-Hall, 1993.
SERRA, J. Image Analysis and Mathematical Morphology. Orlando, FL, USA: Academic
Press, 1982.
THE Henry Classication System. 2003. International Biometric Group. Disponvel em
<http://www.biometricgroup.com/Henry%20Fingerprint%20Classification.pdf>.
WATSON, C. I. NIST Special Database 14, Fingerprint Database. National Institute of
Standards and Technology, 1993.

35

APNDICE A -- LICENCIAMENTO

Este apndice apresenta o licenciamento do projeto Gaudi-AFIS. O cdigo do projeto em


si est licenciado sob a GPL verso 2, na seguinte forma:

Copyright (C) 2007

Murilo Santos de Lima

Projeto Biometrica
Grupo de Engenharia de Algoritmos e Programao Distribuda
Departamento de Cincia da Computao
Instituto de Matemtica
Universidade Federal da Bahia
http://gaudi.dcc.ufba.br/
under support of Fundao de Amparo Pesquisa do Estado da Bahia
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

See the

GNU General Public License for more details.


You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
O arquivo GPLv2.txt no diretrio raiz do projeto contm uma cpia da GPL verso 2.

36

A biblioteca IM do laboratrio Tecgraf/PUC-Rio e as Funes Matlab para Processamento


de Imagens de Peter Kovesi tm suas licenas especcas, apresentadas a seguir. Tais licenas
tambm esto presentes no arquivo LICENSE.

A.1

BIBLIOTECA IM - TECGRAF / PUC-RIO

Copyright c 1994-2007 Tecgraf / PUC-Rio and PETROBRAS S/A.


Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

A.2

FUNES MATLAB PARA PROCESSAMENTO DE


IMAGENS DE PETER KOVESI

Copyright (c) 1995-2007 Peter Kovesi


School of Computer Science & Software Engineering
The University of Western Australia
http://www.csse.uwa.edu.au/
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to

37

use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
The software is provided "as is", without warranty of any kind, express or
implied, including but not limited to the warranties of merchantability, fitness
for a particular purpose and noninfringement. In no event shall the authors or
copyright holders be liable for any claim, damages or other liability, whether
in an action of contract, tort or otherwise, arising from, out of or in
connection with the software or the use or other dealings in the software.