65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Tesseract 从图像中抓取数据

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2018 年 3 月 31 日

Apache

2分钟阅读

viewsIcon

24091

downloadIcon

1815

使用 Tesseract OCR 引擎从图像中抓取数据

引言

数据科学是一个不断发展的领域。根据 CRISP DM 模型和其他数据挖掘模型,我们需要在挖掘知识和进行预测分析之前收集数据。数据收集可能涉及数据抓取,包括网页抓取(HTML 到文本)、图像到文本和视频到文本转换。当数据处于文本格式时,我们通常使用文本挖掘技术来挖掘知识。

在本文中,我将向您介绍光学字符识别 (OCR),以将图像转换为文本。我开发了 Just Another Tesseract Interface (JATI) 将图像转换为文本文件,并将它们整合到一组文本数据中,用于文本挖掘和自然语言处理。

JATI 接口与 Tesseract OCR 引擎配合使用,将图像转换为文本。我已包含源代码。在本文中,我将解释如何使用 C# 接口流行的开源 Tesseract OCR 引擎。

选择要转换的图像部分

要 OCR 整个图像,这很容易,但我希望选择图像的一部分进行 OCR。这也可以提高结果的准确性。因此,在 JATI 中,用户可以单击 picturebox 图像并拖动以绘制矩形来选择该部分。然后将选定的区域裁剪。以下是完成此操作的步骤。

参考文献

  1. http://www.c-sharpcorner.com/UploadFile/hirendra_singh/how-to-make-image-editor-tool-in-C-Sharp-cropping-image/
  2. https://stackoverflow.com/questions/34551800/get-the-exact-size-of-the-zoomed-image-inside-the-picturebox

包含 System.Drawing

using System.Drawing;

PictureBox1 的鼠标按下事件

void PictureBox1MouseDown(object sender, MouseEventArgs e)
        {
            try {
           
             if (e.Button == System.Windows.Forms.MouseButtons.Left)
             {
                 Cursor = Cursors.Cross;
                startX = e.X;
                startY = e.Y;
               
                selPen = new Pen(Color.Red, 1);
              }
             
             pictureBox1.Refresh();
            }
           
            catch(Exception ex) {
               
            }
        }

PictureBox1 的鼠标移动事件

void PictureBox1MouseMove(object sender, MouseEventArgs e)
        {
            try {
            if(e.Button == System.Windows.Forms.MouseButtons.Left) {
                pictureBox1.Refresh();   
                //Cursor = Cursors.Cross;
                curX = e.X;
                curY = e.Y;
               
                Rectangle rect = new Rectangle(startX, startY, curX - startX, curY - startY);
                pictureBox1.CreateGraphics().DrawRectangle(selPen, rect);               
            }
            }
           
            catch(Exception ex) {
               
            }
           
        }

PictureBox1 的鼠标抬起事件

void PictureBox1MouseUp(object sender, MouseEventArgs e)
        {
            try {
            Cursor = Cursors.Arrow;
       
            Rectangle rect = new Rectangle(startX, startY, curX-startX, curY-startY);
          
            Bitmap OriginalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
            Bitmap _img = new Bitmap(curX-startX, curY-startY);

            Graphics g = Graphics.FromImage(_img);

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

            g.DrawImage(OriginalImage, 0, 0, rect, GraphicsUnit.Pixel);
 
            pictureBox2.Image = _img;
            pictureBox2.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox2.Width = _img.Width;
            pictureBox2.Height = _img.Height;
              
            }
           
            catch(Exception ex) {
               
            }
        }

以上代码裁剪选定的图像部分并将其放入 picturebox2 中。以下是详细说明。

为选择创建一个新的 rectangle 对象

Rectangle rect = new Rectangle(startX, startY, curX-startX, curY-startY);

将原始图像保存到 Bitmap 对象中

Bitmap OriginalImage = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);

创建一个新的 Bitmap 对象

Bitmap _img = new Bitmap(curX-startX, curY-startY);

基于新的 Bitmap 对象创建一个 Graphics 对象

Graphics g = Graphics.FromImage(_img);

Graphics 对象的设置

g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

基于选择裁剪图像并放入 pictureBox2

g.DrawImage(OriginalImage, 0, 0, rect, GraphicsUnit.Pixel);
pictureBox2.Image = _img;

为了获得图像的选定坐标,我使用

string selCoordinates = "(" + startX.ToString() + "," + startY.ToString() + 
                        "," + curX.ToString() + "," + curY.ToString() + ")";

使用 Tesseract 进行图像到文本识别

我使用 Tesseract OCR 引擎将图像转换为文本。要与 Tesseract OCR 引擎接口,请包含 System.Diagnostic

using System.Diagnostics;

pictureBox2 中裁剪的图像选择保存到临时目录中

pictureBox2.Image.Save(Directory.GetCurrentDirectory() + "/JATI/temp/temp" + ".png");

为 Tesseract OCR 引擎设置输入文件和输出文件

string input = Directory.GetCurrentDirectory() + "/JATI/temp/temp" + ".png";
string output = Directory.GetCurrentDirectory() + "/JATI/temp/temp" + ".txt";

创建进程并放入参数

Process myProcess = Process.Start(Directory.GetCurrentDirectory() + 
"/JATI/tesseract.exe", "--tessdata-dir ./JATI/ " + input + " " + 
output.Replace(".txt", "") + " -l " + languageTextBox.Text + " -psm " + psmTextBox.Text);

等待进程退出

myProcess.WaitForExit();
© . All rights reserved.