gpt4 book ai didi

ocr - Tesseract OCR 可以识别下标和上标吗?

转载 作者:行者123 更新时间:2023-12-04 03:57:55 44 4
gpt4 key购买 nike

我对文本片段中下标和上标的一般识别有疑问。

示例图片:

example-image with subscript and superscript

我使用 Tesseract 4.1.1 和 https://github.com/tesseract-ocr/tessdata_best 下可用的训练数据.许多选项都有默认值,除了:

  • tessedit_create_hocr = 1(获得 HOCR 的结果)
  • hocr_font_info = 1(获取额外的字体信息,如字体大小)
  • hocr_char_boxes = 1(获得基于字符的结果)

语言设置为英语。页面分割模式 3 (PSM_AUTO_OSD)、11 (PSM_SPARSE_TEXT) 或 12 (PSM_SPARSE_TEXT_OSD) 都无法正确识别下标/上标。

在输出中,子/上片段或多或少都是错误的:

  • “潜台词Sub”被识别为“Subtextsu”,
  • “SuptextSub”被识别为“Suptexts?”
  • “P0”被识别为“Po”
  • “P100”被识别为“P1go”
  • “a2+b2”被识别为“a+b?”

使用 Tesseract 进行 OCR 有没有办法......?

  1. 优化下标/上标处理
  2. 获取有关已识别下标/上标的信息(在 hocr 输出中 - 最好是每个字符)

最佳答案

按照本主题的其他问题/答案中的建议处理图像质量并没有真正改变任何东西。

首先从 tesseract-google-newsgroup 中找到这两个链接,这似乎确实是一个培训问题: link1link2 .

但在做了一些实验后我发现,使用的 OEM_DEFAULT-OCR 引擎模式并没有提供所需的信息。我找到了问题的部分解决方案。部分原因,因为我现在获得了关于 sub/sup 的大部分信息,而且在大多数情况下识别的字符都是正确的,但并非对所有字符都是正确的。

使用 OEM_TESSERACT_ONLY-OCR 引擎模式(= 传统模式)和 Tess4J 提供的一些 API 方法我想出了以下 java 测试类:

public class SubSupEvaluator {
public void determineSubSupCharacters(BufferedImage image) {
//1. initialize Tesseract and set image infos
TessBaseAPI handle = TessAPI1.TessBaseAPICreate();
try {
int bpp = image.getColorModel().getPixelSize();
int bytespp = bpp / 8;
int bytespl = (int) Math.ceil(image.getWidth() * bpp / 8.0);
TessBaseAPIInit2(handle, new File("./tessdata/").getAbsolutePath(), "eng", TessOcrEngineMode.OEM_TESSERACT_ONLY);
TessBaseAPISetPageSegMode(handle, TessPageSegMode.PSM_AUTO_OSD);
TessBaseAPISetImage(handle, ImageIOHelper.convertImageData(image), image.getWidth(), image.getHeight(), bytespp, bytespl);

//2. start actual OCR run
TessBaseAPIRecognize(handle, null);

//3. iterate over the result character-wise
TessResultIterator ri = TessBaseAPIGetIterator(handle);
TessPageIterator pi = TessResultIteratorGetPageIterator(ri);
TessPageIteratorBegin(pi);
do {
//determine character
Pointer ptr = TessResultIteratorGetUTF8Text(ri, TessPageIteratorLevel.RIL_SYMBOL);
String character = ptr.getString(0);
TessDeleteText(ptr); //release memory

//determine position information
IntBuffer leftB = IntBuffer.allocate(1);
IntBuffer topB = IntBuffer.allocate(1);
IntBuffer rightB = IntBuffer.allocate(1);
IntBuffer bottomB = IntBuffer.allocate(1);
TessPageIteratorBoundingBox(pi, TessPageIteratorLevel.RIL_SYMBOL, leftB, topB, rightB, bottomB);

//write info to console
System.out.println(String.format("%s - position [%d %d %d %d], subscript: %b, superscript: %b", character, leftB.get(), topB.get(),
rightB.get(), bottomB.get(), TessAPI1.TessResultIteratorSymbolIsSubscript(ri) == TessAPI1.TRUE,
TessAPI1.TessResultIteratorSymbolIsSuperscript(ri) == TessAPI1.TRUE));
} while (TessPageIteratorNext(pi, TessPageIteratorLevel.RIL_SYMBOL) == TessAPI1.TRUE);
} finally {
TessBaseAPIDelete(handle); //release memory
}
}
}

旧模式仅适用于“正常”训练数据。使用“-best”训练数据会带来错误。

关于ocr - Tesseract OCR 可以识别下标和上标吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63562290/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com