Cómo detectar texto usando OpenCV

Doug LN:

Estoy trabajando con un proyecto donde debería detectar y extraer el texto de una imagen para hacer más adelante a disposición de un software de búsqueda.

Estoy estudiando OpenCV pero no encontrar mucho contenido en Java solo en Python. Me gustaría implementar esto en Java. Pero si usted sabe cómo hacer esto en Python, C ++ está bien. Sólo necesito el algoritmo para obtener alguna idea.

Mi plan sería girar la imagen 90 °, lo convierten en una imagen binaria (umbral), detecta el ROI (región de interés), en este caso el texto o tal vez la forma del rectángulo, recortar el rectángulo blanco que contiene el texto y, finalmente, el uso OCR con Tesseract para obtener el texto (PISF - 28-1469 - 3).

Pero para extraer el texto usando Tesseract está bien, sé lo que a esto. Sólo necesito para obtener el rectángulo blanco que contiene el texto o la región mínimo que contiene el texto y guardarlo en la mejor forma para luego utilizarlo con Tesseract (OCR).

Me gustaría utilizar la secuencia de comandos por lotes, ya que no tengo apenas esta imagen. Y las otras imágenes pueden tener diferentes tamaños.

¿Alguien podría ayudarme?

Me apreciate ninguna ayuda.

Mi imagen es la siguiente:

introducir descripción de la imagen aquí

fmw42:

Esta es una manera de hacer eso en Python / OpenCV

  • Leer la entrada
  • Convertir a escala de grises
  • Límite
  • Uso morfología para eliminar pequeñas de color blanco o negro y regiones para cerrar sobre el texto con el blanco
  • Obtener el contorno del rectángulo grande orientada verticalmente
  • Extraer el texto de la caja de delimitación de ese contorno
  • Guardar los resultados


Entrada:

introducir descripción de la imagen aquí

import cv2
import numpy as np

# load image
img = cv2.imread("rock.jpg")

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold image
thresh = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)[1]

# apply morphology to clean up small white or black regions
kernel = np.ones((5,5), np.uint8)
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
morph = cv2.morphologyEx(morph, cv2.MORPH_OPEN, kernel)

# thin region to remove excess black border
kernel = np.ones((3,3), np.uint8)
morph = cv2.morphologyEx(morph, cv2.MORPH_ERODE, kernel)

# find contours
cntrs = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

# Contour filtering -- keep largest, vertically oriented object (h/w > 1)
area_thresh = 0
for c in cntrs:
    area = cv2.contourArea(c)
    x,y,w,h = cv2.boundingRect(c)
    aspect = h / w
    if area > area_thresh and aspect > 1:
        big_contour = c
        area_thresh = area

# extract region of text contour from image
x,y,w,h = cv2.boundingRect(big_contour)
text = img[y:y+h, x:x+w]

# extract region from thresholded image
binary_text = thresh[y:y+h, x:x+w]  

# write result to disk
cv2.imwrite("rock_thresh.jpg", thresh)
cv2.imwrite("rock_morph.jpg", morph)
cv2.imwrite("rock_text.jpg", text)
cv2.imwrite("rock_binary_text.jpg", binary_text)

cv2.imshow("THRESH", thresh)
cv2.imshow("MORPH", morph)
cv2.imshow("TEXT", text)
cv2.imshow("BINARY TEXT", binary_text)
cv2.waitKey(0)
cv2.destroyAllWindows()


la imagen de umbral:

introducir descripción de la imagen aquí

Morfología limpiar la imagen:

introducir descripción de la imagen aquí

imagen Región texto extraído:

introducir descripción de la imagen aquí

la imagen binaria región de texto extraído:

introducir descripción de la imagen aquí

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=359898&siteId=1
Recomendado
Clasificación