OCR TesseractEngine
OCR TesseractEngine
我正在使用 OCR 识别图片上的数字
var engine = new TesseractEngine(@"C:\Projects\tessdata", "eng", EngineMode.Default,);
var currentImage = TakeScreen();
var page = engine.Process(ScaleByPercent(currentImage, 500));
var text = page.GetText().Replace("\n", "");
规模:
public Bitmap ScaleByPercent(Bitmap imgPhoto, int Percent)
{
float nPercent = ((float)Percent / 100);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
var destWidth = (int)(sourceWidth * nPercent);
var destHeight = (int)(sourceHeight * nPercent);
var bmPhoto = new Bitmap(destWidth, destHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto,
new System.Drawing.Rectangle(0, 0, destWidth, destHeight),
new System.Drawing.Rectangle(0, 0, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
bmPhoto.Save(@"D:\Scale.png", System.Drawing.Imaging.ImageFormat.Png);
grPhoto.Dispose();
return bmPhoto;
}
但我得到结果“10g”。
- 如何强制引擎只识别数字?
- 如何获得号码 1013。
您可以使用以下代码告诉 Tesseract 引擎仅查找数字:
var engine = new TesseractEngine(@"C:\Projects\tessdata", "eng", EngineMode.Default);
engine.SetVariable("tessedit_char_whitelist", "0123456789");
Strickos9 向您展示了解决此问题的部分好方法。但要点是,如果您必须扫描相同大小的文本,而且还会包含一些字母,您将得到不好的结果。此外,即使白名单仅与数字相关,您在扫描时也可能会遇到一些问题(例如 5 扫描为 6),因为 Tesseract 很难扫描低质量字符,因此我强烈建议您:
- 将图片放大 2-4 倍。
- 如果需要柔化字符的边缘,请进行一些模糊处理。
- 使用 'threshold' 或 'adaptive threshold' 算法对其进行处理(以清除背景中的模糊像素和蓝色)。
我回答过一个类似的问题 ,其中有人在扫描低质量图片时对结果也不满意。
结合 Strickos9 为您提供的功能(如果您只扫描数字)应该可以为您提供完美的扫描质量。
您可以使用 OpenCV 或 Matlab 等软件进行图像处理(尽管我从未尝试过)。如果您正在为此苦苦挣扎,post 请在评论中提出您的进一步问题。
我正在使用 OCR 识别图片上的数字
var engine = new TesseractEngine(@"C:\Projects\tessdata", "eng", EngineMode.Default,);
var currentImage = TakeScreen();
var page = engine.Process(ScaleByPercent(currentImage, 500));
var text = page.GetText().Replace("\n", "");
规模:
public Bitmap ScaleByPercent(Bitmap imgPhoto, int Percent)
{
float nPercent = ((float)Percent / 100);
int sourceWidth = imgPhoto.Width;
int sourceHeight = imgPhoto.Height;
var destWidth = (int)(sourceWidth * nPercent);
var destHeight = (int)(sourceHeight * nPercent);
var bmPhoto = new Bitmap(destWidth, destHeight,
PixelFormat.Format24bppRgb);
bmPhoto.SetResolution(imgPhoto.HorizontalResolution,
imgPhoto.VerticalResolution);
Graphics grPhoto = Graphics.FromImage(bmPhoto);
grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
grPhoto.DrawImage(imgPhoto,
new System.Drawing.Rectangle(0, 0, destWidth, destHeight),
new System.Drawing.Rectangle(0, 0, sourceWidth, sourceHeight),
GraphicsUnit.Pixel);
bmPhoto.Save(@"D:\Scale.png", System.Drawing.Imaging.ImageFormat.Png);
grPhoto.Dispose();
return bmPhoto;
}
但我得到结果“10g”。
- 如何强制引擎只识别数字?
- 如何获得号码 1013。
您可以使用以下代码告诉 Tesseract 引擎仅查找数字:
var engine = new TesseractEngine(@"C:\Projects\tessdata", "eng", EngineMode.Default);
engine.SetVariable("tessedit_char_whitelist", "0123456789");
Strickos9 向您展示了解决此问题的部分好方法。但要点是,如果您必须扫描相同大小的文本,而且还会包含一些字母,您将得到不好的结果。此外,即使白名单仅与数字相关,您在扫描时也可能会遇到一些问题(例如 5 扫描为 6),因为 Tesseract 很难扫描低质量字符,因此我强烈建议您:
- 将图片放大 2-4 倍。
- 如果需要柔化字符的边缘,请进行一些模糊处理。
- 使用 'threshold' 或 'adaptive threshold' 算法对其进行处理(以清除背景中的模糊像素和蓝色)。
我回答过一个类似的问题
结合 Strickos9 为您提供的功能(如果您只扫描数字)应该可以为您提供完美的扫描质量。
您可以使用 OpenCV 或 Matlab 等软件进行图像处理(尽管我从未尝试过)。如果您正在为此苦苦挣扎,post 请在评论中提出您的进一步问题。