是否可以使用 OCR 仅提取具有特定颜色的文本?铁OCR

Is it possible to use OCR to extract only the text with a specific color? IronOCR

我有一些带有多个句子的 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 更好的替代品并且免费(即使仅供开发人员使用),我会很乐意接受。

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

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

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);

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