Estoy usando Tesseract JS (v2.1.0 con Tesseract v4.1.1) para reconocer números (uno o más dígitos) en una imagen escaneada que está muy preprocesada (reducción de ruido, blanco y negro) y que sabe dónde están los números.
Sin embargo, cuando ejecuto el reconocimiento, muy a menudo los números de dos dígitos no se reconocen correctamente, por ejemplo:
En este ejemplo, el "11" se reconoce como "1".
En la imagen se puede ver
rectangle a Tesseract para reconocer solo en ese rectángulo (pero se agregan después del reconocimiento)Lo que probé hasta ahora:
¿Hay algo que pueda cambiar en las opciones del preprocesamiento para mejorar eso?
Este es el código (partes de él):
const scheduler = Tesseract.createScheduler(); const workers = createWorkers(16); const canvasElement = document.getElementById('detected-numbers'); await recognizeNumbers(scheduler, workers, canvasElement, rowSpecNumbers, colSpecNumbers); async function recognizeNumbers(scheduler, workers, canvasElement, rowSpecNumbers, colSpecNumbers) { for (const worker of workers) { await worker.load(); await worker.loadLanguage('eng'); await worker.initialize('eng'); await worker.setParameters({ tessedit_ocr_engine_mode: Tesseract.TESSERACT_ONLY, tessedit_char_whitelist: '0123456789', tessedit_pageseg_mode: Tesseract.SINGLE_WORD }) scheduler.addWorker(worker); } await Promise.all(rowSpecNumbers .flat() .map(number => scheduler.addJob('recognize', canvasElement, { rectangle: { left: number.boundingRect.x, top: number.boundingRect.y, width: number.boundingRect.width, height: number.boundingRect.height } }).then(result => number.data = result.data) )); await Promise.all(colSpecNumbers .flat() .map(number => scheduler.addJob('recognize', canvasElement, { rectangle: { left: number.boundingRect.x, top: number.boundingRect.y, width: number.boundingRect.width, height: number.boundingRect.height } }).then(result => number.data = result.data) )); await scheduler.terminate(); }