Я хочу извлечь символы цифры, например "123", из изображения, которое имеет белые символы с фоновым рисунком позади.
Изображение:
https://i.stack.imgur.com/aeWPl.png
Моя среда разработки:
- Microsoft Windows 10 Pro (версия 1903)
- Сообщество Microsoft Visual Studio 2019
- Microsoft. NET Framework 4.7.2
- Windows приложение
- OpenCvSharp4. Windows 4.2.0.20200108
- Tesseract 4.1.0 -beta1
То, что я пробовал:
Я обработал изображение следующим образом:
- Получение белой части изображение.
- Реверс изображения.
- Увеличение изображения.
Делая выше, я думал, что смогу извлечь символы. Но я не мог. Тессеракт вернул пустую строку.
Исходный код:
using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using Tesseract;
using Size = OpenCvSharp.Size;
namespace TesseractSample {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
Assembly assm = Assembly.GetExecutingAssembly();
string executing_directory_name = Path.GetDirectoryName(assm.Location);
string tessdataPath = Path.Combine(executing_directory_name, "tessdata");
using (Mat mat2 = new Mat(@"D:\Work\temp.bmp")) {
using (var mat_hsv = mat2.CvtColor(ColorConversionCodes.BGR2HSV_FULL)) {
mat_hsv.ImWrite(@"D:\Work\mat_hsv.bmp");
InputArray lower_white = InputArray.Create(new int[3] { 0, 0, 100 });
InputArray upper_white = InputArray.Create(new int[3] { 180, 45, 255 });
using (Mat mat_mask_white = mat_hsv.InRange(lower_white, upper_white)) {
mat_mask_white.ImWrite(@"D:\Work\mat_mask_white.bmp");
using (Mat mat_reversed = Reverse(mat_mask_white)) {
mat_reversed.ImWrite(@"D:\Work\mat_reversed.bmp");
using (Mat mat_resized = new Mat()) {
Cv2.Resize(mat_reversed, mat_resized, new Size(mat_reversed.Width * 3, mat_reversed.Height * 3));
mat_resized.ImWrite(@"D:\Work\mat_resized.bmp");
using (var tesseract = new TesseractEngine(tessdataPath, "eng", EngineMode.LstmOnly)) {
tesseract.SetVariable("tessedit_char_whitelist", "1234567890");
var page = tesseract.Process(mat_reversed.ToBitmap());
string text = page.GetText();
MessageBox.Show(text: $"--->{text}<---");
}
}
}
}
}
}
}
public static Mat Reverse(Mat src) {
Mat mat = src.Clone();
for (var y = 0; y < mat.Height; y++) {
for (var x = 0; x < mat.Width; x++) {
var px = mat.Get<Vec3b>(y, x);
px[0] = (byte)(255 - px[0]);
px[1] = (byte)(255 - px[1]);
px[2] = (byte)(255 - px[2]);
mat.Set(y, x, px);
}
}
Cv2.ImShow("image", src);
Cv2.WaitKey();
return mat;
}
}
}
С уважением.