Tesseract JS 识别数字的问题

jaw*_*jaw 5 javascript ocr tesseract

我正在使用 Tesseract JS(v2.1.0 和 Tesseract v4.1.1)来识别经过大量预处理(降噪、黑/白)的扫描图像中的数字(一位或多位数字),并且知道数字在哪里。

但是,当我运行识别时,经常无法正确识别两位数,例如:

在此输入图像描述

在此示例中,“11”被识别为“1”。

在图片中,你可以看到

  • 传递到 Tesseract 的图像(黑/白)
  • 传递rectangle给 Tesseract 的彩色矩形仅在该矩形中识别(但在识别后添加)
  • 左下角青色的识别数字

到目前为止我尝试过的:

  • 起初,图像是黑底白字,我通过反转图像来改变它。这大大提高了准确性。
  • 然后我读到,Tesseract 需要在文本周围有一个边框,所以我在彩色矩形所在的位置添加了一个黑色边框,但这并没有改变任何东西。
  • A 还切换到旧的引擎模式,因为这应该工作得更好。
  • 我添加了字符白名单

有什么可以改变选项或预处理来改善这一点吗?

这是代码(部分):

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();
}
Run Code Online (Sandbox Code Playgroud)