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:
- ¿Hay algo subóptima en el código que estoy usando? ¿Hay una mejor manera de hacer esto? ¿Una biblioteca diferente tal vez?
- ¿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?
- 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?
- ¿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?
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
No github repo, envíeme un correo electrónico (ian at ianozsvald com) y lo desenterraré (me gusta mucho github ...). –
Si ya está en JPEG, lo guardaré como TIFF para evitar agregar artefactos * extra *. Agregar ruido adicional es lo que desea evitar. –