You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Tesseract OCR检测图表中A-E标签的位置

如何用Tesseract OCR检测图表中单个字符的位置

我来帮你解决这个问题,要检测图表里A-E标签的位置,我们可以从调整Tesseract的配置、获取字符边界框入手,同时优化图像预处理来提升识别精度:

1. 调整页面分割模式(关键第一步)

你当前用的PageSegMode.SingleBlock是针对整块连续文本的,完全不适合图表里分散的单个字符标签。推荐换成PageSegMode.SingleChar(强制识别单个字符),或者PageSegMode.SparseText(专门处理分散在图像中的文本),前者更精准匹配你的需求。

2. 完整代码实现(含位置获取)

下面是补全并优化后的代码,重点是通过ResultIterator获取每个识别字符的边界框(也就是你需要的位置信息):

var testImagePath = @"test.png";
using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.TesseractAndCube))
{
    // 限定只识别A-E字符,减少误识别
    engine.SetVariable("tessedit_char_whitelist", "ABCDE");
    // 切换到单个字符的页面分割模式
    engine.DefaultPageSegMode = PageSegMode.SingleChar;

    using (var img = Pix.LoadFromFile(testImagePath))
    {
        using (var page = engine.Process(img))
        {
            using (var iterator = page.GetIterator())
            {
                iterator.Begin();
                do
                {
                    // 获取当前识别到的单个字符
                    var charText = iterator.GetText(PageIteratorLevel.Symbol);
                    // 过滤掉非目标字符(避免误识别的杂项)
                    if ("ABCDE".Contains(charText))
                    {
                        // 获取字符的边界框坐标(x1, y1为左上角,x2, y2为右下角)
                        Rect charRect;
                        if (iterator.TryGetBoundingBox(PageIteratorLevel.Symbol, out charRect))
                        {
                            Console.WriteLine($"字符: {charText}, 位置信息:左上角({charRect.X1}, {charRect.Y1}),右下角({charRect.X2}, {charRect.Y2})");
                        }
                    }
                } while (iterator.Next(PageIteratorLevel.Symbol));
            }
        }
    }
}

3. 图像预处理优化(提升识别准确率)

因为你的图表包含线条,这些元素会干扰Tesseract的识别,建议在识别前做简单预处理:

  • 转为灰度图:减少颜色干扰,聚焦字符轮廓
  • 二值化:把图像转为黑白,让字符和背景的对比更强烈
  • 去噪:如果图表里的细线条不是目标,可以通过阈值过滤掉

用Tesseract自带的Pix类就能实现基础预处理,示例代码如下:

using (var img = Pix.LoadFromFile(testImagePath))
{
    // 转为灰度图
    using (var grayImg = img.ConvertToGray())
    {
        // 二值化(阈值可根据你的图表调整,128是通用中间值)
        using (var binaryImg = grayImg.ThresholdToBinary(128))
        {
            // 用处理后的图像执行后续识别逻辑
            using (var page = engine.Process(binaryImg))
            {
                // ... 这里放之前的迭代器获取字符位置的代码
            }
        }
    }
}

4. 额外小提示

  • 如果SingleChar模式识别效果不佳,可以尝试换成PageSegMode.SparseText,它更擅长处理分散的文本块
  • 确保你的tessdata文件夹里有完整的英文语言包(eng.traineddata)
  • 可以调整tessedit_min_confidence参数过滤低置信度的识别结果,比如设置为80,只保留可信度高的字符

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:27:58