Desenvolva uma aplicação que dada uma imagem com marcações (ver arquivos de exemplo) localize e informe:
1. O número de marcações na primeira linha
2. O número de marcações na primeira coluna
3. O número de marcações na imagem
As imagens para testes estão contidas na pasta images
Ideia do algoritmo para esse desafio e essas caracteristicas de imagens.
Ok, vamos a explicação do passo a passo como eu pensei nesse algoritmo, tentando ser o mais simples possível.
- A primeira coisa que fiz foi ler a imagem e já colocar em escalas de cinza;
- Usando a imagem em escala de cinza utilizei
bitwise_not
, para inverter as cores da imagem, sendo onde é branco, se torna preto e vice-versa; - tendo a imagem dessa forma, eu consigo buscar todos os contornos da imagem, removendo o contorno mais externo de forma mais simples;
- Agora eu busco todos os contornos, e limito clado na altura, largura e area, para que eu tenha apenas as hachuras;
- Ok, eu tenho os contornos, agora eu vou definir os centroides de cada retangulo com a função ``moments` e crio uma lista com todas as posições dos centroides das hachuras;
- Com os centroides eu consigo mensurar os valores da primeira linha e também da primeira coluna
- E usando a mesma ideia, eu tenho também os contornos totais, terminando assim o processo solicitado no desafio.
- Eu enxergo que a solução que fiz ela é limitada, pois se eu precisar fazer buscas mais complexas, isso se tornará um problema;
- O que eu faria com mais tempo de desenvolvimento, eu criaria uma mapa para o papel que eu preciso ler, essa ideia eu retiro de um projeto que acompanho há 4 anos;
- O link do projeto é https://github.com/Udayraj123/OMRChecker;
- Como a leitura de testes de vestibular da India é bem caótica, e um volante de loteria também pode ser, criar um sistema que possa receber um mapa e já se atualizar automaticamente é uma saída que pode ser interessante ao invés de fixar o mapa no código.
É interessante criar um virtualenv para rodar o projeto.
Para instalar as depedências
python -m pip install -r requirements.txt
Para uma imagem apenas
python main.py --image images/4x14x187.bmp
Para uma pasta que contenham imagens do mesmo formato:
python main.py --folder images
Após a execução, será criada uma pasta chamada resultados
, contendo um arquivo json para cada imagem
Cada resultado tem o seguinte nome 4x14x187_resultado_leitura
Se quiser ver o processo acontecendo e visualizar a imagem sendo processa é só adicionar o comando --view true
Para uma imagem apenas
python main.py --image images/4x14x187.bmp --view true
Para uma pasta que contenham imagens do mesmo formato:
python main.py --folder images --view true
Decidi criar uma classe que contenha todos os metodos para os processos funcionarem de formas mais isoladas.
Para que o algorimo seja funcional, há um metodo apenas para execução que é o run
dai em diante todo o processo é feito automaticamente.