Eu tenho esta imagem que contém texto (números e alfabetos) nela. Quero obter a localização de todo o texto e números presentes nesta imagem. Também quero extrair todo o texto também.
Como obtenho os cordinatos e todo o texto (números e alfabetos) na minha imagem. Por exemplo, 10B, 44, 16, 38, 22B, etc
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
fonte
fonte
Respostas:
Aqui está uma abordagem potencial usando operações morfológicas para filtrar contornos não textuais. A ideia é:
Obter imagem binária. Carregar imagem, escala de cinza e o limite do Otsu
Remova as linhas horizontais e verticais. Crie kernels horizontais e verticais usando
cv2.getStructuringElement
e remova linhas comcv2.drawContours
Remova linhas diagonais, objetos em círculo e contornos curvos. Filtre usando a área do contorno
cv2.contourArea
e a aproximação do contornocv2.approxPolyDP
para isolar os contornos que não são de textoExtrair ROIs e OCR de texto. Encontre contornos e filtre ROIs e OCR usando o Pytesseract .
Linhas horizontais removidas destacadas em verde
Linhas verticais removidas
Removidos vários contornos não textuais (linhas diagonais, objetos circulares e curvas)
Regiões de texto detectadas
fonte
Tudo bem, aqui está outra solução possível. Eu sei que você trabalha com Python - trabalho com C ++. Vou lhe dar algumas idéias e, se desejar, você poderá implementar esta resposta.
A idéia principal é não usar pré-processamento (pelo menos não no estágio inicial) e, em vez disso, focar em cada caractere de destino, obter algumas propriedades e filtrar cada blob de acordo com essas propriedades.
Estou tentando não usar o pré-processamento porque: 1) Os filtros e os estágios morfológicos podem degradar a qualidade dos blobs e 2) os blobs de destino parecem exibir algumas características que poderíamos explorar, principalmente: proporção e área .
Confira, todos os números e letras parecem mais altos que largos ... além disso, eles parecem variar dentro de um determinado valor da área. Por exemplo, você deseja descartar objetos "muito grandes" ou "muito grandes" .
A ideia é filtrar tudo o que não se enquadra nos valores pré-calculados. Examinei os caracteres (números e letras) e vim com valores mínimos e máximos de área e uma proporção mínima (aqui, a proporção entre altura e largura).
Vamos trabalhar no algoritmo. Comece lendo a imagem e redimensionando-a para metade das dimensões. Sua imagem é muito grande. Converta em escala de cinza e obtenha uma imagem binária via otsu, aqui está no pseudo-código:
Legal. Vamos trabalhar com esta imagem. Você precisa examinar todos os blobs brancos e aplicar um "filtro de propriedades" . Estou usando componentes conectados com estatísticas para percorrer cada blob e obter sua área e proporção, em C ++, isso é feito da seguinte maneira:
Agora, aplicaremos o filtro de propriedades. Esta é apenas uma comparação com os limites pré-calculados. Eu usei os seguintes valores:
Dentro do seu
for
loop, compare as propriedades atuais do blob com esses valores. Se os testes forem positivos, você "pinta" o blob de preto. Continuando dentro dofor
loop:Após o loop, construa a imagem filtrada:
E ... é praticamente isso. Você filtrou todos os elementos que não são semelhantes ao que você está procurando. Executando o algoritmo, você obtém este resultado:
Além disso, encontrei as caixas delimitadoras dos blobs para visualizar melhor os resultados:
Como você vê, alguns elementos são detectados erroneamente. Você pode refinar o "filtro de propriedades" para identificar melhor os caracteres que está procurando. Uma solução mais profunda, envolvendo um pouco de aprendizado de máquina, requer a construção de um "vetor de recurso ideal", extraindo recursos dos blobs e comparando os dois vetores por meio de uma medida de similaridade. Você também pode aplicar algum pós- processamento para melhorar os resultados ...
Seja como for, cara, seu problema não é trivial nem fácil de ser dimensionado, e só estou lhe dando idéias. Felizmente, você poderá implementar sua solução.
fonte
Um método é usar a janela deslizante (é caro).
Determine o tamanho dos caracteres na imagem (todos os caracteres têm o mesmo tamanho da imagem) e defina o tamanho da janela. Experimente o tesseract para a detecção (a imagem de entrada requer pré-processamento). Se uma janela detectar caracteres consecutivamente, armazene as coordenadas da janela. Mesclar as coordenadas e obter a região nos caracteres.
fonte