是否可以使用 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);
如果图像很大并且需要更高的性能,这可能会很有用。
我有一些带有多个句子的 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);
如果图像很大并且需要更高的性能,这可能会很有用。