Распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами - C#
Формулировка задачи:
Всем доброго времени суток.
Пишу программу для распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами.
Сначала программа вычисляет края(верх, низ, лева, право) символа. Потом сравнивает с листом эталонов. Началом следующего символа является правая точка приведущего.
Программа работает. Но не может прочитать символы которые касаются друг друга.
Выкладываю исходники своего проекта. 1.7z Прошу помощи. Я уже довольно давно калупаюсь над этим и не смог придумать как это сделать.
P.S. За идею бралась статья http://dign.narod.ru/articles/recognition/
автор прилагает пример программы которая справляется с слипшимися символами, написана на дельфи, исходников нет.
Решение задачи: «Распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами»
textual
Листинг программы
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace bitmap_reader { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void f(Bitmap bitmap, int x1, int x2, int y1, int y2, ref int x3, ref int x4, ref int y3, ref int y4) { int count = 0; int i = 1; for (int x = x1; x <= x2 && i == 1; x++) { for (int y = y1; y <= y2 && i == 1; y++) { if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0)) { x3 = x; i = 0; if (x3 - x1 >= 4) { x3 = x - 4; x4 = x - 1; y3 = y1; y4 = y1; return; } break; } } } i = 1; for (int x = x3; x <= x2 && i == 1; x++) { count = 0; for (int y = y1; y <= y2 && i == 1; y++) { if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0)) { count++; } } if (count == 0) { x4 = x - 1; i = 0; break; } } i = 1; for (int y = y1; y <= y2 && i == 1; y++) { for (int x = x3; x <= x4 && i == 1; x++) { if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0)) { y3 = y; i = 0; break; } } } i = 1; for (int y = y3; y <= y2 && i == 1; y++) { count = 0; for (int x = x3; x <= x4 && i == 1; x++) { if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0)) { count++; } } if (count == 0) { for (int Y2 = y + 1; Y2 <= y2 && i == 1; Y2++) { count = 0; for (int X2 = x3; X2 <= x4 && i == 1; X2++) { if (bitmap.GetPixel(X2, Y2) == Color.FromArgb(0, 0, 0)) { count++; } } if (count == 0) { if (Y2 - y == 1) { y4 = y - 1; } else { y4 = Y2 - 1; } i = 0; break; } } } } } public void find(Bitmap bitmap, Dictionary<int, Bitmap> list, int x3, int x4, int y3, int y4, ref string str, ref int xx) { Dictionary<int, int> list2 = new Dictionary<int, int>(); int count = 0; for (int i = 32; i <= 183; i++) { try { count = 0; for (int x01 = x3, x02 = 0; x01 <= x4 && x02 <= list[i].Width - 1; x01++, x02++) { for (int y01 = y3, y02 = 0; y01 <= y4 && y02 <= list[i].Height - 1; y01++, y02++) { if (bitmap.GetPixel(x01, y01) == list[i].GetPixel(x02, y02)) { count++; } } } if (list[i].Width * list[i].Height == count) { list2.Add(count, i); } } catch { } } str = Convert.ToChar(list2[list2.Keys.Max()]).ToString(); xx = x3 + list[list2[list2.Keys.Max()]].Width; } private void Form1_Load(object sender, EventArgs e) { Bitmap bitmap = new Bitmap("data\\sc.bmp"); Dictionary<int, Bitmap> list = new Dictionary<int, Bitmap>(); for (int i = 32; i <= 183; i++) { try { Bitmap b = new Bitmap(@"data\" + i + ".bmp"); list.Add(i, b); } catch { } } int x0 = 13; int y0 = 6; int x1 = x0 + 10; int x2 = x1 + 403; int y1 = y0; int y2 = y1 + 14; int x3 = 0; int x4 = 0; int y3 = 0; int y4 = 0; int xx = x4 + 1; string strings = ""; string strs = ""; int ff = 0; for (int x = x1; x <= x2; x++) { for (int y = y1; y <= y2; y++) { if (bitmap.GetPixel(x, y) != Color.FromArgb(255, 255, 255)) { bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255)); } else { bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0)); } } } int ir = 1; for (int x = x2; x >= x1 && ir == 1; x--) { for (int y = y1; y <= y2 && ir == 1; y++) { if (bitmap.GetPixel(x, y) == Color.FromArgb(0, 0, 0)) { x2 = x + 1; ir = 0; break; } } } while (x4 + 1 != x2) { if (ff != 0) { x1 = xx; } f(bitmap, x1, x2, y1, y2, ref x3, ref x4, ref y3, ref y4); find(bitmap, list, x3, x4, y3, y4, ref strs, ref xx); strings = strings + strs; ff = 1; } MessageBox.Show(strings); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д