Procurando o pixel certo
Autor: Cláudio Antônio Peanho | Publicado: 2011-01-18T20:15:00-02:00

Processamento de imagens é uma atividade inerentemente complexa, apesar dos avanços surpreendentes em capacidade computacional, no campo do reconhecimento de padrões não temos ainda nada que se aproxime da capacidade do cérebro, a parte interessante é que na maioria dos casos não precisamos.
Um dos projetos do programa de estágio desenvolvido na empresa, tem como objetivo o reconhecimento de imagens digitalizadas de documentos (RG, CPF, CNH e etc), um dos requisitos estabelece que o software receba uma única imagem digitalizada contendo múltiplos documentos. Então vamos ao primeiro problema, como segmentar as imagens?
Ao observarmos uma imagem digitalizada de múltiplos documentos, conseguimos visualmente segmentar a imagem entre fundo e imagens dos documentos individuais. Uma das características que observamos para realizar esse raciocínio é a variação na intensidade da imagem ao longo de uma determinada direção, isto é, a diferença de contraste entre o fundo uniforme e as imagens dos documentos.
Em imagens coloridas o número de cores é imenso, considerando uma imagem colorida no formato RGB 24 bits temos cerca de 16 milhões de cores, essa complexidade não traz nenhum ganho significativo ao nosso problema. Dessa forma podemos simplificá-lo realizando o mapeamento do espaço de cor RGB para uma representação em tons de cinza restringindo assim o número de cores a 256 diferentes tons.
O ideal é que o fundo de nossa imagem de entrada seja uniforme, pense em uma folha de sulfite branca, no entanto, uma imagem digitalizada apresenta distorções inerentes ao processo de obtenção, fazendo-se necessário a remoção desse ruído para conseguirmos melhores resultados. Para o tipo de ruído em nosso problema a aplicação de um filtro Gaussiano é suficiente. De forma simplificada, um filtro Gaussiano atribui a cada pixel na imagem o valor da média ponderada (por uma função Gaussiana) de seus vizinhos.
Apesar de ser válido escrever um programa a partir do zero, em desenvolvimento profissional o comum é a reutilização de código, isso se traduz na integração de trechos de código, bibliotecas ou até mesmo aplicações completas ao programa em desenvolvimento. Em nosso projeto utilizamos a aplicação de processamento de imagens ImageJ que expõe sua biblioteca para integração em outras aplicações.
Voltando ao problema em questão, com a seqüência de operações descritas, reduzimos o problema de segmentar uma imagem colorida de múltiplos documentos ao de detectar o contorno de regiões com intensidade de cinza diferente daquela que corresponde a cor de fundo.
Voltando ao problema em questão, com a seqüência de operações descritas, reduzimos o problema de segmentar uma imagem colorida de múltiplos documentos ao de detectar o contorno de regiões com intensidade de cinza diferente daquela que corresponde a cor de fundo.
Em linhas gerais a ferramenta WandTool realiza a conversão da imagem para preto e branco com base em valores recebidos como parâmetros e inicia uma busca a partir das coordenadas do pixel candidato até encontrar um pixel cujo valor (agora temos apenas pixels com valor 0 ou 255) seja diferente do valor dos pixels de fundo. No caso de o pixel candidato estar contido em uma imagem a ser segmentada busca-se o primeiro pixel de fundo. Ao encontrar esse pixel o algoritmo passa a registrar as coordenadas dos pixels que constituem o contorno da região.
Como na conversão para uma imagem binária, pixels que pertencem as imagens individuais dos documentos podem ser classificados como de fundo, utilizamos como critérios para aceitar uma região retornada pela ferramenta a área delimitada e o número de pixels candidatos conexos contidos na região. Ao aceitarmos uma região computamos sua caixa delimitadora e recortamos a região correspondente na imagem original (não processada), a região delimitada pela caixa é então preenchida com pixels da cor de fundo de forma a não interferir na detecção de outras regiões.
Obtivemos resultados acima de nossas expectativas com essa abordagem, todos os testes resultaram na segmentação correta das imagens, no entanto, algumas questões surgem naturalmente.
A primeira refere-se a uma restrição, caso as imagens dos documentos apresentem inclinação em relação as margens da imagem, a caixa delimitando a imagem do documento conterá parte do fundo além de manter essa inclinação, imagine um retângulo inclinado a 45º inscrito em outro na horizontal. Assim, as imagens deveriam estar alinhadas na horizontal. Eliminar essa restrição foi nosso segundo requisito do projeto.
Outra questão é com relação a identificação da cor de fundo, os passos descritos assumem que ela seja conhecida a priori, retomando a primeira seqüência de processamento de imagem (conversão para cinza e remoção de ruído) temos como resultado uma imagem com fundo praticamente uniforme, então, é uma questão de se encontrar o pixel certo.