FACULDADE FARIAS BRITO
CIÊNCIA DA COMPUTAÇÃO
ANTONIO VINICIUS G. DE LIMA
Processamento de imagens para identificação de placas de
automóveis
Fortaleza, 2009
ANTONIO VINICIUS G. DE LIMA
Processamento de imagens para identificação de placas de
automóveis
Monografia apresentada para obtenção dos
créditos da disciplina Trabalho de Conclusão
do Curso da Faculdade Farias Brito, como
parte das exigências para graduação no Curso
de Ciência da Computação.
Orientadora: Wietske I. Meyering, Dra.
Fortaleza, 2009
PROCESSAMENTO DE IMAGENS PARA IDENTIFICAÇÃO
DE PLACAS DE AUTOMÓVEIS
Antonio Vinicius G. de Lima
NOTA:
Data: /
/
BANCA EXAMINADORA:
Dra. Wietske Ineke Meyering
Orientadora
MSc. Roberto de Almeida Façanha
Examinador
MSc. José Belo Aragão Júnior
Examinador
FINAL (0 – 10):
__
“staying awake to chase the dream”
Muse
Dedico este trabalho a minha família, em especial a minha
mãe, pois representaram a motivação central para a
conclusão do mesmo.
AGRADECIMENTOS
Á
Orientadora
Dra
Wietske
Meyering,
pela
gerência,
criatividade,
ajuda,
disponibilidade e certeza da realização deste trabalho o que permitiu que o projeto fosse
concluído com qualidade.
Á Juliana Ponte por incentivar, criticar, relembrar, entreter, revisar e me alertar, tarefas
que exigiram esforço e jogo de cintura. Agradecê-la principalmente por não desistir de
carregar este fardo.
Á Godva Grace por acreditar, por entender e principalmente por me lembrar que existia
um ‘após’, pelo incentivo em todos os momentos e pelas palavras de conforto sempre que
preciso.
Aos amigos pessoais e profissionais por se colocarem a disposição e se mostrarem
prontos a ajudar sempre. Em especial a Elidiane, Tatiana, Rosanne e Rosiane.
Aos professores e colegas de curso que ajudaram de maneira direta ou indireta para a
minha formação.
E a todos que contribuíram de alguma forma para a realização deste trabalho.
RESUMO
O estado da arte da área de Processamento de Imagens é composto por estudos para soluções
especializadas, em especial quando se trata do reconhecimento de caracteres. Esta vertente de
estudo, especificamente, é composta por soluções que são destinadas a um grupo limitado de
imagens e cuja migração a outros domínios de aplicação necessita de um esforço enorme de
reescrita da aplicação. A área como um todo apresenta o agravante de não possuir um
catalisador de novos pesquisadores, o que limita o escopo de estudos realizados. O trabalho
busca desenvolver a partir da construção de uma base teórica sólida e com facilidade de
entendimento a ingressantes na área, desenvolver os módulos de processamento básico e
intermediário de um protótipo de reconhecimento de caracteres em placas de automóveis.
Para realização deste procedimento foi implementada uma forma de segmentação da imagem
que separe o código de identificação da placa do resto da imagem, através da identificação da
borda. Para além do protótipo como resultado o projeto prevê que o documento final possa ser
utilizado como um modelo para desenvolvimento de outros protótipos na área.
Palavras chave: imagens, desenvolvimento, protótipo, caracteres, segmentação.
SUMÁRIO
INTRODUÇÃO ................................................................................................................................................... 14
1.
REFERENCIAL TEÓRICO ..................................................................................................................... 18
1.1
Definição ............................................................................................................................................18
1.2
A Imagem Digital ................................................................................................................................19
1.3 Processamento de Imagens Digitais ...................................................................................................21
1.3.1 Segmentação ....................................................................................................................................... 23
1.3.1.1
Segmentação por Descontinuidade ............................................................................................ 24
1.3.1.2
Segmentação por Similaridade ................................................................................................... 27
1.3.2 Morfologia Matemática ....................................................................................................................... 29
1.4 Reconhecimento de Padrões ..............................................................................................................33
1.4.1 Métodos de Abordagem ...................................................................................................................... 34
1.5
2.
Linguagem Matlab..............................................................................................................................35
FERRAMENTAS DE DESENVOLVIMENTO ....................................................................................... 38
2.1
MathWorks™ Matlab .........................................................................................................................38
2.2
GNU Octave........................................................................................................................................39
2.3
Base de Dados ....................................................................................................................................41
2.4
Desenvolvimento de Interface com o Usuário ....................................................................................41
3.
DESENVOLVIMENTO DO PROTÓTIPO ............................................................................................. 43
3.1
Módulos .............................................................................................................................................43
3.2
Integração dos Módulos .....................................................................................................................45
3.3
Implementação da Base de Dados......................................................................................................46
4.
TESTES ....................................................................................................................................................... 48
4.1
Massa de Teste...................................................................................................................................48
4.2
Realização dos Testes .........................................................................................................................50
4.3
Critérios de Aceitação dos Scripts .......................................................................................................51
4.4
5.
Resultados Obtidos ............................................................................................................................52
DOCUMENTAÇÃO ................................................................................................................................... 64
5.1
Desenvolvimento do Protótipo ..........................................................................................................64
5.2
Realização dos Testes .........................................................................................................................65
6.
CONCLUSÕES ........................................................................................................................................... 67
7.
TRABALHOS FUTUROS ......................................................................................................................... 71
REFERÊNCIAS BIBLIOGRÁFICAS............................................................................................................... 73
MATERIAL DE ESTUDO ................................................................................................................................. 76
APÊNDICE A – MODELOS DE FORMATO DOS ARQUIVOS FONTE.................................................... 78
APÊNDICE B – MODELOS DE PLANILHA DE CONTROLE DE RESULTADO DOS TESTES .......... 79
APÊNDICE C – CÓDIGOS DA IMPLEMENTAÇÃO ................................................................................... 80
APÊNDICE D – MASSA DE TESTES .............................................................................................................. 93
ANEXO I - CONSTRUÇÃO DA INTERFACE ............................................................................................. 105
ANEXO II - CONEXÃO COM O BANCO..................................................................................................... 109
LISTA DE FIGURAS
Figura 1 - Imagens digitais com tamanho igual e resolução diferente (SCURI, 2002)......................... 20
Figura 2 - Representação da vizinhança de um pixel ............................................................................ 21
Figura 3 - Níveis de Processamento (GONZALEZ; WOODS, 2000, p. 408) ...................................... 22
Figura 4 - Máscaras:(a) detecção de pontos e de linhas (b) Horizontal (c) Vertical (d) +45º (e) -45º .. 25
Figura 5 - Exemplos de Histograma (LEITE, 2004) ............................................................................. 26
Figura 6 - (a) Imagem tratada com um filtro ,(b) operador de Roberts ,(c)operador de Sobel e
exemplos de máscaras utilizadas em (d) Roberts e em (e) Sobel. (FELGUEIRAS, 2007, alterada) .... 27
Figura 7 - Máscara utilizada no operador Laplaciano ........................................................................... 27
Figura 8 - Exemplo da aplicação da limiarização (a) Imagem original em tons de cinza (b) Imagem
binarizada por limiarização (LEITE, 2004) .......................................................................................... 28
Figura 9 - Exemplos de Elementos Estruturantes de formas comuns: (a) Cruz e o (b) Quadrado.
(NEVES, 2003) ..................................................................................................................................... 30
Figura 10 - Exemplos de (ii) erosão e (iii) dilatação sobre a imagem apresentada em (i). (GONZALEZ;
WOODS, 2000) ..................................................................................................................................... 31
Figura 11 - Exemplos de (a) Abertura e (b) Fechamento. (GONZALEZ; WOODS, 2000) ................. 32
Figura 12 - Tela inicial Matlab R2007b. ............................................................................................... 39
Figura 13 - Tela inicial Octave 3.2.3. .................................................................................................... 40
Figura 14 – Exemplos de imagens da massa de testes básica. Caracteres (i, ii e iii) e linhas(iv, v, vi,
vii, viii) .................................................................................................................................................. 49
Figura 15 – Exemplos de imagens de calibração. Criada (i, ii e iii) e simulação(iv, v, vi,) .................. 49
Figura 16 – Exemplos de imagens utilizadas no teste provenientes da base de imagens do CBPF/MCT
............................................................................................................................................................... 50
Figura 17 – Exemplo da planilha de rastreabilidade dos identificadores dos códigos. ......................... 51
Figura 18 - Adição das imagens (i) e (ii), resultando em (iii). Função executada no Matlab. .............. 53
Figura 19 - Subtração das imagens (i) e (ii), resultando em (iii). Função executada no Matlab. .......... 54
Figura 20 – Histograma (ii) da imagem(i) com a função executada no Matlab. ................................... 55
Figura 21 - Histograma (ii) da imagem binária (i) com a função executada no Octave. ...................... 55
Figura 22 – Imagem original proveniente da base de imagens. ............................................................ 55
Figura 23 - Histograma da imagem 22 sem equalização....................................................................... 56
Figura 24 – Imagem equalizada proveniente da execução da função no Matlab na imagem exibida na
figura 22. ............................................................................................................................................... 56
Figura 25 – Histograma equalizado da imagem 23 – execução no Matlab ........................................... 56
Figura 26– Resultado (ii) da aplicação da função de abertura em uma imagem binária (i) no Octave. 57
Figura 27 – Resultado (ii) da aplicação da função de abertura em uma imagem em tons de cinza (i)
realizada no Matlab. .............................................................................................................................. 57
Figura 28 – Aplicação da função de fechamento na imagem (i) resultando na imagem (ii), realizada no
Matlab. .................................................................................................................................................. 58
Figura 29 – Aplicação da função de fechamento na imagem (i) resultando na imagem (ii), operação
realizada no Octave. .............................................................................................................................. 58
Figura 30 - Resultado (ii) da aplicação da função de esqueletonização na imagem (i) no Matlab. ...... 59
Figura 31 – Resultado da aplicação de detecção de linhas horizontais (ii) e verticais (iii) na imagem (i)
no Octave. ............................................................................................................................................. 59
Figura 32 – Resultado da aplicação de detecção de linhas 45º negativo (ii) e positivos (iii) na imagem
(i) no Octave. ......................................................................................................................................... 60
Figura 33 – Resultado da aplicação de detecção de linhas (ii) na imagem (i) no Matlab. .................... 60
Figura 34 – Resultado (ii) da aplicação do script de detecção de bordas na imagem (i). Executada no
Matlab. .................................................................................................................................................. 61
Figura 35 – Resultado (ii) da aplicação da função de segmentação na imagem (i). Executada no
Matlab. .................................................................................................................................................. 61
Figura 36 – Fluxograma para imagens da base de dados CBPF/MCT.................................................. 62
Figura 37 – Fluxograma para imagens genéricas. ................................................................................. 63
LISTA DE TABELAS
Tabela 1: Sites com informações matlab .............................................................................................................. 39
Tabela 2: Sites com informações octave .............................................................................................................. 40
Tabela 3: Descrição das colunas da tabela “ext_dados” ....................................................................................... 47
Tabela 4: Resultado após os testes dos scripts ..................................................................................................... 52
14
INTRODUÇÃO
A utilização de símbolos para aquisição, guarda e transposição de conhecimento é
um costume antigo das civilizações humanas. Tais símbolos são abundantes nos dias atuais,
seja na forma de escrita cuneiforme, história oral, esculturas, arquitetura, imagens, dentre
outros. O homem desenvolveu diversas vias pelas quais o conhecimento poderia ser
perpetuado. O processo de construção de imagens remonta a 40.000 a.C. e permanece em
constante evolução até os dias atuais (BONFIGLIOLI, 2008).
Apesar da utilização de imagens estar primordialmente associada às artes, um de
seus recursos mais valiosos é o armazenamento de informações. Fotos de época, desenhos,
imagens térmicas, imagens aeroespaciais guardam informações essenciais para diversos
ramos de conhecimento.
O processamento de imagens visa à melhoria da imagem e a extração de
informações (GONZALEZ; WOODS, 2000). A melhoria da imagem tem como objetivo
enaltecer características específicas, visando uma interpretação mais perfeita do conteúdo.
Uma competente extração de informações da imagem só é possível se essa tiver sido
submetida a um processamento prévio, visando a ampliação de características específicas.
Esse processamento engloba as atividades de filtragem e/ou segmentação da imagem. A
extração de informações de imagens digitais surgiu a partir da necessidade do aumento da
confiabilidade de tal ação, visto que a realização da ação por indivíduos humanos aumenta a
probabilidade de erro (TAGLIAFERRO, 2007).
15
A subárea do Processamento de Imagens que se dedica ao estudo dos métodos
para extração confiável de informações é chamada Reconhecimento de Padrões. A intenção
dos pesquisadores dessa área é desenvolver sistemas computacionais com capacidades de
reconhecimento semelhantes às humanas. Diante desse desafio, a área de Reconhecimento de
Padrões busca desenvolver métodos e técnicas especializados que utilizam ou auxiliam
diversas outras áreas de conhecimento.
Inserindo-nos nesse contexto e observando que o reconhecimento automático de
caracteres em imagens ainda é um objetivo e não uma realidade, este trabalho busca agregar
conhecimento nesse ramo da área, buscando o desenvolvimento de um novo método para
preparar imagens que otimize o processo de reconhecimento de caracteres em placas de
automóveis flagrados por barreiras. Para tanto, serão utilizados, como recursos, a morfologia
matemática, em especial a técnica de esqueletonização, haja vista que tais técnicas não são
largamente utilizadas no método de reconhecimento de caracteres. A pouca utilização dessas
técnicas é decorrente de uma inexistência de estudos que validem a sua utilização.
O tópico de reconhecimento de caracteres ainda não realizou avanços
consideráveis.
As
implementações
realizadas
atualmente
são
especializadas
em
reconhecimento de letras e números que não contenham uma marca tipográfica (negrito,
itálico, etc.), também há alguns conflitos ao serem analisados caracteres com acentuação.
Adicionalmente, caso o meio que contenha a informação não esteja em condições ideais, a
probabilidade de acerto do processo de reconhecimento cai consideravelmente (CONCI;
AZEVEDO; LETA, 2008).
Diante desse estado da arte do reconhecimento de caracteres, buscou-se a pesquisa
nessa área visando um conhecimento mais profundo, considerando a utilização de um método
de reconhecimento pouco utilizado, esqueletonização das formas. O domínio de aplicação
escolhido foi o reconhecimento da informação de placas de automóveis, números e letras, a
partir de imagens geradas por barreiras eletrônicas.
As barreiras eletrônicas têm por objetivo coibir infrações de trânsito em vias, em
geral urbanas. Seus principais focos de atuação são: monitoramento de tráfego em semáforos
e controle do limite de velocidade. A taxa de acidentes de trânsito cresce de modo alarmante
ano após ano e foi comprovado, com estudos e análise de estatísticas de trânsito, que a
16
implantação de dispositivos, humanos ou eletrônicos de fiscalização reprimem as infrações no
trânsito e auxiliam no cumprimento da lei (PREFEITURA DE FORTALEZA, 2007).
Após a detecção das infrações pela barreira eletrônica o processo padrão é:
recolhimento das informações do dispositivo para o centro de processamento de dados do
órgão responsável onde deverá ser analisado por funcionários para obtenção da informação.
Após esse processo, a multa é gerada oficialmente e encaminhada para o infrator. Esse
processo resulta em um tempo de espera, entre a infração e o recebimento da multa, muito
extenso. De acordo com o Código de Trânsito Brasileiro o infrator tem 30 dias para receber o
auto de infração. Em caso de recebimento posterior ao período estipulado pelo Código
Nacional de Trânsito (CNT), a infração perde a validade, não podendo ser cobrada a multa
(BRASIL, 1997).
Como o domínio de aplicação descrito não contém informações com marcas
tipográficas, foi considerado como campo fértil e promissor para uma pesquisa inicial no
campo de reconhecimento de caracteres. Adicionalmente procura-se agregar um valor social,
auxiliando numa estrutura mais eficiente de aplicação da lei de trânsito e com uma esperada
diminuição das taxas de acidentes com vítimas nas vias de trânsito.
O projeto objetiva construir os módulos de processamento básico e intermediário
que possam ser utilizados como base para um protóripo que realize reconhecimento
automático de placas de automóveis utilizando, como dados de entradas, imagens
provenientes de barreiras eletrônicas, fixas ou móveis. O módulo de processamento
intermediário utilizará prioritariamente a esqueletonização e a segmentação para que a
imagem final possua a qualidade necessária para reconhecimento
O trabalho propõe-se ainda como um incentivador para uma área pouco
fomentada no que se refere ao desenvolvimento de pesquisas, tanto em nível local como
nacional. Em caráter social o projeto destina-se a auxiliar a aplicação da lei nacional de
trânsito, ao passo que propõe estratégias que possam agilizar a detecção da numeração e
conseqüente identificação do autor de infrações em vias públicas que tenham vigilância
eletrônica a partir de barreiras eletrônicas. Observando que o volume de infrações é crescente,
e o aparato humano insuficiente para a correta identificação dos infratores em tempo hábil
para aplicação do Código Nacional de Trânsito. Academicamente, o projeto servirá como
17
modelo para o desenvolvimento de outras aplicações na área de Processamento de Imagens.
O trabalho está dividido em sete capítulos que englobam desde o referencial
teórico até a documentação gerada na construção do protótipo. O primeiro capítulo é
composto pelo arcabouço teórico que norteou o desenvolvimento do projeto e é formado por
tópicos que versam sobre os pontos críticos para o desenvolvimento da aplicação.
O segundo capítulo apresenta as ferramentas utilizadas no processo de
desenvolvimento onde são apresentadas as características principais das ferramentas. No
terceiro capítulo é relatado os componentes dos módulos do protótipo e as implementações
realizadas na base de dados, ou seja, o processo de desenvolvimento em si. No capítulo
subsequente são relatados os testes realizados e os resultados obtidos. O capítulo cinco
explana sobre a documentação utilizada ou criada ao final do processo de desenvolvimento e
de testes. Por fim o capítulo seis exibe as conclusões finais do projeto e o capítulo sete
abrange trabalhos futuros.
18
1.
REFERENCIAL TEÓRICO
Este capítulo aborda a pesquisa bibliográfica que constitui o arcabouço teórico do
projeto. Para desenvolvimento do mesmo foram realizadas consultas às obras de autores cuja
contribuição na literatura seja relevante.
O capítulo está dividido sequencialmente numa introdução à área de pesquisa,
definição de imagem digital que é o objeto principal do trabalho de pesquisa, uma explanação
sobre o processamento de imagens, destacando os componentes de segmentação de imagens e
morfologia matemática que compõem essa disciplina, no tópico seguinte é abordada a área de
reconhecimento de padrões e seus principais métodos de abordagem, por fim é feita uma
rápida consideração sobre a linguagem Matlab.
1.1 Definição
A automatização de tarefas por máquinas é um processo desenvolvido pelo
homem visando melhorar a obtenção dos resultados anteriormente obtidos pelo trabalho
braçal. O processo iniciado na Revolução Industrial no Século XVIII desencadeou, motivada
pelo interesse do comércio, uma inédita substituição do método de produção (DIVALTE,
2000). Desde então o homem habituou-se a delegar rotinas que, de algum modo,
representassem um risco ao seu executor ou que, a partir da inserção do maquinário, obtivesse
um ganho de resultados com a automação. O homem passa então a executar novos papéis
como descreve Singer: “A função do Homem não é mais produzir, mas alimentar, vigiar,
manter e reparar a máquina” (SINGER apud DIVALTE, 2000, p. 200). Desde então o
maquinário, industrial e residencial, evolui.
19
Nesse contexto surgem os computadores. Máquinas com objetivo de realizar
cálculos de forma mais eficiente e rápida que os humanos. Como qualquer maquinário os
computadores evoluíram e tornaram-se ferramentas indispensáveis na sociedade. A evolução
computacional buscou a construção de máquinas que simulassem as ações humanas. Uma das
disciplinas que têm se dedicado a esse objetivo é o reconhecimento de padrões (GONZALEZ;
WOODS, 2000).
Reconhecimento de padrões lida com diversas áreas, tais como: Processamento de
Imagens, Inteligência Artificial, Computação Gráfica e ramificações das mesmas. De acordo
com os métodos e técnicas utilizados, a disciplina tem foco e escopo distintos. Este projeto
trata da segmentação de imagens com o intuito de um posterior trabalho na área de
reconhecimento de padrões.
1.2 A Imagem Digital
Imagem digital pode ser definida como uma função bidimensional [1] para
imagens 2-D ou tridimensional [2] para imagens 3-D.
função (coordenada A, coordenada B)
[1]
função (coordenada A, coordenada B, coordenada C)
[2]
Este trabalho abordará as imagens 2-D. Uma imagem digital é representada no
sistema computacional como uma matriz, as interseções linha por coluna desta matriz
armazenam informações sobre a imagem. Tais informações podem ser: a intensidade do nível
de cinza, as intensidades das cores RGB ou, o índice da pallete de cores.
Os pontos de intersecção da matriz são chamados de pixels, uma abreviação de
picture element (SCURI, 2002). O tamanho e a quantidade de pixels de uma imagem
dependem de sua resolução espacial. A resolução é definida por diversas medidas a depender
do sistema de exibição ou tratamento da imagem. Uma das medidas é o DPI (dots per inch)
que define a razão de pontos por polegada linear (2,54 cm) na superfície da imagem.
20
Resoluções maiores resultam em imagens com maior quantidade de pixels. Quanto maior a
quantidade de pixels maior a complexidade computacional necessária para realizar
tratamentos na imagem. A figura 1 apresenta duas imagens que possuem o mesmo tamanho,
porém resoluções diferentes. É possível verificar que o círculo na imagem da direita possui
contornos mais definidos, resultado do tamanho de pixel ser menor e por conseqüência maior
grade de pixels.
Figura 1 - Imagens digitais com tamanho igual e resolução diferente (SCURI, 2002)
O tratamento de pixels é feito a partir de sua topologia. De acordo com as funções
que estão sendo aplicadas o pixel pode ser considerado como único, vizinhança 4 ou
vizinhança 8. Observando a figura 2 que representa 9 pixels de uma imagem pode-se
identificar as estratégias: em cinza claro nota-se a estratégia de tratamento do pixel como
único. Vizinhança 4 é definido pelo pixel cinza claro e os cinzas escuros que tocam o central
pelas laterais. Já a vizinhança 8 é definida como a figura toda, o pixel central e seus vizinhos
verticais, horizontais e diagonais (SCURI, 2002). Essa abordagem é válida para imagens com
grade de pixels regulares, grades hexagonais têm abordagem semelhante, mas não se
compõem como foco deste trabalho.
O sistema de coordenadas de uma imagem digital e dos dispositivos de exibição é
invertido verticalmente com relação ao sistema cartesiano ortogonal padrão. Ou seja, o ponto
de origem é encontrado na extremidade esquerda superior.
21
Figura 2 - Representação da vizinhança de um pixel
1.3 Processamento de Imagens Digitais
A área de Processamento de Imagens Digitais visa o tratamento dessas com dois
objetivos: “melhoria da informação visual para interpretação humana e o processamento de
dados das cenas para percepção automática através de máquinas” (GONZALEZ; WOODS,
2000, p. 01). O processamento de imagens tem seu campo de aplicação nas imagens digitais,
ou seja, imagens discretizadas em função de coordenadas bidimensionais, como explicitado
na função definida em [3], que armazenam os valores correspondentes ao brilho, em imagens
em tons de cinza, ou o valor correspondente à cor naquela posição, em imagens coloridas.
f(x,y).
[3]
O processamento de imagens é composto por três níveis de processamento, como
exibido na figura 3 retirada de (GONZALEZ; WOODS, 2000). Nem todos os passos descritos
na figura 3 precisam ser executados, dependendo do domínio de aplicação. Entretanto os
passos descritos sugerem o método mais eficiente para maximizar o reconhecimento dos
padrões constantes da imagem.
O processamento de baixo nível engloba as fases de aquisição e préprocessamento. Filtragem, restauração, mudança do domínio, compressão. As atividades que
compõem este nível não necessitam da supervisão humana, tampouco da utilização de rotinas
ou equipamentos sofisticados, em termos de inteligência computacional (GONZALEZ;
WOODS, 2000).
22
Figura 3 - Níveis de Processamento (GONZALEZ; WOODS, 2000, p. 408)
A aquisição de imagens que será abordada neste trabalho dá-se a partir da
discretização de cenas tridimensionais. O processo de captura é realizado por câmeras ou
scanners. No caso das câmeras, a representação 2-D é obtida a partir da captura da energia
luminosa desprendida do objeto. Essa energia “é convertida em sinal elétrico pelo
dispositivo” (CONCI; AZEVEDO; LETA, 2008, p. 53).
Com esta conversão é possível representar a imagem como uma matriz de dados,
ou pixels (picture element), onde são guardadas as informações de cores, luminosidade ou os
índices para palletes de cores. Tal processo é necessário para que se possam manipular as
representações dos sinais contínuos no computador, como explicitado por Scuri (2002, p. 14):
“a discretização de qualquer sinal contínuo primeiro passa por uma amostragem e
depois passa por uma quantização. Além disso, não podemos armazenar um sinal
que se estenda indefinidamente, portanto o sinal digital também é limitado a um
intervalo do domínio.”
A atividade de filtragem é realizada buscando um melhoramento da imagem de
acordo com o domínio da aplicação. A imagem pode ser melhorada em termos visuais quando
23
a análise é efetuada por indivíduos humanos. Podem ser realizados melhoramentos, em
termos de realce de características, dentre elas bordas, linhas, cores, texturas, etc.
A atividade de restauração é realizada quando a imagem apresenta falhas
decorrentes de sua aquisição. Ruídos de movimento, correção de foco, etc. Seus resultados
são melhor apreciados para sistemas destinados à visualização humana (SCURI, 2002).
A mudança de domínio é realizada antes da aplicação de filtros sobre a imagem.
Utiliza-se em geral a Transformada de Fourier, ou sua variante rápida. “Esse grupo de
operações é visto somente em programas de processamento de imagens científico” (SCURI,
2002, p. 86). A compressão de imagens é realizada visando a geração de arquivos mais leves.
Em geral é aplicada para facilitar o transporte das imagens.
O processamento intermediário requer uma intervenção humana ou de um sistema
inteligente. Visto que o resultado desse processamento é determinante para um correto
reconhecimento e depende de quais características se deseja extrair da imagem.
1.3.1
Segmentação
O termo segmentar refere-se à divisão em segmentos, sendo tal segmento uma
parte do todo (DICIONÁRIO MICHAELIS, 2000). Na área de Processamento de Imagens
define-se segmentação como a ação que visa dividir uma imagem nas suas partes ou nos
objetos constituintes dessa imagem (GONZALEZ; WOODS, 2000). Estas novas porções da
imagem contêm as características de interesse ressaltadas das demais, facilitando um processo
de reconhecimento, análise ou interpretação (CONCI; AZEVEDO; LETA, 2008).
O processo de segmentação, portanto, tem como objeto obter uma determinada
região da imagem que possua características relevantes maximizadas para o domínio de
aplicação. O ato de segmentar é feito buscando separar da imagem original regiões que
possuam características em comum. A segmentação pode ser implementada visando a
separação de cores, texturas, pontos, linhas, descontinuidades, bordas, dentre outros
24
(GONZALEZ; WOODS, 2000). Portanto, áreas que possuam características semelhantes,
ainda que descontínuas na imagem original, podem ser separadas.
De acordo com o tipo de segmentação implementado na imagem esta pode chegar
a ser dividida em duas regiões, o fundo e o objeto. Em geral definidos em branco e preto, são
as imagens binárias. Ainda que a imagem seja composta por tons de cinza, as imagens
segmentadas possuem uma quantidade menor de características. A bibliografia cita as
imagens binárias como resultados melhores para uma segmentação devido a redução
significativa da quantidade de dados (ALBUQUERQUE; ALBUQUERQUE , 2000).
O presente projeto adotou a divisão dos autores Gonzalez e Woods (2000) para
citar as diversas formas de segmentação. Os autores foram escolhidos por terem desenvolvido
uma lista de algoritmos que abrange um escopo de segmentação, para imagens em tons de
cinza, amplo e que inclui as definições dos demais autores utilizados como referencial teórico.
Os principais algoritmos de segmentação para imagens monocromáticas são baseados em
descontinuidade ou similaridade dos níveis de cinza.
1.3.1.1
Segmentação por Descontinuidade
Algoritmos baseados em descontinuidade executam a separação da imagem a
partir da identificação de inconsistências na distribuição do nível de cinza. Esses algoritmos
utilizam três tipos de estruturas para determinar essas inconsistências: pontos, linhas e bordas.
A atividade de segmentação por descontinuidade envolve a utilização de filtros
para varrer a imagem e identificar as estruturas. Tal identificação pode ocorrer tanto no
domínio de freqüência quanto no domínio espacial.
Na detecção de pontos, a máscara utilizada possui um valor elevado na célula
central e valores extremamente baixos nas outras células, como exibido na figura 4 (a).
Assim, quando a máscara for aplicada sobre a imagem os pontos serão destacados na imagem
final, pois “o nível de cinza de um ponto isolado é completamente diferente do nível de cinza
de seus vizinhos” (GONZALEZ; WOODS, 2000, p. 296).
25
Figura 4 - Máscaras:(a) detecção de pontos e de linhas (b) Horizontal (c) Vertical (d) +45º (e) -45º
Para detecção de linhas são utilizadas quatro máscaras, semelhantes às utilizadas
na detecção de pontos. Nesta operação, porém, utilizam-se quatro máscaras capazes de
detectar as linhas na posição horizontal, vertical e nas diagonais de 45º (positivo e negativo).
São definidos valores elevados para as linhas de detecção da máscara, e valores constantes
para as outras células. Exemplos de máscaras de detecção de linhas podem ser vistas na figura
4 (b) a (e).
A detecção de bordas é a abordagem mais utilizada para segmentação por
descontinuidades, “a razão é que pontos e linhas finas isoladas não são ocorrências
freqüentes” (GONZALEZ; WOODS, 2000, p. 297). A borda é a delimitação dos objetos na
imagem, são caracterizadas pela mudança repentina dos níveis de cinza, “Os pontos de borda
caracterizam as transições entre objetos diferentes” (FONSECA, 2000, p. 93).
Nessa abordagem de detecção os operadores de Roberts, Sobel, Laplaciano,
dentre outros algoritmos de detecção de borda são extensamente utilizados. Podendo ser
seguidos ou precedidos de uma limiarização.
Limiarização (threshold) é o processo de definição de um nível de cinza dentro da
imagem que se tornará a fronteira definindo quais pixels serão ‘acesos’ ou ‘apagados’.
Resulta numa imagem binária e é, em geral, definido baseando-se no histograma da imagem.
O histograma é o indicador percentual da quantidade de pixels com determinado tom de cinza
ou intensidade de cor na imagem, a figura 5 exibe dois exemplos de histogramas. De acordo
com o agrupamento dos pixels na imagem e com o objetivo do tratamento da imagem (separar
objetos do fundo, identificar bordas) o ponto de corte é escolhido (CONCI; AZEVEDO;
LETA, 2008).
26
Figura 5 - Exemplos de Histograma (LEITE, 2004)
O operador de Roberts é um dos algoritmos mais simples para detecção de bordas,
no entanto é muito sensível aos ruídos existentes na imagem (SEARA, 1998). O algoritmo de
Sobel ou Operador de Sobel utiliza duas máscaras 3x3 que são aplicadas na imagem visando a
detecção das linhas horizontais e verticais. A figura 6 exibe um exemplo do operador de
Sobel. Os algoritmos de Sobel e Roberts podem ser definidos como um único operador
Gradiente, quando são aproximados por filtros 3x3 e a partir das fórmulas [4] e [5], onde
e
Gy
Gx
são as máscaras utilizadas em Roberts [4] e Sobel [5] e mostradas na figura 6 (d) e (e),
respectivamente.
| G |= G x2 + G y2
| G |=| G x | + | G y |
[4]
[5]
O operador Laplaciano utiliza uma máscara padrão definida na figura 7, é um
algoritmo muito suscetível ao ruído, porém extremamente eficaz na detecção de bordas em
qualquer direção (NEVES; PELAES, 2001).
27
Figura 6 - (a) Imagem tratada com um filtro ,(b) operador de Roberts ,(c)operador de Sobel e exemplos de
máscaras utilizadas em (d) Roberts e em (e) Sobel. (FELGUEIRAS, 2007, alterada)
Figura 7 - Máscara utilizada no operador Laplaciano
1.3.1.2
Segmentação por Similaridade
A detecção de regiões de interesse por similaridade baseia-se em três abordagens
principais: limiarização, crescimento de regiões e fusão e divisão de regiões. O processo de
limiarização aplicados a segmentação por descontinuidade descrita anteriormente é o tipo
mais simples de limiarização. Este tipo de limiarização utilizando o histograma é também
chamado de limiarização global e só apresenta resultados ótimos, em geral, quando é possível
controlar a iluminação da cena (GONZALEZ; WOODS, 2000).
28
A figura 8, retirada de Leite (2004), demonstra como o algoritmo de limiarização
pode ser eficiente e como o controle de iluminação o afeta. Na imagem original em tons de
cinza a identificação da placa é impossível, após a aplicação da limiarização os 4 números e a
segunda letra que compõem a placa podem ser vistas claramente, porém a primeira letra é
totalmente apagada e a terceira apresenta-se como um borrão. Em caso de uma iluminação
consistente na região da placa, esse problema seria evitado.
Figura 8 - Exemplo da aplicação da limiarização (a) Imagem original em tons de cinza (b) Imagem
binarizada por limiarização (LEITE, 2004)
Crescimento de regiões é um procedimento que visa o agrupamento de regiões a
partir de uma sub-região determinada. ”Regiões homogêneas em relação ao predicado e
adjacentes no espaço são agrupadas” (CONCI; AZEVEDO; LETA, 2008, p. 203). O
procedimento inicia-se a partir da definição de uma sub-região que contém as características
(cor, textura, nível de cinza) desejadas para a extração do objeto de interesse, o algoritmo
agrega todos os pixels semelhantes a esta região semente até que nenhum pixel em contato
com os pixels da região apresente as características desejadas. Podem ser definidas mais de
uma sub-região semente (CONCI; AZEVEDO; LETA, 2008).
Esse procedimento apresenta algumas dificuldades que são determinantes para o
sucesso da utilização do método. A escolha da sub-região semente, que deve possuir as
características adequadas e o critério de similaridade para agregação de novos pixels
(GONZALEZ; WOODS, 2000). A flexibilidade desses critérios pode acarretar em uma região
final maior ou menor que a esperada. Usualmente são utilizados conjuntos de descritores
29
baseados em “intensidade e em propriedades espaciais” (CONCI; AZEVEDO; LETA, 2008,
p. 204) decorrentes de um grupo de imagens. Além desses o algoritmo deve estar preparado
para lidar com a conectividade e com a adjacência para que a região seja corretamente
definida.
A técnica de fusão e divisão de regiões consiste na divisão da imagem em 4
quadrantes, os pixels de cada quadrante são verificados para definir se atendem ao critério de
homogeneidade definido. Em caso de atendimento de todos os pixels o quadrante é
estabelecido como região e não são mais tratados pelo algoritmo, os blocos que não atendem
ao critério são novamente divididos em quatro blocos.
O algoritmo desse procedimento é geralmente associado a uma estrutura quadtree,
uma árvore onde cada nó possui quatro descendentes. (CONCI; AZEVEDO; LETA, 2008).
Após a aplicação do algoritmo as regiões que atendam ao critério de homogeneidade e que
estejam conectadas são unidas.
1.3.2
Morfologia Matemática
Morfologia Matemática é a área de Processamento de Imagens que analisa as
formas da imagem. É empregada quando existe a necessidade de extração de informações que
são compostas por formas topológicas ou geométricas. Morfologia tem sua origem nas
palavras gregas morphos que remete a formas e logia, que significa estudo (DICIONÁRIO
MICHAELIS, 2000). Portanto, morfologia é o estudo das formas, avançando para o estudo
das relações entre essas formas.
A Morfologia se constitui da utilização de transformações que são compostas por
operações elementares. Matematicamente é baseada na teoria dos conjuntos, geometria
integral e álgebra de reticulados (NEVES, 2003). É aplicada tanto em imagens em tons de
cinza quanto em imagens binárias.
As operações básicas da Morfologia são a Erosão e a Dilatação (GONZALEZ;
WOODS, 2000). A partir da combinação dessas alcança-se as operações de Abertura e
30
Fechamento. Para utilizar a morfologia é definida uma estrutura, denominada elemento
estruturante, que será utilizada nas operações com a imagem. O elemento estruturante
funciona como uma máscara a ser aplicada na imagem e, a depender do seu tamanho e forma
afeta a imagem de maneira diferente.
Segundo Neves “O elemento estruturante é um conjunto plenamente conhecido e
definido (forma e tamanho) usado para ser comparado ou medido na imagem a ser estudada a
partir de uma transformação” (NEVES, 2003, p. 14). A definição do elemento estruturante é
baseada na necessidade do domínio de aplicação e em alguns casos é necessário realizar
alguns testes até chegar à matriz que melhor resolva o problema. “Na maioria dos casos os
elementos estruturantes devem ser os mais simples possíveis e são escolhidos em função das
propriedades de convexidade, não convexidade, isotropia e anisotropia” (NEVES, 2003, p.
14). A figura 9 apresenta exemplos de elementos estruturantes.
Dougherty e Lotufo definem a morfologia matemática como um processamento
baseado em geometria, visto que “A idéia básica, decorrente da estereologia, é sondar uma
imagem com um elemento estruturante e quantificar a forma como o elemento estruturante se
enquadra (ou não se enquadra) dentro da imagem” (DOUGHERTY, LOTUFO, 2003, p. 1).
Sobre a importância da escolha do elemento estruturante para o sucesso da
operação morfológica os autores Dougherty e Lotufo são categóricos: “Toda a transformação
morfológica
depende
do
conceito
de
montagem
dos
elementos
estruturantes”
(DOUGHERTY, LOTUFO, 2003, p. 2).
Figura 9 - Exemplos de Elementos Estruturantes de formas comuns: (a) Cruz e o (b) Quadrado. (NEVES,
2003)
31
Neves (2003) define quatro tipos de elementos estruturantes mais utilizados nas
aplicações de morfologia matemática. São eles: segmentos de linhas, par de pontos, discos e
elementos compostos.
Podemos definir as operações morfológicas como uma análise entre as formas da
imagem e o elemento estruturante definido com consequente ajuste da forma (incremento ou
retirada de pixels). A erosão é a operação de eliminação de pixels que não se adequam às
formas do elemento estruturante. Sua ação erode a imagem de modo a aumentar os buracos e
eliminar formas menores que o elemento estruturante. Em movimento contrário está a
dilatação, que promove um aumento da imagem. “A dilatação expande uma imagem, enquato
a erosão a reduz” (GONZALEZ; WOODS, 2000, p.373). Na figura 10 estão exemplos de
erosão e dilatação, observar que o ponto estruturante utilizado na figura é circular, visível
somente em (ii).
Figura 10 - Exemplos de (ii) erosão e (iii) dilatação sobre a imagem apresentada em (i). (GONZALEZ;
WOODS, 2000)
Ainda na figura 10 é possível observar os símbolos matemáticos utilizados para
definir as operações de dilatação e erosão, explicitados em [6] e [7].
32
⊕ Dilatação
[6]
Ѳ Erosão
[7]
A utilização das operações de dilatação e erosão cria resultados pouco fiéis à
imagem original, para contornar essa característica desenvolveram-se as técnicas de abertura e
fechamento que visam resultados mais fiéis à imagem original, ainda que tenham passado por
tratamento. O objetivo dessas operações é suavizar os contornos das imagens que receberam
um tratamento morfológico, para isso as imagens erodidas são dilatadas e as imagens
dilatadas são erodidas, ou seja, submetidas à operação de abertura que consiste da aplicação
da erosão seguida da dilatação ou submetidas ao fechamento, dilatação seguida de erosão.
Figura 11 - Exemplos de (a) Abertura e (b) Fechamento. (GONZALEZ; WOODS, 2000)
Enquanto a abertura “quebra istmos estreitos e elimina protusões finas”
(GONZALEZ; WOODS, 2000, p.373) o fechamento “funde as quebras em golfos finos,
elimina pequenos buracos e preenche fendas em um contorno” (GONZALEZ; WOODS,
2000, p.373), essas operações suavizam os contornos da imagem. Como visto na figura 11, as
33
imagens finais são mais fiéis à imagem original ainda que apresentem as características da
erosão ou dilatação.
Além das operações citadas neste tópico, convém informar que a morfologia
matemática possui diversas outras transformadas especializadas em domínios de problemas
tais como a transformada hit-or-miss, segmentação morfológica através do algoritmo de
watershed, dentre outros. Tais operações foram omitidas do presente trabalho pois sua
utilização não está prevista na execução do projeto.
1.4 Reconhecimento de Padrões
Após a invenção da escrita, ao longo de vários séculos, o homem confiou a guarda
de suas informações à escrita e ao papel. Com a chegada dos computadores e mais
recentemente o advento da internet, a produção de informação passou a ser um processo mais
democrático. Crescendo em ritmo acelerado. Além da geração de novas informações tornouse claro que digitalizar informações já produzidas era um processo vantajoso tanto da visão
econômica quanto cultural.
No entanto, a digitalização e tratamento dessas informações é um processo ainda
em desenvolvimento. Um dos focos principais a ser abordado neste trabalho é a identificação
de caracteres a partir de imagens digitais. As principais dificuldades dessa ação são:
reconhecer os caracteres na imagem, diferenciar caracteres de formas, extraí-los de modo a
permitir sua edição. O processo é simples quando imaginamos o reconhecimento humano de
uma folha de papel datilografado que foi digitalizada, uma foto de um outdoor ou um rabisco
digital. Mas para o sistema computacional reconhecer caracteres nessas imagens, ele esbarra
em dificuldades tais quais: caracteres incompletos (como um “o” que foi deixado
parcialmente aberto pela falta de tinta), em ângulos diferentes (como palavras na vertical ou
em ângulos diagonais no outdoor), com formatações (negrito, itálico, tachado), formas no
meio (marcas que podem ser confundidas com caracteres), etc. O correto tratamento da
imagem visando a obtenção de um material consistente para o processamento é determinante
para o sucesso do processamento.
34
O processo de reconhecimento automático de caracteres a partir de uma imagem é
uma área englobada pelo reconhecimento de padrões. Padrão é uma “descrição quantitativa
ou estrutural de um objeto ou entidade...” (GONZALEZ; WOODS, 2000, p. 409). Pode-se
ainda afirmar que Padrão é um rótulo para definir o objeto dentro do conjunto (CARVALHO,
2005). Ainda podendo ser definido como “qualquer aspecto que pode ser padronizado em
uma estrutura armazenável” (CONCI; AZEVEDO; LETA, 2008, p. 260). A composição do
padrão não é de uma informação única e sim de um conjunto que estruturas que definem o
objeto a ser reconhecido. Gonzalez e Woods (2000) definem o Padrão como “um arranjo de
descritores”. Entende-se por descritores o conjunto de informações de uma região de interesse
da imagem. Tais informações podem conter medidas de comprimento, tipos de formas,
direção de linhas, consistência de pontos, informações de ângulos, etc.
Classes de Padrões são definidas como uma categorização de padrões que
possuem características comuns. Pode-se então definir reconhecimento de padrões como a
associação automática de padrões à suas classes por máquinas, onde não ocorra ou ocorra
minimamente ações humanas (GONZALEZ; WOODS, 2000).
Define-se Padrão como a descrição possível capaz de identificar e individualizar o
dado obtido dentro do conjunto e que possa ser armazenada em uma base de dados.
Especificamente para este trabalho Padrão será utilizado como descritor dos símbolos dos
caracteres alfanuméricos constantes do alfabeto ocidental. O alfabeto ocidental e o conjunto
de números decimais serão o conjunto básico para utilização na aplicação a ser desenvolvida.
Define-se esse conjunto como C contendo os seguintes elementos descritos em [8]. Dado será
tratado como o símbolo que representa o caractere ou letra no conjunto.
C={A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9}
1.4.1
[8]
Métodos de Abordagem
A área de Reconhecimento de Padrões em Processamento de Imagens tem dois
métodos principais para o reconhecimento: decisão teórica e estrutural. A diferença básica
entre os métodos é o modo como os padrões são representados, enquanto os métodos de
35
decisão teórica utilizam-se de vetores de padrões, também conhecidos como vetores de
características, os métodos estruturais utilizam representações de padrões em cadeias ou
árvores (GONZALEZ; WOODS, 2000).
As abordagens de decisão teórica utilizam funções de decisão para o
processamento, onde um padrão é dito reconhecido à classe de padrões se atender aos
critérios definidos nas funções de decisão. Os métodos de decisão teórica podem ser divididos
em abordagens de casamento, classificadores estatísticos ótimos e redes neurais. Abordagens
definidas como casamento são os classificadores de distância mínima e casamento por
correlação (GONZALEZ; WOODS, 2000). A idéia de casamento se deve a relação da
imagem, ou das informações com o vetor ser feita de maneira quase direta. Classificadores
estatísticos ótimos englobam os classificadores bayesianos, essa abordagem utiliza
probabilidades dos padrões pertencerem ou não a determinada classe de padrões. Por fim, a
abordagem de redes neurais, utiliza uma rede neural e algoritmos de treinamento para realizar
as classificações. Os métodos de decisão teórica utilizam padrões quantitativos da imagem.
Métodos estruturais observam as formas encontradas na imagem para realizar o
reconhecimento dos padrões (GONZALEZ; WOODS, 2000). As abordagens dos métodos
estruturais podem ser casamento de números de formas, casamento de cadeias e métodos
sintáticos. O casamento de número de formas utiliza uma árvore de formas e a partir dela
compara as fronteiras e regiões descritas na imagem (GONZALEZ; WOODS, 2000).
Casamento de cadeias utiliza o mesmo princípio do casamento de formas, porém utiliza
polígonos similares. Métodos sintáticos são a abordagem mais usual, utilizando um conjunto
de primitivas e regras, um autômato varre a imagem, primeiro considerando a gramática
formada pelas primitivas e regras (GONZALEZ; WOODS, 2000).
1.5 Linguagem Matlab
Para este trabalho adotou-se como linguagem de desenvolvimento o Matlab que é
a linguagem de programação utilizada pelo software Matlab® da The MathWorks™ e que
baseou a criação da variante utilizada pelo software Octave publicado sob a licença da Free
Software Foundation.
36
As duas linguagens de programação apresentam peculiaridades, enquanto a
linguagem Matlab da MathWorks é proprietária a variante apresentada pelo software Octave é
baseada na filosofia Open Source e se caracteriza por ser compatível com a linguagem
proprietária (OCTAVE, 2009).
Optou-se por utilizar as duas linguagens haja vista que as diferenças entre ambas é
mínima, necessitando apenas de ajustes nos códigos. Justifica-se também a escolha das duas
tendo em vista que os códigos do protótipo não fiquem atrelados à licenças de copyrights.
Pode-se observar como principais diferenças entre as linguagens (SCALON,
2008):
•
A nomenclatura de algumas funções básicas utilizadas pelos compiladores
diferem. Por serem casos extremamente pontuais, a ocorrência desses
casos será sinalizada nos scripts.
•
O Matlab reconhece comentários somente iniciados por ‘%’, por sua vez o
Octave aceita também comentários iniciados por ‘#’. Para evitar retrabalho
será utilizado o símbolo ‘%’ nos comentários.
•
Para uma execução correta os blocos condicionais e de repetição (while, if,
for) e as funções necessitam de uma declaração ‘end’ ao fim do bloco. O
Octave por sua vez permite a utilização de ‘endif’, ‘endwhile’, ‘endfor’ e
‘endfunction’, Apesar da utilização da declaração do Octave deixar o
código com uma legibilidade melhor, será adotado o modo de declaração
do Matlab, para facilitar a manipulação dos códigos entre as ferramentas.
•
Para declaração de desigualdades o Matlab aceita somente o ‘˜=’.
enquanto o Octave aceita também o ‘!=’. Novamente se dará preferência à
forma entendida por ambas as ferramentas.
•
Por fim, operadores incrementais tais como ‘++’ ou decrementais, ‘--’, não
são reconhecidos pelo Matlab. Devido a isto seu uso foi substituído por
métodos incrementais.
A linguagem Matlab “permite implementar e resolver problemas matemáticos
muito mais rápida e eficientemente que através de outras linguagens como C, Basic, Pascal ou
37
Fortran.” (CBPF, 2002). Devido a sua capacidade de processamento matemático, a linguagem
é amplamente utilizada por diversas áreas das Ciências Exatas, desde engenheiros a
economistas utilizam-se da facilidade de lidar com matrizes ou manipulação algébrica.
Por fim, ambas as linguagens baseiam-se na linguagem C, linguagem de
programação esta que é amplamente difundida, fato que agrega ao protótipo uma ampla base
de potenciais colaboradores para revisões posteriores do código.
38
2. FERRAMENTAS DE DESENVOLVIMENTO
Este capítulo discorre brevemente acerca das ferramentas de desenvolvimento
utilizadas para construção do protótipo. A apresentação das ferramentas objetiva ser
imparcial, apresentando suas características relevantes para o trabalho, além de apresentar
sites que armazenem a documentação, o arquivo para download ou a página da empresa
responsável pelo produto.
Os tópicos tratam da ferramenta Matlab da MathWorks™, a ferramenta Octave da
Free Software Foundation, ambos utilizados como ambiente de desenvolvimento. Em seguida
é apresentado o banco de dados MySql da Sun Microsystems, utilizado como base de dados.
2.1 MathWorks™ Matlab
O software MathWorks™ Matlab é um ambiente de desenvolvimento que utiliza
a linguagem de programação de alto nível, Matlab, baseada na linguagem C. É um ambiente
que permite a criação, execução e manutenção dos códigos baseados nesta linguagem.
É um ambiente especializado em cálculos computacionais, em especial álgebra
linear, estatística, análises de séries de Fourier, filtragem, otimização e integração numérica
(MATHWORKS,2009). O software possui também uma facilidade na programação de
gráficos, em decorrência desses fatores o ambiente apresenta fatores que potencializam seu
uso em processamento de imagens. A figura 12 mostra a tela de apresentação do software.
39
Tabela 1: Sites com informações Matlab
Site Oficial
http://www.mathworks.com/products/matlab/
Documentação
http://www.mathworks.com/access/helpdesk/help/helpdesk.html
Release
Detail http://www.mathworks.com/products/new_products/latest_features.html
R2009b
O software possui também a característica de agregar toolbox para funções
específicas, no caso de processamento de imagens, as toolbox utilizadas são Image Processing
Toolbox , Image Acquisition Toolbox e Mapping Toolbox . Essas toolbox possuem funções
específicas que auxiliam no desenvolvimento dos códigos.
Figura 12 - Tela inicial Matlab R2007b.
A versão atual do software é a R2009b, para este trabalho foi utilizada a versão
R2007b. A releases detail foi consultada e não se observou nenhuma incompatibilidade entre
as versões do software ou das toolbox. A tabela 1 exibe uma relação com os sites onde o
software pode ser encontrado
2.2 GNU Octave
O software livre GNU Octave é um ambiente de desenvolvimento que utiliza a
linguagem de programação de alto nível, GNU Octave, baseada na linguagem C e altamente
40
compatível com a linguagem Matlab da Mathworks.O software em si é mais simples que o
ambiente da Mathwoks, porém suas capacidades de cálculo computacional são semelhantes.
O Octave é especialista em cálculos computacionais, em especial álgebra linear,
integração de funções, manipulação polinomial e integração (OCTAVE, 2009). O software,
como no Matlab, possui uma facilidade para a manipulação de matrizes o que potencializa seu
uso em aplicações que realizem processamento de imagens.
Figura 13 - Tela inicial Octave 3.2.3.
A versão atual estável do software é a 3.2.3, que é a utilizada no projeto. Na figura
13 é exibida uma imagem da área de trabalho do Octave. Na tabela 2 é exibida a lista de sites
para acesso a informações do aplicativo. O software está sendo utilizado na compilação
binária para execução no Windows®.
Tabela 2: Sites com informações Octave
Site Oficial
Documentação
Versão 3.2.3
http://www.gnu.org/software/octave
http://www.gnu.org/software/octave/docs.html
http://www.gnu.org/software/octave/download.html
41
2.3 Base de Dados
Para a implementação da base de dados foi definido o banco de dados de código
aberto MySql, desenvolvido e mantido pela Sun Microsystems. A escolha desta ferramenta
deu-se após a análise de compatibilidade dos outros bancos de dados com as ferramentas de
desenvolvimento, a facilidade de uso e características complementares,
Um dos pontos que determinaram a escolha desse sistema de gerenciamento de
banco de dados (SGBD) foi a sua utilização prévia em outros projetos de pesquisa com a
ferramenta Matlab. A linguagem do banco, SQL, também motivou a escolha, observando que
o pesquisador possuía experiência com esta linguagem,
Por fim, por ser um software de código aberto e disponível gratuitamente (licença
GPL), o software se adequa as características deste projeto, como uma ferramenta de fácil
acesso para que ingressantes na área tenham acesso. O MySql “é atualmente um dos bancos
de dados mais populares” (SUN, 2009). Graças a essa difusão a sua comunidade de
desenvolvedores segue a filosofia Open Source e disponibiliza na internet diversos manuais,
scripts e fóruns.
2.4 Desenvolvimento de Interface com o Usuário
Para desenvolvimento da interface com o usuário não foi encontrada uma
ferramenta que realizasse esta tarefa nas duas ferramentas de desenvolvimento, Matlab e
Octave. A ferramenta Matlab possui internamente um componente que possibilita a criação de
interfaces intuitivas com o usuário. A Graphical User Interface (GUI) criada na ferramenta
do Matlab, entretando, utiliza bibliotecas e funções específicas do próprio software
impossibilitando sua utilização com o Octave.
Com objetivo de manter o protótipo resultante deste projeto possível de migração
entre plataformas de desenvolvimento e livre de uma tecnologia proprietária não será
desenvolvida uma interface na ferramenta supracitada. Entretanto, com o intuito de manter o
42
projeto com sua vertente pedagógica, o processo de construção da interface é descrito no
Anexo I - construção da interface.
43
3. DESENVOLVIMENTO DO PROTÓTIPO
Um dos principais objetivos deste trabalho é divulgar e incitar a adesão de novos
pesquisadores para a área de processamento de imagens. Com esta visão o trabalho foi
desenvolvido de modo que possibilitasse a absorção de conceitos básicos teóricos e práticos
pelo leitor.
Desta forma os códigos do protótipo foram desenvolvidos adotando um método
de facilidade de interpretação. Os códigos foram desenvolvidos em módulos, processamento
de nível básico e de nível intermediário.
Esse capítulo trata do desenvolvimento desses scripts, além de outros necessários
para a construção do protótipo. O tópico 3.1, destaca os módulos e os códigos desenvolvidos
nos mesmos, em seguida é descrito o método de integração os módulos no tópico 3.2. O
tópico subsequente, 3.3, trata da implementação da base de dados.
3.1 Módulos
No desenvolvimento do Protótipo foi observado a necessidade de utilizar
processamento de baixo nível e de nível intermediário. Para efeitos de organização foram
estabelecidos módulos de processamento básico, morfologia e segmentação.
O módulo de processamento básico contém scripts que tratam de adição e
subtração de imagens, histograma e equalização, O módulo de processamento intermediário
44
que trata da morfologia é composto por scripts que tratam de abertura e fechamento e
esqueletonização. Os outros scripts do módulo tratam da segmentação, detecção de linhas na
imagem e extração de bordas.
Essa divisão em módulos foi realizada com intuito de facilitar o estudo dos
códigos. Internamente o protótipo não possui essa separação. Para o protótipo utilizou-se a
divisão em scripts para imagens binárias e para imagens rgb ou em tons de cinza, Essa
separação foi implementada visando observar os resultados nos dois grupos de imagens,
facilitando os testes. Ainda considerou-se que os dispositivos fotossensores geram imagens
em somente um dos grupos, rgb, portanto os códigos para imagens binárias podem ser
considerados somente com efeito didático.
O módulo de processamento básico possui funções que não são implementadas
automaticamente por nenhuma das ferramentas de desenvolvimento. Por esse motivo, funções
de aquisição, erosão, dilatação, exibição de imagens não foram priorizadas. As funções que
constam neste módulo são:
•
Adição: Função para adição de imagens. São fornecidas duas imagens que
serão adicionadas. É utilizada para minimizar ruídos existentes na
imagem, a partir da soma destas e da média aritmética;
•
Subtração: Função para subtração de imagens. São fornecidas duas
imagens onde a primeira será subtraída da segunda. Utilizada para
identificar movimentos em imagens sequenciais, ou eliminar padrões da
imagem, pode ser utilizada também para retirada de certos tipos de ruído;
•
Histograma: Em processamento de imagens, o histograma é a distribuição
dos níveis de cinza na imagem. Como entrada é fornecida a imagem e a
saída é o gráfico de histograma da mesma;
•
Equalização: Função que resulta numa imagem com melhor distribuição
dos níveis de cinza. Busca um histograma mais uniforme, via de regra
resulta numa imagem com melhor contraste. É fornecida a imagem e
temos como saída a imagem e seu histograma equalizado.
45
O módulo de processamento intermediário possui funções que são componentes
da morfologia matemática e de segmentação.
•
Abertura: Função morfológica de abertura. É fornecida a imagem e a saída
é a imagem processada;
•
Fechamento: Função morfológica de fechamento. É fornecida a imagem e
a saída é a imagem processada;
•
Esqueletonização: A esqueletonização é realizada a partir do fornecimento
de uma imagem, no processamento são realizadas iterações de afinamento
e por fim são aplicadas erosões e dilatações, a saída é o esqueleto da
imagem.
•
Detecção de linhas: A detecção de linhas é uma das abordagens da
detecção de segmentação por descontinuidade. Foram criados 5 scripts
para a detecção de linhas, eles tratam da detecção de linhas horizontais,
verticais, diagonais 45º positivos e negativos e todas. As funções diferemse por uma letra no final, ou seja, para todas as linhas a função é linhas,
para linhas verticais, linhasv, etc.;
•
Detecção de bordas: Similar a detecção de linhas, utiliza uma abordagem
diferente utilizando uma função comum as duas ferramentas de
desenvolvimento, a função edge, e a aplicação de um filtro da média;
•
Segmentação: Para a segmentação é fornecida a imagem, e o algoritmo
processa a partir dos elementos conectados, fornecendo ao final a imagem
segmentada com as bordas dos objetos (caracteres) destacadas. Esse script
foi baseado no algoritmo de Jeny Rajan e Chandrashekar (2006).
Os códigos implementados encontram-se no Apêndice C – códigos da
implementação.
3.2 Integração dos Módulos
O modo como os módulos seriam integrados dependeria da criação de uma
interface portável para ambas as plataformas de desenvolvimento. Como não foi possível
chegar a esta solução, optou-se por não realizar uma integração real entre os módulos e
46
scripts. Os testes do protótipo foram realizados executando cada script conforme necessário
para chegar ao resultado final.
3.3 Implementação da Base de Dados
Para a base de dados foi definido a utilização do banco de dados MySql, onde
foram criadas as tabelas com informações para conferência dos dados das imagens e para
guardar as informações extraídas.
Para a conferência das informações foram criadas as tabelas “pro_letra”, com duas
colunas, id_letra e letra e populada com as letras do alfabeto ocidental, como descrito em [9].
Uma segunda tabela foi criada para armazenar os números, “pro_num”, também com duas
colunas, id_num e numero, a sua constituição pode ser observada em [10]. Ressalta-se que os
valores descritos em [9] e [10] representam as tabelas populadas e que cada valor separado
por vírgula representa uma linha da tabela. Tendo, portanto a tabela “pro_letra” 26 tuplas e a
tabela “pro_num” 10 tuplas. A coluna referente aos identificadores das tuplas, “id_letra” e
“id_num”, foram configuradas como obrigatórias e com autoincremento, a iniciar do valor 01.
{A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z}
[9]
{0,1,2,3,4,5,6,7,8,9}
[10]
Foi criada uma terceira tabela para armazenar os dados extraídos da imagem,
“ext_dados”. Nessa tabela foram criadas onze colunas, descritas na tabela 3. uma coluna para
identificação da tupla, sete colunas para identificação das posições dos caracteres na placa e
três colunas para administração da informação, data e hora de extração e arquivo de origem.
Para conexão entre o aplicativo Matlab foi utilizado um script de conexão pronto
desenvolvido por Luigi Rosa e disponível no seu próprio Website. A decisão de utilizar um
script já pronto baseou-se no fato de que as tecnologias associadas ao scripts são gratuitas, a
linguagem Php e o próprio MySql, e a possibilidade de portabilidade para o Octave. Existem
toolboxes no Matlab que automatizam a conexão, mas não existem similares disponíveis para
47
o Octave, impossibilitando a utilização sem ferir os objetivos gerais do projeto. O script para
Matlab está no Anexo II - conexão com o banco.
Tabela 3: Descrição das colunas da tabela “ext_dados”
Nome da coluna
id_dado
pos_01
pos_02
pos_03
pos_04
pos_05
pos_06
pos_07
data
hora
arquivo
Tipo
de
dado
armazenado
Numérico
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Data
Hora
Caracter
Descrição da informação armazenada
Identificador do dado extraído
Valor da primeira posição da placa – primeira letra
Valor da segunda posição da placa – segunda letra
Valor da terceira posição da placa – terceira letra
Valor da quarta posição da placa – primeiro número
Valor da quinta posição da placa – segundo número
Valor da sexta posição da placa – terceiro número
Valor da sétima posição da placa – quarto número
Data da extração da informação
Hora da extração da informação
Nome do arquivo onde a informação foi extraída
48
4. TESTES
Este Capítulo documenta os testes realizados no protótipo para garantia de seu
perfeito funcionamento. A definição de quais testes realizar, os métodos realizados e os
critérios de aceitação tiveram como base a experiência do pesquisador na área de testes.
O capítulo está dividido em definição da massa de testes a ser utilizada, a
documentação da realização dos testes, os critérios de aceitação para que o protótipo fosse
considerado como satisfatório e a compilação dos resultados obtidos.
4.1 Massa de Teste
A massa de testes a ser utilizada para validação do correto funcionamento dos
scripts desenvolvidos é composta de imagens em formatos que utilizem o algoritmo de
compressão do Joint Photographic Experts Group (JPEG) para imagens RGB e em tons de
cinza e para imagens binárias foi dado preferência a imagens com a extensão Portable
Network Graphics (PNG). Os formatos foram escolhidos por serem formatos livres,
amplamente difundidos em sua utilização. O formato JPEG, que é composto de imagens com
extensões “.jpeg”, “jpe”, “jpg”, “jfif” e “.jfi”, é utilizado por grande parte dos equipamentos
de geração de imagens, tais como máquinas fotográficas e equipamentos fotossensores, por
apresentar um bom nível de compressão. A extensão “.png” foi escolhida para as imagens
binárias por ser de fácil criação de imagens desse tipo.
As imagens utilizadas para os testes variam em sua resolução. Possuem
resoluções entre 100x68, para a menor imagem, e 640x240, para a maior. A massa de testes
49
foi dividida em três grupos, massa de imagens básicas, para testes em tempo de codificação e
para imagens que foram utilizadas para calibração de algoritmos. Composta por vinte e quatro
imagens, a figura 14 mostra algumas dessas imagens. O segundo grupo de imagens definido
foi o grupo de imagens de calibração, composto por seis imagens semelhantes às imagens
geradas por barreiras eletrônicas, para este grupo foram utilizadas fotos de modelos de placas
dispostas na imagem em diferentes posições, fotos da região traseira de carros emplacados,
focalizando a área da placa e foram criadas algumas imagens binárias com uma sequência de
letras e números, semelhante a utilizada para identificar as placas, com números e letras
escolhidos aleatoriamente. Essas imagens possuem em torno dessa sequência uma borda, com
diferentes características e falhas para possibilitar o treinamento de funções de segmentação
por região da placa. Todas as imagens que compõem a massa de teste estão documentadas no
Apêndice D – massa de testes.
Figura 14 – Exemplos de imagens da massa de testes básica. Caracteres (i, ii e iii) e linhas(iv, v, vi, vii, viii)
Figura 15 – Exemplos de imagens de calibração. Criada (i, ii e iii) e simulação(iv, v, vi,)
50
Por fim, o último grupo é composto por imagens que uma barreira eletrônica gera,
Foram utilizadas 20 imagens da base de imagens do projeto de reconhecimento de placas de
veículos brasileiros do Centro Brasileiro de Pesquisas Físicas (CBPF/MCT) e da Empresa
DRV - Desenvolvimento e Representação Ltda. Essa Base de imagens é fornecida
gratuitamente na página do grupo. As figuras 15e 16 mostram as imagens do grupo de
imagens de calibração e das imagens da base de imagens do CBPF/MCT.
Figura 16 – Exemplos de imagens utilizadas no teste provenientes da base de imagens do CBPF/MCT
Os grupos de imagens foram definidos de forma que cada grupo fosse capaz de
detectar e especializar os códigos escritos. Inicialmente utilizando imagens simples que
resultassem em saídas que definam o código como implementado com sucesso ou não. O
grupo de calibração tem por objetivo verificar se os códigos estão prontos para serem
aplicados em imagens com maior quantidade de características. As imagens reais da base de
imagens são a etapa de validação dos códigos.
4.2 Realização dos Testes
A metodologia adotada para realização dos testes englobou um teste exploratório
das funções a partir das massas de teste pré-estabelecidas. De acordo com a saída fornecida
após o código ser exercitado, este é considerado atendendo aos requisitos ou não atendendo.
Os testes foram realizados nas ferramentas de desenvolvimento, após os códigos
terem sido pré-testados em tempo de desenvolvimento. A atividade de testes consistia do
preenchimento de um checklist para verificar se o código atendia aos requisitos do projeto.
51
Inicialmente o arquivo do código era aberto e verificado se o código possuía
cabeçalho e comentários que possibilitassem o entendimento dos objetivos da função. Em
seguida o arquivo fonte era copiado para a área de trabalho do software de desenvolvimento,
nos dois softwares era criada uma pasta. A partir da ferramenta de desenvolvimento era
executada uma chamada da função com o fornecimento do nome do arquivo da imagem.
Após o processamento o arquivo de saída exibido era armazenado a partir de printscreen para
ser posteriormente analisado.
Códigos que não exibissem um arquivo de saída quando este é esperado ou que
relatassem erros impeditivos em tempo de execução foram considerados com o identificador
“bloqueado”. Quando a função não alcançava o objetivo esperado ou atingia resultados
desastrosos, o arquivo era considerado com erro do tipo “crítico”. Após a identificação de
erros os arquivos foram submetidos a uma nova análise para verificar quais os pontos que
provocaram o erro.
A manutenção dos identificadores dos códigos em tempo execução de testes foi
realizada em uma planilha no formato Excel. Nesta planilha ficou registrado o histórico de
erros que o código apresentou e a solução encontrada, de modo que ao final do projeto o
documento pudesse ser usado para extrair as melhores práticas de desenvolvimento. A figura
17 mostra um exemplo de preenchimento da planilha de controle. Os registros dos testes
foram armazenados em formatos jpeg,
Figura 17 – Exemplo da planilha de rastreabilidade dos identificadores dos códigos.
4.3 Critérios de Aceitação dos Scripts
Um script será considerado como pronto e com desempenho satisfatório se:
•
Para o grupo de imagens básicas obtiver sucesso em todos os processos;
52
•
Para o grupo de imagens reais obter sucesso em 80% das imagens.
O grupo de imagens de calibração não será contabilizado como mecanismo de
validação dos scripts. Os percentuais definidos como critérios de aceitação foram baseados na
experiência profissional do pesquisador na área de teste de software, haja vista que não
existem trabalhos realizados com o objetivo de mensurar, em termos quantitativos, o sucesso
ou fracasso de um código que implemente funções de processamento de imagens.
4.4 Resultados Obtidos
Após a realização dos testes os resultados dos códigos fonte foram considerados
satisfatórios. Erros de bloqueio foram identificados, mas corrigidos rapidamente, nenhuma
função chegou ao final dos testes apresentando erros críticos como exibido na tabela 4.
O módulo de processamento básico apresentou resultados de 100% de sucesso
tanto no grupo de imagens básicas quanto no grupo de imagens reais. As funções
componentes deste módulo são: adição, subtração, histograma e equalização.
Tabela 4: Resultado após os testes dos scripts
Função
abertura
adicao
borda
esqueleto
equalizacao
fechamento
histograma
linhas
linhas45n
linhas45p
linhasv
linhash
segmentacao
subtracao
Imagens binárias
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
Imagens RGB
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
sucesso
Identificação final
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
Código válido
O módulo de processamento intermediário atingiu também 100% de sucesso na
realização dos testes. Destaca-se, entretanto, que a utilização dessas funções em imagens com
53
grande número de características não leva ao resultado ótimo sem o tratamento prévio da
imagem, em especial na detecção de linhas em apenas uma das direções. A função de
segmentação definida aqui apresenta resultados similares a detecção de bordas, porém como
suas abordagens diferem os resultados apresentam diferenças.
Foi observado durante a realização dos testes que as duas ferramentas de
desenvolvimento apresentam resultados distintos para a mesma imagem de entrada. Isso
explica-se pela ferramenta que cada software usa para exibir as imagens resultantes. De
acordo com os resultados observados, a ferramenta que o Matlab utiliza para exibir as
imagens resultantes, retorna imagens em um formato próprio da mesma, “.fig”, enquanto que
a ferramenta do Octave retorna a imagem pura. Apesar dessas distorções os resultados finais
quando comparados demonstram as características esperadas antes da execução dos códigos.
Os principais resultados alcançados foram, para o módulo de processamento
básico:
Adição: Para esta função esperava-se que as imagens fornecidas como entrada
fossem somadas. Nas imagens binárias onde houvesse dois pixels pretos (1), ou dois pixels
brancos (0) o valor se manteria no pixel da imagem resultante. Onde não ocorresse o mesmo
valor o pixel na imagem resultante receberia o valor (0). Para imagens em RGB essa função
não foi projetada para funcionar como uma soma efetiva, por isso a sua aplicação em imagens
distintas leva a uma imagem em branco. Todavia, a função pode ser adaptada para a utilização
em uma única imagem, que após a soma seja aplicado o filtro da média. A função de adição
removeria um ruído existente na imagem, para tanto o comando para aplicação do filtro está
comentado no arquivo fonte. A figura 18 exibe o resultado da soma de imagens binárias com
a função executada no Matlab e com o mesmo resultado no Octave.
Figura 18 - Adição das imagens (i) e (ii), resultando em (iii). Função executada no Matlab.
54
Subtração: Nesta função o resultado esperado era uma imagem que mantivessem
os pixels com valores iguais nas duas imagens. Qualquer diferença de valores o valor do pixel
na imagem final seria preto (1). Para imagens RGB esta função não foi preparada. Haja vista
que sua aplicação para o protótipo não se aplica, entretanto o arquivo base pode ser estendido
para essa aplicação com um tratamento adequado de valores limítrofes. A figura 19 exibe o
resultado de uma subtração de imagens binárias com a função executada no Matlab e com o
mesmo resultado no Octave.
Figura 19 - Subtração das imagens (i) e (ii), resultando em (iii). Função executada no Matlab.
Histograma: A saída esperada dessa função é um gráfico que exiba a quantidade
de pixels com determinado valor na imagem. Para imagens binárias esse gráfico ficará
polarizado nos dois extremos, 0 e 1, quanto a imagens RGB, essas seriam transformadas em
tons de cinza, se já não estivessem nesse modo, e o gráfico resultante exibiria a quantidade de
pixels nos 256 tons de cinza possíveis. Por não serem realizadas operações sobre imagens em
RGB puro, não foi vista a necessidade da implementação do histograma que exibisse os
valores nas três bandas.
A figura 20 exibe um exemplo de histograma de uma imagem da base de dados
com a função executada no Matlab e na figura 21 pode ser visto o resultado para a execução
em uma imagem binária, neste caso realizada no Octave. Pode-se observar que apesar da
diferença nas ferramentas de exibição, o resultado está de acordo com as características das
imagens de entrada.
55
Figura 20 – Histograma (ii) da imagem(i) com a função executada no Matlab.
Figura 21 - Histograma (ii) da imagem binária (i) com a função executada no Octave.
Equalização: Para a função de equalização a saída esperada é um histograma
equalizado, ou seja, processado para que os tons de cinza sejam uniformemente distribuídos.
Além do histograma é esperada a exibição da imagem equalizada. A figura 22 mostra a
imagem original, a imagem 23 mostra o histograma da imagem antes da equalização,
enquanto as figuras 24 e 25 mostram, respectivamente, a imagem equalizada e o histograma
equalizado.
Figura 22 – Imagem original proveniente da base de imagens.
56
Figura 23 - Histograma da imagem 22 sem equalização.
Figura 24 – Imagem equalizada proveniente da execução da função no Matlab na imagem exibida na figura
22.
Figura 25 – Histograma equalizado da imagem 23 – execução no Matlab
57
Para o módulo de processamento intermediário os principais resultados obtidos
foram:
Abertura: A imagem resultante da aplicação desta função seria uma imagem com
contorno suavizado e sem ligações finas (istmos). O resultado pode ser visto claramente na
figura 26, principalmente na letra “M”. Na figura 27 é exibida a aplicação em uma imagem
em tons de cinza, onde é mais difícil visualizar a aplicação da função. Mas ao se observar as
bordas da imagem, percebe-se a suavização. Resultados ótimos da adição são perceptíveis
após o tratamento da imagem original, e na imagem da figura 20.2 não foi realizado nenhum
pré-tratamento.
Figura 26– Resultado (ii) da aplicação da função de abertura em uma imagem binária (i) no Octave.
Figura 27 – Resultado (ii) da aplicação da função de abertura em uma imagem em tons de cinza (i) realizada
no Matlab.
58
Fechamento: A imagem resultante neste caso seria uma imagem também com
contorno suavizado porém com as ligações preenchidas, além de ter seus buracos e baías
fundidos. A figura 28 exibe o resultado da aplicação da função em uma imagem binária,
enquanto a figura 29 exibe a mesma função aplicada numa imagem em tons de cinza,
observa-se que o Octave retorna a imagem binarizada, diferente do Matlab que a mantém em
tons de cinza. Para detecção de caracteres a binarização da imagem resultante é interessante
para eliminar os detalhes desnecessários da imagem.
Figura 28 – Aplicação da função de fechamento na imagem (i) resultando na imagem (ii), realizada no
Matlab.
Figura 29 – Aplicação da função de fechamento na imagem (i) resultando na imagem (ii), operação
realizada no Octave.
59
Esqueletonização: O objetivo da aplicação dessa função é a obtenção de uma
imagem resultante que exiba a linha de construção dos objetos na tela, especificamente as
linhas que compõem números na imagem. A imagem 30 exibe o resultado da aplicação da
esqueletonização em uma imagem binária. Observa-se que o algoritmo precisa de melhoria
para que o resultado final exiba apenas a linha fundamental de todos os componentes da
imagem original.
Figura 30 - Resultado (ii) da aplicação da função de esqueletonização na imagem (i) no Matlab.
Figura 31 – Resultado da aplicação de detecção de linhas horizontais (ii) e verticais (iii) na imagem (i) no
Octave.
60
Detecção de linhas: Para as funções de detecção de linhas é esperada uma imagem
de saída com as linhas destacadas de acordo com a função aplicada, 45º positivos, 45º
negativos, vertical ou horizontal. No caso de serem aplicadas a função linhas, as bordas da
imagem devem ser ressaltadas. As figuras 31 e 32 exibem os resultados da aplicação de
detecção de linhas verticais, horizontais, 45º positivos e negativos. A figura 33 mostra a
aplicação das quatro abordagens em uma imagem em tons de cinza.
Figura 32 – Resultado da aplicação de detecção de linhas 45º negativo (ii) e positivos (iii) na imagem (i) no
Octave.
Figura 33 – Resultado da aplicação de detecção de linhas (ii) na imagem (i) no Matlab.
61
Detecção de bordas: No caso desta função é esperada como saída uma imagem
cujas bordas dos objetos sejam evidenciadas. A figura 34 mostra o resultado da aplicação da
função de detecção de bordas em uma imagem.
Figura 34 – Resultado (ii) da aplicação do script de detecção de bordas na imagem (i). Executada no Matlab.
Segmentação: A função de segmentação codificada retorna a imagem com as
bordas dos caracteres evidenciadas. A figura 35 exibe a imagem de saída desta função.
Figura 35 – Resultado (ii) da aplicação da função de segmentação na imagem (i). Executada no Matlab.
62
De acordo com os resultados obtidos, pode-se definir que um fluxograma ideal
para as imagens da base de dados CBPF/MCT: aplicação da função de abertura na imagem,
para destacar a sequência numérica, em seguida aplicação da equalização. Nesta imagem
equalizada aplicar a segmentação e em seu resultado o fechamento, para evitar que as letras
fiquem com falhas. Por fim a aplicação da esqueletonização nessa imagem que está pronta
para a aplicação de algoritmo de reconhecimento de padrões.
Figura 36 – Fluxograma para imagens da base de dados CBPF/MCT.
O fluxograma definido na imagem 36 exibe o modo para o conjunto de imagens
com as características das imagens da base de dados CBPF/MCT. Esse conjunto de imagens
não possui ruídos que impeçam a aplicação das funções e possuem um nível de contraste bem
distribuído nos tons de cinza, não existindo imagens nem tão escuras nem tão claras que
atrapalhem a visualização da identificação da placa. Para um grupo de imagens genéricas foi
criado o fluxograma exibido na figura 37, que pode ser aplicado como uma lista de
verificações em uma base de imagens genérica. Seguindo o fluxo observa-se que situações em
que as imagens apresentem ruídos e contraste baixo são tratadas. Convém lembrar que em
63
situações de ruídos a aplicação de adição deverá ser utilizada conjuntamente com a média
dessas imagens.
Figura 37 – Fluxograma para imagens genéricas.
64
5. DOCUMENTAÇÃO
Este capítulo define as documentações utilizadas no desenvolvimento do
protótipo. O objetivo central do capítulo é nortear novos projetos a partir da documentação de
boas práticas observadas no projeto corrente.
Os tópicos que compõem o capítulo definem a documentação utilizada no
desenvolvimento do protótipo em si e na realização dos testes no protótipo.
5.1 Desenvolvimento do Protótipo
A documentação gerada no desenvolvimento do protótipo foi em forma de
comentários nos códigos e o presente projeto de pesquisa. Buscou-se deixar os comentários
nos códigos esclarecedores de modo a não poluir visualmente os scripts.
Para isso foi usado um padrão de documentação de cabeçalho com uma
identificação de onde aquele arquivo foi criado, o nome da faculdade e o semestre de
desenvolvimento, o nome da função do arquivo, uma breve descrição da função que o código
implementa, o nome do autor, a data de criação, as alterações e outras observações pertinentes
ao código. Esse cabeçalho é formatado com “%” no começo e fim de cada linha para que não
seja interpretado como implementação pelo compilador dos softwares. É posicionado na parte
superior de cada função.
65
Além do cabeçalho padrão no corpo da função são comentados os blocos de
comandos responsáveis por alocações de variáveis, criação de cópias da imagem de entrada,
implantação de funções adicionais e os comandos que compõem a rotina da função.
Comentários além destes somente foram adicionados quando o código implementado não era
de fácil entendimento, ou quando opções a implementação do código eram possíveis. O
padrão seguido para iniciar os arquivos de codificação está no Apêndice A – modelos de
formato dos arquivos fonte.
Durante a atividade de codificação nenhum outro documento foi criado, não
houve preocupação de se armazenar evidências de execução dos scripts nesta fase visto que o
período de testes era uma atividade já programada.
5.2 Realização dos Testes
Durante a realização dos testes foi utilizada uma planilha de controle de qualidade
do código, mencionada no tópico 4.2 do capítulo 4. Essa planilha teve importância tanto para
a atividade de codificação quanto para os testes. Sua utilização demonstrava os códigos que
necessitavam de retrabalho de codificação e quando o script atingia a qualidade desejada.
Entretanto não foi realizada com a planilha nenhum tipo de controle de versão,
visto que durante o desenvolvimento das funções esta necessidade não foi observada. A
utilização de um controle de versão permitiria coletar métricas como percentual de retrabalho
e incoerências recorrentes na codificação. Como esse fato viria adicionar uma carga extra de
atividades ao projeto sua implantação foi descartada, utilizando-se a planilha apenas para fins
de observação de quais funções ainda apresentavam defeitos.
Durante os testes, cada resultado considerado satisfatório produziu um grupo de
imagens de evidências. A armazenagem dessas imagens se deu através de criação de uma
árvore de diretórios, tornando desnecessária a utilização de ferramentas adicionais de
organização do banco de imagens. O mesmo processo foi adotado para as massas de teste. No
Apêndice B – modelos de planilha de controle de resultado dos testes, está documentado um
exemplo de planilha não preenchida.
66
Pode-se observar que a documentação gerada foi em quantidade mínima possível
objetivando facilitar a gerência desses artefatos. Além de evitar a absorção de atividades
desnecessárias ao projeto e uma consequente perda de produtividade.
67
6. CONCLUSÕES
A área de Processamento de Imagens apresenta uma gama de soluções para
diversos problemas cotidianos, entretanto suas soluções ainda não atingem o grau ótimo de
implementação. Dentre os fatores que colaboram para que este fato ocorra está a relação
intrínseca da área com a Matemática, a necessidade de construção de bases sólidas e extensas
de conhecimento para o domínio da matéria e a necessidade de recursos computacionais de
alto grau de desempenho para realização das tarefas.
Tais fatores contribuíram para que a área possua pouca permeabilidade de
profissionais. Essa falta de diversificação de pesquisas e de recursos humanos preparados
reflete o cenário atual da área, aplicações especializadas em domínios de aplicação restritos.
Visando chamar atenção para uma área que possui um alto índice de trabalhos publicados,
mas que ainda não atingiu um nível de maturidade adequado, este projeto foi proposto.
Inicialmente visto como a criação de um protótipo que sugerisse uma nova
abordagem para o reconhecimento de caracteres, o projeto desenvolveu-se como um possível
catalisador de novos pesquisadores. Agregando esta nova abordagem o projeto foi construído
com um foco principal além da construção de um protótipo, também como um modelo para
construção
de
protótipos
ou
aplicações
utilizando
softwares
especializados
de
desenvolvimento matemático. As ferramentas foram escolhidas levando em consideração que
sua aquisição fosse obtida de maneira simples e principalmente que a ferramenta
disponibilizasse uma base de ajuda, seja em forma de material ou de desenvolvedores, para
novos utilizadores. Procurou-se também utilizar tecnologias livres e confiáveis, e quando não
foi possível que a tecnologia fosse livre que esta possuísse um similar com tal característica.
68
O projeto inicialmente tinha um escopo de cobertura maior, era previsto a
construção de um protótipo que embarcaria características de reconhecimento de padrões.
Entretanto, no decorrer do desenvolvimento essa projeção teve que ser reavaliada, a
construção de um protótipo desse porte por um único pesquisador mantendo o caráter
pedagógico do projeto seria possível, porém com uma qualidade final comprometida. Devido
a essa reavaliação o projeto modificou o objetivo central para ser a construção das funções
que formariam os módulos de processamento básico e intermediário do protótipo inicial.
Ainda com o escopo reduzido pode-se observar as dificuldades em se
implementar protótipos sem utilizar bibliotecas proprietárias, ou ainda em uma linguagem
como o Matlab que possui pouco ou nenhuma implementação disponível para consulta,
apesar de apresentar uma melhora significativa na facilidade de implementação e
confiabilidade dos códigos, em comparação com a linguagem C# por exemplo.
Exemplificando a dificuldade de se desenvolver em linguagem como o Matlab, só foram
encontrados dois códigos que implementam esqueletonização, e ambos eram provenientes do
mesmo autor e estavam disponibilizados na página da MathWorks, enquanto na linguagem C
e C++ ou C# a oferta de códigos é farta. O problema identificado é que os códigos
apresentados em Matlab são extremamente direcionados para um tipo de imagem específica,
rachaduras que atravessem a imagem de extremidade a extremidade.Já nos códigos em outras
linguagens são utilizadas bibliotecas ou funções que impedem sua tradução imediata para a
linguagem Matlab ou ainda são escritos de forma incompreensível para desenvolvedores não
especializados na linguagem.
O código de esqueletonização mostrou-se como a mais difícil implementação. O
resultado final não é a versão ótima desse algoritmo, porém é uma abordagem que não utiliza
chamadas a funções complexas. Sua forma de implementação é simples e demonstra que é
possível a criação de funções sem a utilização de bibliotecas extensas ou módulos fechados.
Os outros algoritmos não se mostraram de difícil implementação, porém houve a necessidade
de reescrita dos códigos de modo a melhorar o entendimento do código globalmente.Com
esse processo a utilização de variáveis além do mínimo necessário pode ser adotada, fato que
não influi o desempenho do script.
A execução dos testes mostrou-se uma atividade de complexidade baixa, visto que
as ferramentas de codificação estão em versões estáveis e sem ocorrência de erros que
69
influenciem os resultados da execução dos códigos. A questão de lidar com ferramentas
instáveis era um risco assumido no início do projeto, visto que em experiências anteriores do
pesquisador as ferramentas demonstravam instabilidade durante o seu uso e utilização de
algumas de suas funções, em especial o Octave. Atualmente as versões se mostram além de
estáveis com uma otimização da utilização dos recursos disponibilizados pelo hardware,
memória e processador.
Outro aspecto que foi assumido como risco foi o método de exibição dos
resultados, as duas ferramentas utilizam motores de renderização e ferramentas de exibição
diferentes. Após a execução do primeiro teste o que se pode observar é que a qualidade das
imagens exibidas pelo Octave e seu mecanismo de exibição eram superiores aos do Matlab,
situação que se inverte quando se fala de gráficos de histograma, onde o Matlab exibe além
das coordenadas uma barra de dégradé de tons de cinza, que explicita ao usuário leigo qual o
extremo dos tons claros e escuros.
Por fim, observou-se que as divergências entre as implementações nas
ferramentas são mínimas. O reporte de erros de ambas as ferramentas é preciso e facilita o
processo de depuração do código. O método de trabalho das ferramentas é extremamente
simples e similar. Apesar da interface de utilização apontar para o Octave como um software
com limitações, essa impressão se desfaz durante a utilização.
A composição do referencial teórico encontrou um vasto material sobre os
assuntos a tratar. Observou-se que nos últimos anos os trabalhos na área de processamento de
imagens estão sendo direcionados para a área de Reconhecimento de Padrões, em especial
utilizando a área de Inteligência Artificial. A morfologia matemática é outro tópico comum
nesses trabalhos, e em outra vertente o reconhecimento de gestos, faces, digitais, objetos, etc.
Esse cenário reflete um caminho da área para a aplicação em soluções que sejam utilizadas
pelo usuário final, diferente das aplicações que até a década de 90 eram prioritárias, como o
uso militar e médico. O desenvolvimento de celulares e outros gadgets com uma capacidade
de processamento cada vez maior expandem as possibilidades de utilização da área de
Processamento de Imagens.
Finalmente, a conclusão que se chega é que o desenvolvimento de um projeto na
área de Processamento de Imagens demanda tempo e requer uma preparação prévia. Para que
70
um projeto venha a ser desenvolvido nessa área com sucesso é necessário um planejamento
prévio, objetivos claros e uma gerência forte. Não é realmente necessário o desenvolvimento
de funções básicas, existem inúmeras bibliotecas que suprem essa necessidade, entretanto o
período reservado para análise, codificação e testes dessas funções é fundamental para
eliminação de falhas de entendimento, fator que é relevante para construção de códigos mais
elaborados com maior exatidão. A metodologia seguida neste projeto não se apoiou em
nenhum modelo de desenvolvimento devido a equipe reduzida, este ponto deve ser analisado
em casos de projetos com maior número de integrantes. Outro fator de sucesso do projeto foi
o período reservado para o estudo do referencial teórico, que possibilitou no período de
codificação a adoção de alternativas mais eficazes para os problemas apresentados.
O projeto em sua versão final atingiu todos os objetivos propostos, desde sua
visão pedagógica sobre a área até a disponibilização de códigos e métodos, além da
experiência documentada para servir de insumo para novos projetos. A contribuição deste
trabalho é fornecer mais um “ponto de luz” nas questões que ainda não possuem uma solução
ótima. É com esta visão de novas contribuições que o projeto é concluído, esperando que
estes pontos que não apresentam cobertura adequada sejam vistos e tratados e que novos
ingressantes na área vejam o Processamento de Imagens para além da disciplina cursada, mas
como um ramo de estudo.
71
7. TRABALHOS FUTUROS
A partir dos resultados obtidos com o trabalho presente sugere-se como novos
projetos, a implementação do módulo de processamento avançado do protótipo, com
implementação da interface. A melhoria do algoritmo de esqueletonização de modo que possa
atender a uma gama maior de imagens. Migração do protótipo pronto para uma plataforma
Linux.
Seguindo a idéia do protótipo pronto, agregar funcionalidades que estão em
evidência atualmente, mas que não cobrem o escopo da área. Sugere-se a existência de uma
notificação do infrator logo após a aplicação da multa. Com o protótipo atendendo índices de
identificação satisfatórios, logo após a identificação da placa, automaticamente um outro
sistema iniciaria o processo de envio de mensagem para o telefone cadastrado no órgão
responsável, seja uma gravação prévia ou uma mensagem de texto em caso de celulares e um
sistema web para conferência de dados.
Em aplicações na área de Processamento de Imagens, estudos sobre a
identificação de gestos a partir do uso da esqueletonização, principalmente para celulares e
aparelhos com tela sensível ao toque. Ressaltando que um estudo conjunto de otimização de
aplicações que processam imagens nos softwares e hardware desses aparelhos seria
conveniente.
Em aplicações que estejam focadas no Reconhecimento de Padrões uma
funcionalidade em evidência atualmente é a identificação de rostos de pessoas em imagens,
estendendo esse conceito a identificação de sorrisos, tipos de roupas, adereços, cores, objetos,
72
juntamente com a associação a uma identificação à imagem são exemplos de aplicações que
possuem grande procura no mercado.
É notável como o domínio de aplicação da área está amplo, com a oferta cada vez
maior de banda larga, a popularização da internet e do hardware, a otimização e barateamento
de itens de hardware, condições propícias no comércio e massificação da web 2.0, das redes
sociais e da multimídia na internet, o cenário atual aponta para aplicações que atendam nichos
de mercado.
Ferramentas complexas que executam várias funções estão sendo migradas pelo
usuário comum para ferramentas que executem poucas tarefas que atendam as suas
necessidades. Esse novo comportamento deve ser observado de perto e deve-se estar atento
para as oportunidades que essa ação apresenta. Como dito durante o trabalho, as aplicações de
processamento de imagens ainda não atendem a necessidade, explorar as falhas atuais
oferecendo propostas simples são fatores que apontam para o sucesso dos projetos.
73
REFERÊNCIAS BIBLIOGRÁFICAS
ALBUQUERQUE, Márcio Portes de; ALBUQUERQUE , Marcelo Portes de. Processamento
de imagens: Métodos e Análises. 2000. 12 f. Centro Brasileiro de Pesquisas Físicas,
CBPF/MCT,
Rio
de
Janeiro,
2000.
Disponível
em
<www.cbpf.br/cat/pdsi/pdf/ProcessamentoImagens.PDF> Acesso em 8 de jun de 2009.
BONFIGLIOLI, Cristina Pontes. Representação e pensamento: a visibilidade dependente.
2008. 9 f. Trabalho apresentado ao Grupo de Trabalho do XVII Encontro da Compós,
Universidade
Paulistana,
UNIP,
São
Paulo,
2008.
Disponível
em
<
http://www.compos.org.br/data/biblioteca_296.pdf> Acesso em 19 abr. 2009.
BRASIL. Lei nº 9.503, de 23 de setembro de 1997. Código de Trânsito Brasileiro.
Disponível em < http://rootis.com/Opiniao/Lei9503CodigodeTransitoBrasileiro.html >
Acesso em 19 abr. 2009.
CARVALHO, Bernardo P. R. O estado da arte em métodos para reconhecimento de
padrões: Support Vector Machine. Belo Horizonte-MG: SUCESU 2005 - Congresso
Nacional de Tecnologia da Informação e Comunicação, 2005.
CBPF - Centro Brasileiro de Pesquisas Físicas. Matlab. Curso Introdutório. Rio de Janeiro,
2002.
Disponível
em
<
http://mesonpi.cat.cbpf.br/e2002/cursos/NotasAula/Tutorial_matlab.pdf > Acesso em 25 de
ago. 2009.
CONCI, Aura; AZEVEDO, Eduardo; LETA, Fabiana. Computação gráfica volume 2:
Processamento de Imagens Teoria e Prática . Rio de Janeiro: Campus/Elsevier, 2008.
DIVALTE, Garcia F. História. São Paulo: Editora Ática, 2000.
DOUGHERTY, Edward R.; LOTUFO, Roberto A. Hands-on morphological image
processing. Washington: SPIE PRESS, 2003.
74
FELGUEIRAS, Carlos Alberto. Processamento digital de imagens. 2007. Notas de aula.
Disponível em <http://www.dpi.inpe.br/~carlos/Academicos/Cursos/Pdi/pdi_filtros.htm>
Acesso em 27 mai 2009.
FONSECA, Leila Maria Garcia. Processamento digital de imagens. 2000. 105 f. Notas de
aula. Disponível em <http://geosere.ccr.ufsm.br//files> Acesso em 12 abr. 2009.
GONZALEZ, Rafael C.; WOODS, Richard E. Processamento de imagens digitais. São
Paulo: Edgard Blucher, 2000.
LEITE, Neucimar J. Introdução ao processamento de imagens digitais. Campinas: Instituto
de
Computação
Unicamp,
2004.
Disponível
em
<http://www.ic.unicamp.br/~afalcao/sensremoto/processamento.ppt> Acesso em 25 mai.
2009.
MATHWORKS.
Documentation:
Matlab.
2009.
Disponível
em
<
http://www.mathworks.com/access/helpdesk/help/techdoc/index.html> Acesso em 08 ago.
2009.
MICHAELIS. Moderno dicionário da língua portuguesa. Rio de Janeiro: Reader’s Digest;
São Paulo: Melhoramentos, 2000. 2 v.
NEVES, Samuel C. M.; PELAES, Evaldo. G. Estudo e implementação de técnicas de
segmentação de imagens. Revista Científica da UFPA, Belém, v.1, n. 2, jul. 2001.
NEVES, Sérgio R.; Algoritmos para segmentação de imagens infravermelhas. Rio de
Janeiro, 2003. Disponível em < http://www.pee.ufrj.br/teses/?Resumo=2003061251> Acesso
em 01 ago. 2009.
PREFEITURA DE FORTALEZA. Autarquia Municipal de Trânsito. AMC : Menos pedestres
mortos
em
acidentes
de
trânsito.
Fortaleza,
2007.
Disponível
em
<
http://www.amc.fortaleza.ce.gov.br/modules/news/article.php?storyid=2818> Acesso em 19
abr. 2009.
75
OCTAVE.
Octave
Documentation.
2009.
Disponível
http://www.gnu.org/software/octave/docs.html > Acesso em 14 ago. 2009.
em
<
RAJAN , Jeny, CHANDRASEKHAR P.S. Matlab Code, 2006. Disponível em <
http://www.mathworks.com/matlabcentral/fileexchange/8031> Acesso em 25 out. 2009.
SCALON, Vicente Luiz. Introdução aos Sistemas Matlab/GNU Octave. São Paulo, 2008.
Disponível em <http://wwwp.feb.unesp.br/scalon/grad> Acesso em 14 nov. 2009
SCURI, Antonio Escaño. Fundamentos da imagem digital. Rio de Janeiro, 2002.
Disponível em <http://www.tecgraf.puc-rio.br/~scuri/download/fid.pdf > Acesso em 27 fev.
2009.
SEARA, Daniela Marta. Algoritmos para detecção de bordas. Florianópolis, 1998.
Disponível em < http://www.inf.ufsc.br/~visao/1998/seara/> Acesso em 25 mai. 2009.
SUN.
Software
MySQL:
Visão
geral.
2009.
Disponível
http://br.sun.com/practice/software/mysql/> Acesso em 14 ago. 2009.
em
<
TAGLIAFERRO, Fátima Aparecida. Técnicas de reconhecimento automatizado de
padrões baseados em imagens digitais. 2007. 44 f. Trabalho de Conclusão de Curso
(Ciência da Computação) Faculdade de Jaguariúna, FAJ, Jaguariúna, 2007. Disponível em <
http://bibdig.faj.br/document/?view=65> Acesso em 02 mar. 2009.
76
MATERIAL DE ESTUDO
ADVANCED SOURCE CODE. Interfacing Matlab to MySQL. 2007. Disponível em <
http://www.advancedsourcecode.com/matlabphpmysql.asp> Acesso em 12 out. 2009.
GONZALEZ, Rafael C.; WOODS, Richard E.; EDDINS, Steven L. Digital image
processing using MATLAB. Pearson Prentice Hall, 2004.
HAHN, Brian; VALENTINE, Daniel T. Essential Matlab® for engineers and scientists:
Third Edition. 3 ed. Burlington: Elsevier, 2007.
KUNCICKY, David C. MATLAB® programming. Englewood Clifs, N.J.: Prentice Hall,
2003.
MITRA, Sanjit, K. Digital signal processing: A computer-based approach. 2 ed. New York:
McGrawHill, 2003.
MYLER, Harley R.; WEEKS, Arthur R. The pocket handbook of image processing
algorithms in C. Englewood Clifs, N.J.: Prentice Hall, 2006.
PARKER, J. R. Algorithms for image processing and computer vision. New York: John
Wiley & Sons, 1997.
PRATT, William K. Digital image processing . 4 ed. Hoboken, N. J.: Wiley-Interscience,
2007.
SALERI, Fausto; QUARTERONI, Alfio. Scientific computing with Matlab® and Octave.
2 ed. Berlin: Springer-Verlag, 2006.
77
VIEIRA, Danilo R. Criando uma interface gráfica para obter distâncias entre pontos em
uma figura. 2009. Disponível em < http://alunoca.io.usp.br/~drvieira/matlab/gui-ptos/>
Acesso em 12 out. 2009.
78
APÊNDICE A – MODELOS DE FORMATO DOS ARQUIVOS FONTE
%-------------------------------------------------------------------------%
% Código Utilizado no Protótipo desenvolvido durante o
%
% Projeto de TCC II
%
% Faculdade Farias Brito
%
% 2009.2
%
% Função :
%
% Descrição :
%
% Autor : Vinicius Lima
%
% Data : //
%
% Alterações:
%
%-------------------------------------------------------------------------%
function nome_da_funcao(parametros)
%definição das variáveis de apoio e
%criação de imagens auxiliares de mesmo tamanho
% rotina da função
endfunction
79
APÊNDICE B – MODELOS DE PLANILHA DE CONTROLE DE RESULTADO DOS
TESTES
Identificação
Nome do
código-fonte
Data
Identificação
Comentárioserro
Comentárioscorreção
80
APÊNDICE C – CÓDIGOS DA IMPLEMENTAÇÃO
Função: Abertura
function abertura(imagem1)
%definição das variáveis de apoio e
%criação de imagens auxiliares de mesmo tamanho
Ver_ima = imread(imagem1);
[lin,col,dim] = size(Ver_ima);
copia_01 = Ver_ima;
copia_02 = zeros(lin,col);
copia_03 = zeros(lin,col);
% definição do elemento estruturante
% arbitrary - elementos produzidos pelo desenvolvedor
% square - quadrados, somente fornecido o tamanho
% rectangule - retangulos, fornecido quantidade de linhas e colunas da matriz.
ee_ab = strel('arbitrary',[0 0 0; 1 1 1; 0 1 0]);
%ee_ab = strel('square',3);
%ee_ab = strel('rectangle',[2 1]);
%Para o Octave comentar as linhas acima que usam ‘Strel’ e descomentar a linha seguinte
%ee_ab = [0 0 0; 1 1 1; 0 1 0];
% rotina da função
copia_02 = imerode(copia_01,ee_ab);
copia_03 = imdilate(copia_02,ee_ab);
imshow(copia_03,[]);
endfunction
Função: Adição
function adicao(imagem1, imagem2)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_im1 = imread(imagem1);
copia_im2 = imread(imagem2);
[lin1,col1] = size(copia_im1);
[lin2,col2] = size(copia_im2);
81
% verificação dos tamanhos da imagens
if(lin1 ~= lin2 || col1 ~= col2)
printf('Imagens de tamanhos diferentes');
end
mat_imag = copia_im1;
mat_imag2 = copia_im2;
mat_final = zeros(lin1,col1);
% rotina
for i = 1:lin1
for j = 1:col1
aux = mat_imag(i,j) + mat_imag2(i,j);
if(aux < 0)
aux = 0;
end
if(aux > 255)
aux = 255;
end
mat_final(i,j) = aux;
end
end
imshow(mat_final);
endfunction
Função: Borda
Baseado no algoritmo de Jeny Rajan e Chandrashekar
function borda(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tamanho
Ver_tam = imread(imagem);
copia_01 = Ver_tam;
% Aplicação do filtro mediana para remover possíveis ruídos na imagem
% Analisar a necessidade
copia_01 = medfilt2(copia_01,[3 3]);
% Função inerente do Matlab para identificação de bordas
copia_bordas = edge(copia_01,'sobel');
imshow(copia_bordas,[]);
endfunction
82
Função: Equalização
function equaliza(imagem1)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem1);
% Rotina
h = histeq(copia_01);
figure, imhist(h);
figure, histeq(copia_01)
endfunction
Função: Esqueletonização
function esqueleto(imagem1)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tamanho
Ver_ima = imread(imagem1);
[lin,col,dim] = size(Ver_ima);
copia_01 = Ver_ima;
copia_02 = zeros(lin,col);
copia_hit = zeros(lin,col);
nulo
= 0;
aux1
= 0;
aux2
= 0;
ee
= [1 1 1; 0 1 0; 0 0 0];
ee1
= [0 0 0; 0 1 0; 1 1 1];
ee2
= [0 0 0; 0 1 0; 0 1 0];
%criar o inverso da imagem original
for i=1:lin
for j=1:col
if(copia_01(i, j)== 0)
copia_02(i, j) = 1;
else
copia_02(i, j) = 0;
end
end
end
83
%%%%%%%%%%%%%% ITERAÇÃO 01 %%%%%%%%%%%%%%%%%%%
nulo = 0;
% definição dos elementos estruturantes e seu inverso 01
ee_ab01 = [0 1 1; 0 1 1; 0 1 1];
while(nulo == 0)
nulo = 0;
% criar as imagens erodidas
ima_ero01 = imerode(copia_01, ee_ab01);
%realizar a operação de hitormiss na imagem
for i=1:lin
for j=1:col
if(ima_ero01(i, j) == 1)
copia_hit(i, j) = 1;
end
end
end
%criar o inverso da imagem hit
for i=1:lin
for j=1:col
if(copia_hit(i, j)== 0)
copia_hit(i, j) = 1;
else
copia_hit(i, j) = 0;
end
end
end
% rotina de afinamento
[lin, col] = size(copia_01);
for i=1:lin
for j=1:col
if(copia_01(i, j) == copia_hit(i, j))
copia_01(i, j) = 1;
else
copia_01(i, j) = 0;
end
end
end
% definição do ponto de parada
for i=1:lin
for j=1:col
if(copia_01(i, j) == Ver_ima(i, j))
nulo
= 0;
84
else
nulo
end
end
end
= 1;
end %endwhile
%%%%%%%%%%%%%% ----------- %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%% ITERAÇÃO 02 %%%%%%%%%%%%%%%%%%%
nulo = 0;
% definição dos elementos estruturantes e seu inverso 02
ee_ab02 = [0 0 0; 1 1 1; 1 1 1];
while(nulo == 0)
nulo = 0;
% criar as imagens erodidas
ima_ero02 = imerode(copia_01, ee_ab02);
%realizar a operação de hitormiss na imagem
for i=1:lin
for j=1:col
if(ima_ero02(i, j) == 1)
copia_hit(i, j) = 1;
end
end
end
%criar o inverso da imagem hit
for i=1:lin
for j=1:col
if(copia_hit(i, j)== 0)
copia_hit(i, j) = 1;
else
copia_hit(i, j) = 0;
end
end
end
% rotina de afinamento
[lin, col] = size(copia_01);
for i=1:lin
for j=1:col
if(copia_01(i, j) == copia_hit(i, j))
copia_01(i, j) = 1;
else
copia_01(i, j) = 0;
end
85
end
end
% definição do ponto de parada
for i=1:lin
for j=1:col
if(copia_01(i, j) == Ver_ima(i, j))
nulo
= 0;
else
nulo
= 1;
end
end
end
end %endwhile
%%%%%%%%%%%%%% ----------- %%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%% ITERAÇÃO 03 %%%%%%%%%%%%%%%%%%%
nulo = 0;
% definição dos elementos estruturantes e seu inverso 03
ee_ab03 = [1 0 0; 1 1 0; 1 0 0];
while(nulo == 0)
nulo = 0;
% criar as imagens erodidas
ima_ero03 = imerode(copia_01, ee_ab03);
%realizar a operação de hitormiss na imagem
for i=1:lin
for j=1:col
if(ima_ero03(i, j) == 1)
copia_hit(i, j) = 1;
end
end
end
%criar o inverso da imagem hit
for i=1:lin
for j=1:col
if(copia_hit(i, j)== 0)
copia_hit(i, j) = 1;
else
copia_hit(i, j) = 0;
end
end
end
% rotina de afinamento
[lin, col] = size(copia_01);
86
for i=1:lin
for j=1:col
if(copia_01(i, j) == copia_hit(i, j))
copia_01(i, j) = 1;
else
copia_01(i, j) = 0;
end
end
end
% definição do ponto de parada
for i=1:lin
for j=1:col
if(copia_01(i, j) == Ver_ima(i, j))
nulo
= 0;
else
nulo
= 1;
end
end
end
end %endwhile
%%%%%%%%%%%%%% ----------- %%%%%%%%%%%%%%%%%%%
copia_hit = imerode(copia_hit,ee);
copia_hit = imerode(copia_hit,ee2);
% copia_hit = imerode(copia_hit,ee2);
copia_hit = imdilate(copia_hit,ee2);
imshow(copia_hit,[]);
end
Função: Fechamento
function fechamento(imagem1)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tamanho
Ver_ima = imread(imagem1);
[lin,col,dim] = size(Ver_ima);
copia_01 = Ver_ima;
copia_02 = zeros(lin,col);
copia_03 = zeros(lin,col);
87
% definição do elemento estruturante
% arbitrary - elementos produzidos pelo desenvolvedor
% square - quadrados, somente fornecido o tamanho
% rectangule - retangulos, fornecido quantidade de linhas e colunas da matriz.
ee_ab = strel('arbitrary',[0 0 0; 1 1 1; 0 1 0]);
%ee_ab = strel('square',3);
%ee_ab = strel('rectangle',[2 1]);
%Para o Octave comentar as linhas acima que usam ‘Strel’ e descomentar a linha seguinte
%ee_ab = [0 0 0; 1 1 1; 0 1 0];
% rotina da função
copia_02 = imdilate(copia_01,ee_ab);
copia_03 = imerode(copia_02,ee_ab);
imshow(copia_03,[]);
endfunction
Função: Histograma
function histograma(imagem1)
% leitura da imagem
copia_01 = imread(imagem1);
% rotina
figure, imhist(copia_01)
endfunction
Função: Detecção de Linhas 45º negativos
function linhas45n(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem);
[lin,col] = size(copia_01);
copia_02 = zeros(lin,col);
masca = [-1 -1 2;
-1 2 -1;
2 -1 -1];
% rotina da função
copia_02 = conv2(copia_01, masca);
88
imshow(copia_02);
endfunction
Função: Detecção de Linhas 45º positivos
function linhas45n(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem);
[lin,col] = size(copia_01);
copia_02 = zeros(lin,col);
masca = [2 -1 -1;
-1 2 -1;
-1 -1 2];
% rotina da função
copia_02 = conv2(copia_01, masca);
imshow(copia_02);
endfunction
Função: Detecção de Linhas horizontais
function linhash(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem);
[lin,col] = size(copia_01);
copia_02 = zeros(lin,col);
masca = [-1 -1 -1;
2 2 2;
-1 -1 -1];
% rotina da função
copia_02 = conv2(copia_01, masca);
imshow(copia_02);
endfunction
89
Função: Detecção de Linhas verticais
function linhasv(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem);
[lin,col] = size(copia_01);
copia_02 = zeros(lin,col);
masca = [-1 2 -1;
-1 2 -1;
-1 2 -1];
% rotina da função
copia_02 = conv2(copia_01, masca);
imshow(copia_02);
endfunction
Função: Detecção de Linhas
function linhas(imagem)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_01 = imread(imagem);
[lin,col] = size(copia_01);
copia_02 = zeros(lin,col);
copia_03 = zeros(lin,col);
copia_04 = zeros(lin,col);
copia_05 = zeros(lin,col);
copia_06 = zeros(lin,col);
mascav
= [-1 2 -1;
-1 2 -1;
-1 2 -1];
mascah
= [-1 -1 -1;
2 2 2;
-1 -1 -1];
mascap
= [ 2 -1 -1;
-1 2 -1;
-1 -1 2];
mascan
= [-1 -1 2;
90
-1 2 -1;
2 -1 -1];
% rotina da função
copia_02 = conv2(copia_01, mascav);
copia_03 = conv2(copia_01, mascah);
copia_04 = conv2(copia_01, mascap);
copia_05 = conv2(copia_01, mascan);
copia_06 = copia_02 + copia_03 + copia_04 + copia_05;
imshow(copia_06);
endfunction
Função:Segmentação
Baseado no algoritmo de Jeny Rajan e Chandrashekar
function seg(imagem1)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tamanho
Ver_ima = imread(imagem1);
[lin,col,dim] = size(Ver_ima);
copia_01 = Ver_ima;
copia_02 = zeros(lin,col);
%Aplicação do filtro mediana para eliminar ruído
copia_01 = medfilt2(copia_01,[3 3]);
%Aplicação de função para encontrar bordas
copia_02 = edge(copia_01,'sobel');
[lin02,col02]=size(copia_02);
masca = [0 0 0 0 0;
0 1 1 1 0;
0 1 1 1 0;
0 1 1 1 0;
0 0 0 0 0;];
%Suavização - diminui os objetos conectados na imagem
ima_su = conv2(double(copia_02),double(masca));
%Calculo dos componentes conectados
ima_con = bwlabel(ima_su,8);
91
maxi = max(max(ima_con));
%armanazenar a imagem num vetor
[r,c] = find(ima_con == 17);
rc
= [r c];
[sx sy] = size(rc);
n1
= zeros(lin02,col02);
for i=1:sx
x1 = rc(i,1);
y1 = rc(i,2);
n1(x1,y1)=255;
end
%imshow(Ver_ima);
%imshow(copia_01);
imshow(ima_su);
%imshow(n1,[]);
end
Função:Subtração
function subtra(imagem1, imagem2)
% definição das variáveis de apoio e
% criação de imagens auxiliares de mesmo tam.
copia_im1 = imread(imagem1);
copia_im2 = imread(imagem2);
[lin1,col1] = size(copia_im1);
[lin2,col2] = size(copia_im2);
% verificação dos tamanhos da imagens
if(lin1 ~= lin2 || col1 ~= col2)
printf('Imagens de tamanhos diferentes');
end
mat_imag = copia_im1;
mat_imag2 = copia_im2;
mat_final = zeros(lin1,col1);
% rotina
for i = 1:lin1
for j = 1:col1
aux = mat_imag(i,j) - mat_imag2(i,j);
if(aux < 0)
aux = 0;
end
92
if(aux > 255)
aux = 255;
end
mat_final(i,j) = aux;
end
end
imshow(mat_final);
endfunction
93
APÊNDICE D – MASSA DE TESTES
Grupo de Imagens Básicas
Arquivo: “conso.jpg” – 490x224
Arquivo: “Consoantes.png” – 150x113
Arquivo: “cup.png” – 100x100
Arquivo: “flower.png” – 100x100
94
Arquivo: “gear.png” – 100x100
Arquivo: “letras.jpg” – 490x224
Arquivo: “letras2.jpg” – 490x224
Arquivo: “Letras.png” – 160x121
95
Arquivo: “LetrasLinhas.png” – 200x151
Arquivo: “LetrasNumeros.png” – 200x151
Arquivo: “LetrasNumerosLinhas.png” – 200x151
Arquivo: “Linhas45n.png” – 160x121
96
Arquivo: “Linhas45p.png” – 160x121
Arquivo: “Linhas.png” – 160x121
Arquivo: “LinhasH.png” – 160x121
Arquivo: “LinhasV.png” – 160x121
Arquivo: “number.png” – 110x68
97
Arquivo: “Numeros.png” – 150x113
Arquivo: “NumerosLinhas.png” – 150x113
Arquivo: “vogais.jpg” – 490x224
Arquivo: “Vogais.png” – 120x90
98
Grupo de Imagens de Calibração
Arquivo: “01.png” – 150x113
Arquivo: “02.png” – 150x113
Arquivo: “03.png” – 150x113
Arquivo: “64bits.jpg” – 500x333
99
Arquivo: “car3.jpg” – 436x302
Arquivo: “SA_Brazil_GI.jpg” – 544x464
Grupo de Imagens da Base
Arquivo: “Base (01).jpg” – 640x240
100
Arquivo: “Base (2).jpg” – 640x240
Arquivo: “Base (3).jpg” – 640x240
Arquivo: “Base (4).jpg” – 640x240
Arquivo: “Base (5).jpg” – 640x240
101
Arquivo: “Base (6).jpg” – 640x240
Arquivo: “Base (7).jpg” – 640x240
Arquivo: “Base (8).jpg” – 640x240
Arquivo: “Base (9).jpg” – 640x240
102
Arquivo: “Base (10).jpg” – 640x240
Arquivo: “Base (11).jpg” – 640x240
Arquivo: “Base (12).jpg” – 640x240
Arquivo: “Base (13).jpg” – 640x240
103
Arquivo: “Base (14).jpg” – 640x240
Arquivo: “Base (15).jpg” – 640x240
Arquivo: “Base (16).jpg” – 640x240
Arquivo: “Base (17).jpg” – 640x240
104
Arquivo: “Base (18).jpg” – 640x240
Arquivo: “Base (19).jpg” – 640x240
Arquivo: “Base (20).jpg” – 640x240
105
ANEXO I - CONSTRUÇÃO DA INTERFACE
Tutorial desenvolvido por Danilo Vieira e disponibilizado em
<http://alunoca.io.usp.br/~drvieira/matlab/gui-ptos/>>, a versão aqui documenta foi editada.
Criando a interface
Executar a função guide no prompt do Matlab. Esta função trará a janela exibida na
figura Anexo I -.1:
Anexo I - 1: janela exibida ao solicitor a função guide.
Seleciona-se uma das opções de templates, automaticamente será criado um arquivo
*.m correspondente à sua interface. Este arquivo conterá o código para as ações dos botões,
controles de texto, menus e demais componentes existentes na interface.
Na tela seguinte a interface é construída a partir da ação de arrastar e soltar os
elementos. A figura Anexo I - 2 exibe essa situação. Após o salvamento da interface, esta é
salva com o nome fornecido, seu comportamento é parecido com uma função normal.
106
Anexo I - 2 – Exemplo de construção de uma interface.
Codificando o exemplo
“Para associar ações aos componententes, o Matlab utiliza os chamados callbacks”
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% mostra uma tela para que o usuário escolha um arquivo de imagem:
[filename, canceled] = imgetfile;
% se o usuário não tiver cancelado
if ˜canceled
% guarda o nome do arquivo
handles.arquivo = filename;
% abre a imagem
handles.imagem = imread(filename);
% seleciona o componente axes1
axes(handles.axes1);
% exibe a figura
imshow(handles.imagem);
end
% reseta a referência
handles.px2min = NaN;
% salva a variável handles
guidata(hObject, handles);
107
“Handles são números que identificam os componentes, eles ficam armazenados na
variável handles. Essa variável é do tipo struct e é muito importante: é a única que está
disponível para todos os callbacks, pois é salva com a função guidata.”
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% ativa o axes1
axes(handles.axes1);
% mostra a imagem (isso reseta a imagem quando marcamos uma nova referência)
imshow(handles.imagem);
% pegamos qual a distância que o usuário que marcou
% ("edtRef" é a propriedade "Tag" da caixa de texto)
numRef = str2double(get(handles.edtRef, 'String'));
% Vê se o usuário digitou um número válido, caso contrário
% mostra uma mensagem e sai desse callback
if isnan(numRef) || (numRef <= 0)
% mostra a mensagem
errordlg('Por favor, digite um número válido.', 'Erro');
% sai da função
return;
end
% pede para o usuário marcar dois pontos
ptos = ginput(2);
% calcula a distância em pixels que o usuário marcou.
% se você estudou vetores, sabe que distância entre pontos
% pode ser obtida pela norma do vetor que tem
% início num ponto e fim no outro, então basta chamar
% a função norm com a diferença entre os pontos como
% parâmetro.
c = norm(ptos(1,:)-ptos(2,:)) / numRef;
% converte a distância em pixels para milhas náuticas, levando
% em consideração que o usuário pode ter marcado em qualquer
% unidade disponível.
% get(handles.popupmenu1, 'Value') retorna qual item o usuário escolheu
switch get(handles.popupmenu1, 'Value')
case 1 % minuto
fator = c;
case 2 % segundo
fator = c / (1/60);
case 3 % grau
fator = c / 60;
case 4 % quilometro
fator = c / (1/(1852 * 1000));
case 5 % metro
fator = c / (1/1852);
end
108
% guarda a referência
handles.px2min = fator;
guidata(hObject, handles);
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if isnan(handles.px2min)
errordlg('Marque a referência primeiro', 'Erro');
return;
end
numEst = str2double(get(handles.edtNumEst, 'String'));
if ~isnan(numEst) && numEst > 1
axes(handles.axes1);
pto = ginput(1);
hold on;
plot(pto(1), pto(2), 'xr');
else
errordlg('Por favor, digite um número válido de estações.', 'Erro');
return;
end
for j=2:numEst
last = pto;
pto = ginput(1);
plot(pto(1), pto(2), 'xr');
line([last(1) pto(1)], [last(2) pto(2)]);
d = ( norm(last-pto) / handles.px2min ) * 1852;
text(pto(1)+(last(1)-pto(1))/2, pto(2)+(last(2)-pto(2))/2, ...
sprintf('%.2fm', d), 'backgroundcolor', 'y');
end
hold off;
Transformando num executável
Para transformar a interface num programa portável:
mcc -m interface.m
Será necessária a instalação do MCR (MATLAB Compiler Runtime) um compilador
que é livre e não necessita de compra.
109
ANEXO II - CONEXÃO COM O BANCO
Scripts de conexão disponibilizados pela Advanced Source Code e podem ser
encontrados em (http://www.advancedsourcecode.com/matlabphpmysql.asp)
Entrada de dados - MySql:
function [out]=mysql_input(hostname,username,password,query,url)
% [out]=mysql_input(hostname,username,password,query,url)
% This function executes a list of MySql commands where no output is
% required (for example INSERT, UPDATE, ...).
% INPUT:
% hostname: 'localhost' or the host name string
% username: MySql username
% password: MySql password
% query: the list with MySql commands. Query is a cell.
% url:
the URL of the .php file that is used to interface with MySql
%
server
% OUTPUT:
% out:
always set to 1
% Query escape string
L = length(query);
for ii=1:L
q = query{ii};
q = strrep(q, ' ', '_spazio_'); % ASCII code 32
q = strrep(q, '''', '_apice_'); % ASCII code 39
q = strrep(q, '\', '_slash_'); % ASCII code 92
q = strrep(q, '"', '_virgo_'); % ASCII code 34
q = strrep(q, '#', '_canc_'); % ASCII code 35
q = strrep(q, '%', '_perc_'); % ASCII code 37
q = strrep(q, '&', '_and_'); % ASCII code 38
query{ii} = q;
end
% Set POST parameters
opt{1} = 'hostname';
opt{2} = hostname;
opt{3} = 'username';
opt{4} = username;
opt{5} = 'password';
opt{6} = password;
L = length(query);
myquery = query{1};
for ii=2:L
myquery = strcat(myquery,'_pck_',query{ii});
end
opt{7} = 'myquery';
opt{8} = myquery;
% Retry to read the URL
done = 0;
while done==0
110
try
% Try to read the URL
HTML = urlread(url,'POST',opt);
done = 1;
catch
% If an error has occurred wait for some time before re-trying
disp('Error during URL reading. Retrying...');
done = 0;
pause(0.2);
end
end
out = 1;
Saída de dados - MySql:
function [out]=mysql_output(hostname,username,password,query,url)
% [out]=mysql_output(hostname,username,password,query,url)
% This function executes a list of MySql commands where some output is
% required (just like a SELECT command).
% The list of MySql commands can include several commands where the last
% one can be a SELECT command (the output of the function).
% INPUT:
% hostname: 'localhost' or the host name string
% username: MySql username
% password: MySql password
% query: the list with MySql commands. Query is a cell.
% url:
the URL of the .php file that is used to interface with MySql
%
server
% OUTPUT:
% out:
a cell with the results.
% Query escape string
L = length(query);
for ii=1:L
q = query{ii};
q = strrep(q, ' ', '_spazio_'); % ASCII code 32
q = strrep(q, '''', '_apice_'); % ASCII code 39
q = strrep(q, '\', '_slash_'); % ASCII code 92
q = strrep(q, '"', '_virgo_'); % ASCII code 34
q = strrep(q, '#', '_canc_'); % ASCII code 35
q = strrep(q, '%', '_perc_'); % ASCII code 37
q = strrep(q, '&', '_and_'); % ASCII code 38
query{ii} = q;
end
% Set POST parameters
opt{1} = 'hostname';
opt{2} = hostname;
opt{3} = 'username';
opt{4} = username;
opt{5} = 'password';
opt{6} = password;
L = length(query);
myquery = query{1};
111
for ii=2:L
myquery = strcat(myquery,'_pck_',query{ii});
end
opt{7} = 'myquery';
opt{8} = myquery;
% Retry to read the URL
done = 0;
while done==0
try
% Try to read the URL
HTML = urlread(url,'POST',opt);
done = 1;
catch
% If an error has occurred wait for some time before re-trying
disp('Error during URL reading. Retrying...');
done = 0;
pause(0.2);
end
end
HTMLnum = double(uint8(HTML));
pos = find(HTMLnum == 10);
L
= length(pos);
cont = 1;
p0
= 1;
for ii=1:L
p1
= pos(ii)-1;
stringa = HTML(p0:p1);
if ~(length(stringa)==1 && double(uint8(stringa))==10)
out{cont} = stringa;
cont
= cont+1;
end
p0
= p1+1;
end
Entrada de dados - PHP:
<?php
$link
= mysql_connect('$hostname','$username','$password');
$explode_result = explode("_pck_",$myquery);
$L
= count($explode_result);
for ($ii=0;$ii<$L;$ii=$ii+1)
{
$query = $explode_result[$ii];
$query = str_replace("_apice_","'",$query);
$query = str_replace("_spazio_"," ",$query);
$query = str_replace("_slash_","\\",$query);
$query = str_replace("_virgo_","\"",$query);
$query = str_replace("_canc_","#",$query);
$query = str_replace("_perc_","\%",$query);
$query = str_replace("_and_","&",$query);
$risultato = mysql_query($query);
}
?>
112
Saída de dados - PHP:
<?php
$link
= mysql_connect('$hostname','$username','$password');
$explode_result = explode("_pck_",$myquery);
$L
= count($explode_result);
for ($ii=0;$ii<$L;$ii=$ii+1)
{
$query = $explode_result[$ii];
$query = str_replace("_apice_","'",$query);
$query = str_replace("_spazio_"," ",$query);
$query = str_replace("_slash_","\\",$query);
$query = str_replace("_virgo_","\"",$query);
$query = str_replace("_canc_","#",$query);
$query = str_replace("_perc_","\%",$query);
$query = str_replace("_and_","&",$query);
$risultato = mysql_query($query);
}
while ($riga = mysql_fetch_array($risultato))
{
$L = count($riga);
for ($ii=0;$ii<$L;$ii=$ii+1)
{
print("$riga[$ii]\n");
}
}
?>
Download

TCC II - Faculdade Farias Brito