2012-07-25 16 views
21

Estoy trabajando en un proyecto que consiste en extraer documentos científicos de texto almacenados en formato PDF. Para la mayoría de los periódicos, esto se logra bastante fácilmente usando PDFMiner, pero algunos documentos más antiguos almacenan su texto como imágenes de gran tamaño. En esencia, se escanea un documento y ese archivo de imagen (típicamente PNG o JPEG) comprende toda la página.Mejora del rendimiento de OCR en escaneos de varios párrafos

He intentado utilizar el motor Tesseract a través de su python-tesseract atascamientos, pero los resultados son bastante decepcionantes.

Antes de entrar en las preguntas que tengo con esta biblioteca, me gustaría mencionar que estoy abierto a sugerencias para las bibliotecas de OCR. Parece que hay pocas soluciones nativas de python.

Here es una de esas imágenes (JPEG) en la que estoy tratando de extraer el texto. I el código exacto proporcionado en los fragmentos de ejemplo en la página de códigos google de python-tesseract a la que he vinculado anteriormente. Debo mencionar que la documentación es un poco escasa, por lo que es bastante posible que una de las muchas opciones en mi código esté mal configurada. Cualquier consejo (o enlaces a tutoriales en profundidad) sería muy apreciado.

Here es la salida de mi intento de OCR.

Mis preguntas son las siguientes:

  1. ¿Hay algo subóptima en el código que estoy usando? ¿Hay una mejor manera de hacer esto? ¿Una biblioteca diferente tal vez?
  2. ¿Qué tipo de preprocesamiento puedo realizar para mejorar la detección? Las imágenes son todas B & W, pero ¿debería quizás establecer un umbral y establecer algo superior a un color negro de un solo valor y todo lo que está debajo a un color blanco de valor nulo? ¿Algo más?
  3. Una pregunta más específica: ¿se puede mejorar el rendimiento realizando OCR en palabras sueltas? Si es así, ¿alguien puede sugerir una forma de delimitar palabras sueltas en un archivo de imagen (por ejemplo, la vinculada más arriba) y extraerlas en imágenes separadas que se pueden tratar de forma independiente?
  4. ¿Puede la presencia de gráficos y otras imágenes incrustadas en la imagen de la página PDF interferir con OCR? ¿Debo eliminar esto? Si es así, ¿alguien puede sugerir un método para eliminarlos automáticamente?

EDIT: Por simplicidad, aquí está el código que he usado.

import tesseract 
api = tesseract.TessBaseAPI() 
api.Init(".","eng",tesseract.OEM_DEFAULT) 
api.SetPageSegMode(tesseract.PSM_AUTO) 

mImgFile = "eurotext.jpg" 
mBuffer=open(mImgFile,"rb").read() 
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api) 
print "result(ProcessPagesBuffer)=",result 

Y aquí es el código alterativo (cuyos resultados no se muestran en esta cuestión, aunque el rendimiento parece ser bastante similar).

import cv2.cv as cv 
import tesseract 

api = tesseract.TessBaseAPI() 
api.Init(".","eng",tesseract.OEM_DEFAULT) 
api.SetPageSegMode(tesseract.PSM_AUTO) 

image=cv.LoadImage("eurotext.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) 
tesseract.SetCvImage(image,api) 
text=api.GetUTF8Text() 
conf=api.MeanTextConf() 

¿Alguien podría explicar las diferencias entre estos dos fragmentos?

Respuesta

12

Tesseract es muy bueno en el texto de entrada limpia (como su ejemplo) si trastear un poco. algunas sugerencias:

  • Antes de la automatización, comienzan con Tesseract en la línea de comandos
  • restringir su juego de caracteres si es posible (por ejemplo, echar un vistazo en/share/tessdata/configs/usr/local en./ Dígitos - configurarlo para caracteres ingleses mayúsculas/minúsculas, etc.) y lo proporcionan como un argumento de línea de comandos
  • Sólo utilizar PNG o TIFF (TIFF para las versiones anteriores) como JPG introduce artefactos
  • Upsample la imagen para su texto es más grande que la letra minúscula actual. Líneas de Tesseract> caracteres de 10 píxeles de alto (si la memoria sirve), ciertamente tiene un peor rendimiento con los caracteres minúsculos
  • No hay necesidad de hacer umbrales si ya tiene dos niveles, pero no va a doler si lo hace y puede ver exactamente la misma imagen que verá tesseract

Volveré aquí para ver si puedo ayudar más pero me uno a la lista de correo de tesseract, son realmente útiles.

Sidenote - Tengo algunos parches para pytesseract que debo publicar para obtener caracteres & confidencias & palabras a través de la API (que no fue posible hace un par de meses). Grite si podrían ser útiles.

+0

Ozvald, consejos impresionante, gracias! Estaría realmente interesado en verificar tu código. ¿Tienes un repositorio de Github o algo así? En cuanto al tipo de archivo de imagen, ¿es aceptable convertir imágenes JPEG en PNG, o ya está hecho el daño? Lo pregunto porque muchos de los archivos PDF que he encontrado almacenan las imágenes como JPEG internamente, así que si el problema es de compresión con pérdida, entonces estoy como pegado con lo que tengo. – blz

+1

No github repo, envíeme un correo electrónico (ian at ianozsvald com) y lo desenterraré (me gusta mucho github ...). –

+0

Si ya está en JPEG, lo guardaré como TIFF para evitar agregar artefactos * extra *. Agregar ruido adicional es lo que desea evitar. –

6

El primer ejemplo lee el archivo como un búfer y luego lo retransmite a tesseract-ocr sin hacer ninguna modificación mientras el segundo lee el archivo en formato opencv que luego le permitirá retocar algunas imágenes como cambiar la relación de aspecto , escala de grises y etc. utilizando la biblioteca de cv. El segundo método es muy útil si quieres hacer la manipulación de la imagen antes de pasar la imagen a tesseract.

BTW, soy el dueño de python-tesseract. Si quieres hacer la pregunta, siempre se puede acoger a enviar su consulta a http://code.google.com/p/python-tesseract

Joe

+0

muchas gracias por la aclaración. De hecho, me preguntaba de dónde vino opencv. Te enviaré cualquier pregunta que tenga, ¡gracias! – blz

Cuestiones relacionadas