Processamento Digital de Imagens

Preciso de ajuda!!!

Estou desenvolvendo um projeto onde usarei imagens de cartões de respostas de processos seletivos utilizando Java.

Preciso pegar a imagem e através de acesso por coordenadas , ou outro método, ver quais questões estão marcadas.

Alguém poderia me dizer o que devo usar? Apenas a API do Java 2D é suficiente? Exixtem outras bibliotecas? Quais? Onde as consigo? Quais as funcionalidades que elas oferecem?

Se alguém puder me ajudar fico grato!

Como funciona este seu projeto?

Bom, é o seguinte:

A ideía e substituir leitoras ópticas que são muito caras e nada flexíveis por imagems provenientes de um Scanner, os únicos requisitos é que seja desenvolvido em Java.
As imagens serão escaneadas dos gabaritos que serão marcados, por exemplo, no vestibular. Tenho que analisar a imagem e saber quais questões estão certas e quais estão erradas. Vale reassaltar:

Todos os gabaritos são iguais;
O gabarito é vermelho e deve ser marcado com preto ou azul;
Posso usar qualque técnica de processamento de imagens;
No início da linha de cada questão existe um clock, um retângulo preto que indica que ali começa uma linha.

A ideía inicial é tratar a imagem como uma matriz, mas nem isso eu sei como fazer, tem pouquíssimo material disponível na internet acerca do assunto.
Tenho que saber se o Java me oferece recurso (fácil) pra que eu faça isso, ou se é necessário que eu utilize outras bibliotecas.

Se tiver mais alguma dúvida, sinta-se a vontade para perguntar.

O que você quer explicar é isto aqui, não?

Aí fica bem mais fácil achar uma biblioteca que faça isso por você (procure por “OMR” ou “Optical mark recognition” e “Java”).

É exatamente isso!

O gabarito que vou trabalhar inicialmente é pouquinho diferente, mas a idéia é essa.

Vou dar uma pesquisada no temas que me falou, mas já antecipando, o que essas biblioteca podem fazer por mim?

Olá VantuilJose,
Estou passando pela mesma situação que você.
Gostaria de saber se até então você conseguiu encontrar alguma biblioteca java para OMR?

obrigado desde ja ! !

A paz do Senhor à todos!

Pois é, até tem alguma coisa, mais sem documentação e especificação nenhuma…
Alguns me aconselharam uma biblioteca chamada JIU, e outra JAI, mas não gostei muito também não, minha idéia é fazer tudo a mão mesmo, percorrer a imagem pixel a pixel, a procura de imagens significativas, como retângulos e círculos, e compará-los com o gabarito certo.
Por enquanto estou parado, pois preciso de um material do meu professor, e ele está me enrolando um pouquinho.
Me envia uma MP com seu e-mail, talvez possamos trocar algumas idéias, e quem sabe até uma parceria para desenvolvimento?
Me fala também sobre as especificações do seu projeto, para que possamos compará-las, e quem sabe agregar mais valor para os nossos trabalhos.

Aguardo Resposta.

[]'s

Acho que só o Java 2D é suficiente. Até pq, só o java 2d é bastante coisa. Dá uma olhada nesses artigos:
http://javaboutique.internet.com/tutorials/rasters/
http://javaboutique.internet.com/tutorials/rasters2/

Outra coisa, o processo de scaneamento em si vai ser controlado por sua aplicação?

Gostei dos links. :smiley: :smiley:

A princípio não, o usuário terá a opção de inserir as imagens no sistemas. Ele vai colocar também um gabarito com todas as opções marcada, essa vai ser a parte mais difícil pra mim, pois vou ter que rastrear a imagem e criar o gabarito a partir daí, depois tenho que exportar esses dados na forma código do candidato, número da questão e opção marcada, portanto não será responsabilidade do meu sistema quantificar esses dados, e/ou dar informações estatísticas.

Deu pra entender mais ou menos? Se tiverem alguma dúvida, me perguntem, pois estou precisando bastante de ajuda!!!

Alguém já viu falar sobre as bibliotecas JAI(Java Advanced Image) e JIU(Java Image Utilities)?

Vou dar uma estudada melhor na Java2D e ver o que pode fazer por mim e depois posto os resultados…

Eu já dei uma olhada na JAI, mas nunca me convenceram que é melhor usa-la, do que usar o Java 2D diretamente. Faziam algumas propagandas da performance da JAI, mas nunca observei um ganho significativo, principalmente depois da versão 5 do Java, que permitiu aceleração de hardware para as imagens translucentes.

Também implementaram alguns filtros, mas também existem ótimos filtros feitos por terceiros para o Java 2D, como esses aqui:
http://www.jhlabs.com/ip/filters/index.html

Essa outra biblioteca eu não conheço.

ViniGodoy, você sabe de algum livro ou apostila, não importa o idioma, que tratem deste assunto?
Tenho pouco material de referência, e queria adquirir mais, existem alguns livros de processamento de imagem, mas não encontrei sequer um que trate sobre Java e processamento de imagem.

Se não tiver material bibliográfico mesmo, como livros, artigos e apostilas, sabe de alguns sites dos quais posso conseguir informações consistente sobre o assunto? O Google sempre funciona, mas prefiro indicações mais concretas!

