Распознавания текста на заданной области изображения путём попиксельного сравнения с шаблонами - 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);
}
}
}