Tengo esta imagen que contiene texto (números y alfabetos). Quiero obtener la ubicación de todos los textos y números presentes en esta imagen. También quiero extraer todo el texto también.
¿Cómo consigo los cordinates así como todo el texto (números y alfabetos) en mi imagen? Por ejemplo, 10B, 44, 16, 38, 22B, etc.
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
fuente
fuente
Respuestas:
Aquí hay un enfoque potencial que utiliza operaciones morfológicas para filtrar contornos que no son de texto. La idea es:
Obtener imagen binaria. Cargar imagen, escala de grises, luego el umbral de Otsu
Eliminar líneas horizontales y verticales. Cree núcleos horizontales y verticales usando
cv2.getStructuringElement
luego elimine líneascv2.drawContours
Elimine líneas diagonales, objetos circulares y contornos curvos. Filtre utilizando el área de contorno
cv2.contourArea
y la aproximación de contornocv2.approxPolyDP
para aislar contornos que no sean de textoExtraer texto ROI y OCR. Encuentre contornos y filtro para ROI y luego OCR usando Pytesseract .
Se eliminaron las líneas horizontales resaltadas en verde.
Líneas verticales eliminadas
Se eliminaron varios contornos que no son de texto (líneas diagonales, objetos circulares y curvas)
Regiones de texto detectadas
fuente
Muy bien, aquí hay otra posible solución. Sé que trabajas con Python, yo trabajo con C ++. Te daré algunas ideas y espero que, si lo deseas, puedas implementar esta respuesta.
La idea principal es no utilizar el preprocesamiento en absoluto (al menos no en la etapa inicial) y en su lugar centrarse en cada carácter de destino, obtener algunas propiedades y filtrar cada blob de acuerdo con estas propiedades.
Estoy tratando de no usar el preprocesamiento porque: 1) los filtros y las etapas morfológicas podrían degradar la calidad de las manchas y 2) sus manchas objetivo parecen exhibir algunas características que podríamos explotar, principalmente: relación de aspecto y área .
Míralo, los números y las letras parecen ser más altos que anchos ... además, parecen variar dentro de un cierto valor de área. Por ejemplo, desea descartar objetos "demasiado anchos" o "demasiado grandes" .
La idea es que filtre todo lo que no se encuentre dentro de los valores precalculados. Examiné los caracteres (números y letras) y obtuve valores mínimos, máximos de área y una relación de aspecto mínima (aquí, la relación entre la altura y el ancho).
Trabajemos en el algoritmo. Comienza leyendo la imagen y redimensionándola a la mitad de las dimensiones. Tu imagen es demasiado grande. Convierta a escala de grises y obtenga una imagen binaria a través de otsu, aquí hay un pseudocódigo:
Frio. Trabajaremos con esta imagen. Debe examinar cada burbuja blanca y aplicar un "filtro de propiedades" . Estoy usando componentes conectados con estadísticas para recorrer cada blob y obtener su área y relación de aspecto, en C ++ esto se hace de la siguiente manera:
Ahora, aplicaremos el filtro de propiedades. Esto es solo una comparación con los umbrales calculados previamente. Usé los siguientes valores:
Dentro de su
for
ciclo, compare las propiedades de blob actuales con estos valores. Si las pruebas son positivas, "pintas" la mancha negra. Continuando dentro delfor
bucle:Después del bucle, construya la imagen filtrada:
Y ... eso es todo. Filtró todos los elementos que no son similares a lo que está buscando. Al ejecutar el algoritmo obtienes este resultado:
Además, he encontrado los cuadros de límite de los blobs para visualizar mejor los resultados:
Como puede ver, algunos elementos son detectados erróneamente. Puede refinar el "filtro de propiedades" para identificar mejor los caracteres que está buscando. Una solución más profunda, que implica un poco de aprendizaje automático, requiere la construcción de un "vector de características ideal", extraer características de los blobs y comparar ambos vectores a través de una medida de similitud. También puede aplicar algo de procesamiento posterior para mejorar los resultados ...
Lo que sea, hombre, tu problema no es trivial ni fácil de escalar, y solo te estoy dando ideas. Con suerte, podrá implementar su solución.
fuente
Un método es usar una ventana deslizante (es costoso).
Determine el tamaño de los caracteres en la imagen (todos los caracteres son del mismo tamaño que se ve en la imagen) y establezca el tamaño de la ventana. Pruebe tesseract para la detección (la imagen de entrada requiere un procesamiento previo). Si una ventana detecta caracteres consecutivamente, almacene las coordenadas de la ventana. Combinar las coordenadas y obtener la región en los personajes.
fuente