Olá, VantuilJose.
O projeto que estou querendo desenvolver é para leitura de cartões de vestibular.
Funcionalidades
- A mais importante é detectar zonas marcadas (OMR) e desmarcadas.
- Leitura de código de barras.
- girar o documento automaticamente, caso tenha sido digitalizado de cabeça para baixo ou com qualquer ângulo fora do padrão.
- Remover automaticamente as bordas, limitando a imagem ao tamanho do documento.
- Digitalizar em preto e branco (Esta na verdade é uma configuração do scanner, Fujitsu fi-6130);

Na verdade, a empresa em que trabalho (Universidade), ia comprar um software que faz exatamente isso.
É o Kofax Express ou Ascent Capture (feito em VB), ele possui recursos muito interessantes para digitalização e leitura de dados em documentos, como OMR, ICR e OCR.
Desistimos de comprá-lo por conta do alto preço.
Então meu chefe me deu a missão de encontrar outro software similar, porém estou mais interessado em desenvolver um usando Java, pois seria mais flexível para adaptá-lo aos outros sistemas que estamos fazendo.

Por enquanto já desenvolvi um sistema em Java que faz a digitalização usando o scanner fi-6130 através da api JTwain. O próximo passo seria fazer o tratamento da imagem e a leitura dos dados (OMR).

Somente a Morfologia das imagens ae não vai resolver.
Vai precisar de um algoritmo de segmentação e uma rede neural para reconhecer o padrão. Pode usar uma rede Kohonen.
Um algoritmo para normalizar os dados e passar para rede k, pois os dados devem estar em um intervalo de -1(off) a 1(on).
Detalhe, para treinar redes neurais, não compensa usar amostras de mais de 256^2 pixel. Levaria muito tempo para treinar, e a rede podem nem convergir a margem de erro.
Vai precisar criar uma representação menor da imagem, ou usar a técnica de sensores.

Demorei um tempão pra postar… :oops: mas…
juliocbq, como funcionaria essa rede neural? Existe implementação em Java? Que bilbiografia você me sugere?

E vc nasper1904? conseguiu alguma coisa? Desenvolveu alguma parte? E quanto ao sistema que pega do Scanner, funcionar com qualquer Scanner? ou tem que ser especificamente com ele?

[quote=VantuilJose]Demorei um tempão pra postar… :oops: mas…
juliocbq, como funcionaria essa rede neural? Existe implementação em Java? Que bilbiografia você me sugere?

E vc nasper1904? conseguiu alguma coisa? Desenvolveu alguma parte? E quanto ao sistema que pega do Scanner, funcionar com qualquer Scanner? ou tem que ser especificamente com ele?[/quote]

http://www.jeffheaton.com/ai/

Gostei da sua implementação, o problema é que ela é só pra um tipo de cartão, precisava de uma genérica, ou melhor, meu maior problema é criar modelos de gabaritos sabe? tipo template?

juliocbq, aquele material sobre Inteligência artificial em Java é muito bom!!! Recomendo pra quem precisa…

é verdade, eu fiz assim porque aqui na empresa só tem um tipo de cartão de vestibular.
Na verdade eu “roubei” um pouco da idéia Kofax (Ascent Capture), porque ele usa essa lógica. Primeiro você faz o mapeamento das questões no cartão digitalizado criando um template. Então, a partir deste template, você faz a leitura do lote de cartões gerando um arquivo com o resultado.
Só que no kofax tem uma interface gráfica para mapear o cartão, e na minha implementação fiz direto no código porque ainda tô em fase de teste.
Mas por enquanto é isso…

nasper1904 seu algoritmo tem um problema pois ele valida conforme a quantidade de cores desejadas dos pixeis da imagem(Imagine se preenchesse porfora e der a quantidade desejada) o interessante seria você pegar essa área selecionada e achar o ponto médio do centro em relação a área da parte da figura e procurar em um raio menor que o da bolota baseando no centro da imagem recortada para assim qualificar o alvo da também da para fazer uma zona de correção na qual teria menos relevância na porcentagem total do preenchimento da bolota mais pode significativamente aumentar a precisão.

Alias seu algoritmo me ajudou a aprender a trabalhar com imagens em java já que existe pouca documentação.

Boa sorte ai.

Não entendi muito bem sua idéia…
Já faz tempo que parei de mexer nesse sistema também.
Mas resumidamente, a idéia do código que eu fiz é:
selecionar uma zona da imagem (zona da bolota da questão do cartão) e verificar quantos pixels brancos e pretos existem nesta zona. Então depois eu verifico a porcentagem de pixels pretos, se for maior que o valor X eu considero que a zona foi marcada.

O que é ruim é porque eu pego a zona da bolota de forma estática (estabelecendo a posição dela, em pixels, no código) só que a cada digitalização, cada cartão (são mts cartões) apresenta uma leve variação na posição (fica um pouco torno, etc), e isso atrapalha na leitura dessas bolotas.
Pra solucionar, teria que ter um código para localizar os 4 cantos do cartão e ajustar, caso a imagem esteja um pouco torna, ou afastada da posiçao certa.
Porém, como eu saí da empresa que eu estava, não dei mais continuidade neste projeto.

Mas se alguém fizer algo do tipo, eu gostaria muito de ver este código. :slight_smile: