출처 : https://www.codeproject.com/Articles/1237204/Data-Scraping-from-Image-using-Tesseract
소개
데이터 과학은 성장하는 분야입니다. CRISP DM 모델 및 기타 데이터 마이닝 모델에 따르면 지식을 추출하고 예측 분석을 수행하기 전에 데이터를 수집해야합니다. 데이터 수집에는 웹 스크래핑 (HTML에서 텍스트로), 이미지에서 텍스트로, 비디오에서 텍스트로의 변환을 포함하는 데이터 스크래핑이 포함될 수 있습니다. 데이터가 텍스트 형식 인 경우 일반적으로 텍스트 마이닝 기술을 사용하여 지식을 찾습니다.
이 기사에서는 이미지를 텍스트로 변환하기 위해 OCR (Optical Character Recognition)을 소개합니다. 필자는 이미지를 텍스트 파일로 변환하고이를 텍스트 마이닝 및 자연어 처리를위한 텍스트 데이터 세트로 통합하기 위해 JATI (Just Another Tesseract Interface)를 개발했습니다.
텍스트로 이미지를 변환하는 Tesseract OCR 엔진과 JATI 인터페이스. 나는 소스 코드를 포함시켰다. 이 기사에서는 C #을 사용하여 널리 사용되는 오픈 소스 Tesseract OCR 엔진의 인터페이싱에 대해 설명 할 것입니다.
변환 할 이미지 부분 선택
전체 이미지를 OCR하려면 쉽지만, 이미지의 일부를 OCR로 선택하고 싶습니다. 결과의 정확성도 향상 될 수 있습니다. 따라서 JATI에서 사용자는 그림 상자 이미지를 클릭하고 드래그하여 직사각형을 그려 부분을 선택할 수 있습니다. 선택한 영역이 잘립니다. 다음은이를 수행하기위한 단계입니다.
참고:
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 rect = new Rectangle(startX, startY, curX-startX, curY-startY);
원본 이미지를 Bitmap 객체에 저장합니다.
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;
선택에 따라 이미지를 자르고 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();