【问题标题】:Is it possible to use OCR to extract only the text with a specific color? IronOCR是否可以使用 OCR 仅提取具有特定颜色的文本?铁OCR
【发布时间】:2021-08-06 23:16:45
【问题描述】:

我有一些 PNG 文件,其中包含黑色(戴维灰色)和浅棕色(蘑菇色)两种不同颜色的多个句子。

像这样:

我只对黑色文本感兴趣,所以我尝试使用 Input.ReplaceColor 将浅棕色文本的颜色更改为背景颜色,但这种颜色有很多阴影,结果我总是会得到一些奇怪的字符剩下的小残留物。

这是我的实际代码

var Ocr = new IronTesseract();
using (var Input = new OcrInput())
{
    var ContentArea = new Rectangle() { X = 872 , Y = 130, Height = 900, Width = 725 };
    Input.AddImage(@"C:\OCR\Capture (" + i + ").PNG", ContentArea);
    Input.ReplaceColor(Color.FromArgb(185, 163, 143), Color.FromArgb(235, 226, 216), 25);
    Input.Sharpen();
    Input.ToGrayScale();
    var Result = Ocr.Read(Input);
    richTextBox1.AppendText(Result.Text + Environment.NewLine);
    richTextBox1.SelectionStart = richTextBox1.Text.Length;
    richTextBox1.ScrollToCaret();
}

编辑:目前的答案是“否”,希望他们将来会发布此功能。

目前唯一的选择是使用颜色,直到找到最佳参数。

如果您有比 IronOCR 更好且免费的替代品(即使仅适用于开发人员),我很乐意接受。

【问题讨论】:

  • 尝试用纯白色替换背景,在OcrInput.ReplaceColor() 上使用tolerance 参数,也许使用相同的方法将灰色文本变为黑色。 Sharpen() 实际上可能会通过使微弱的瑕疵变暗而对您不利。底线:这里可能没有明确的通用答案,只是对您的图像进行试错微调。
  • 谢谢,黑白技术给了我更好的结果,但删除 Sharpen() 给我的结果更差(从一个字符到每行 20 个奇怪的字符),我尝试了很多容忍度,但是如果我输入更高的值,我最终也会弄乱黑色文本。

标签: c# ocr


【解决方案1】:

以下答案已根据评论进行了编辑。

由于您要消除的颜色不是单一的阴影,您可以搜索颜色范围内的所有像素并将它们全部替换为背景颜色。
我之前没用过 IronTesseract,所以不知道有没有这个功能,但是你可以使用 Windows Bitmap 函数来做如下:

System.Drawing.Bitmap image = new Bitmap("BsRyL.png");
Color c1 = Color.FromArgb(180, 157, 136); //lower color
Color c2 = Color.FromArgb(238, 228, 219); //upper color
Color bkColor = Color.FromArgb(235, 226, 216); //background
for (int x = 0; x < image.Width; x++)
   for (int y = 0; y< image.Height; y++)
   {
      Color c = image.GetPixel(x, y);
      if (c.R >= c1.R && c.R <= c2.R && c.G >= c1.G && c.G <= c2.G && c.B >= c1.B && c.B <= c2.B)
         image.SetPixel(x, y, bkColor);
   }
image.Save("FilledWithBackgroundNL.png", System.Drawing.Imaging.ImageFormat.Png);

图像填充的背景颜色如下所示:

如果您的图像都像您提供的示例一样小,或者您不关心性能,则这种逐像素处理是合适的。如果您正在处理较大的图像(在百万像素范围内),则处理单个像素可能会很慢。

另一种方法是使用成像工具包,例如 LEADTOOLS(免责声明:我是 LEADTOOLS 员工)。代码如下所示:

Leadtools.Codecs.RasterCodecs codecs = new Leadtools.Codecs.RasterCodecs();
Leadtools.RasterImage image = codecs.Load("BsRyL.png");
var c1 = new Leadtools.RasterColor(180, 157, 136); //lower color
var c2 = new Leadtools.RasterColor(238, 228, 219); //upper color
image.AddColorRgbRangeToRegion(c1, c2, Leadtools.RasterRegionCombineMode.Set);
var backgroundColor = new Leadtools.RasterColor(235, 226, 216);
Leadtools.ImageProcessing.FillCommand fill = new Leadtools.ImageProcessing.FillCommand(backgroundColor);
fill.Run(image);
codecs.Save(image, "FilledWithBackground.png", Leadtools.RasterImageFormat.Png, 24);

如果图像很大并且需要更高的性能,这可能很有用。

【讨论】:

  • 这听起来更像是一个广告而不是一个答案。我只是想制作一个小工具,我将在 GitHub 上免费分享,我不能为此支付 3995 美元。无论如何,谢谢。
  • 我添加了不使用我公司产品的代码。对于小图像,答案中的新代码已经足够了,并且达到一定的图像大小,可以比使用专业的图像工具包更快。然而,当我在一个 8 兆像素的图像上测试它时(典型的扫描 Letter 大小的页面,300 DPI),LEADTOOLS 代码的速度要快 9 倍以上。关于价格,上面的颜色替换代码使用的是 LEADTOOLS Imaging Pro 工具包,仅售 795 美元。更昂贵的工具包用于医疗通信或文档成像等高级功能。
猜你喜欢
  • 2020-11-27
  • 2021-03-25
  • 2013-01-29
  • 2019-10-26
  • 2021-09-24
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
相关资源
最近更新 更多