Обнаружение одного изображения в другом и возвращение его значения - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть словарь изображений-шаблонов для многих букв, а также растровое изображение, которое необходимо распознать! Высоты «обоих» изображений одинаковы! Некоторые рисунки имеют разную ширину.

Как перебрать по оси X и распознать буквы из шаблона?

Сейчас я использую эту функцию, чтобы проверить, содержит ли растровый столбец X черные пиксели:

static Boolean GetColumnState(Bitmap bmp, int x)
{
    BitmapData pixelData = bmp.LockBits(
      new Rectangle(0, 0, bmp.Width, bmp.Height),
      ImageLockMode.ReadOnly,
      PixelFormat.Format32bppArgb);
    Boolean state = false;
    unsafe
    {
        int* pData = (int*)pixelData.Scan0.ToPointer();
        pData += x;
        for (int i = 0; i < bmp.Height; ++i)
        {
            pData += bmp.Width;
            if (Color.FromArgb(*pData) == Color.FromArgb(255, 0, 0, 0))
            {
                state = true;
                break;
                //pixelColumn[i] = Color.FromArgb(*pData);
            }
        }
    }
    bmp.UnlockBits(pixelData);

    return state;
}

Если GetColumnState() возвращает True, то я обрезаю изображение того же размера, что и изображение шаблона, и сравниваю их.

        int y = target.Count;

        for (int i = 0; i < b1.Width; i++)
        {
            if (GetColumnState(b1, i + count) == true)
            {
                        int trWidth = target[5].Value.Width;
                        int trHeight = target[5].Value.Height;
                        Bitmap bitm = new Bitmap(trWidth, trHeight);
                        Rectangle section = new Rectangle(new Point(0, b1.Height - trHeight-1), new Size(trWidth, trHeight));
                        Bitmap cropped = CropImage(b1, section);
                        cropped.Save(@"C:\111.png");
                        target[5].Value.Save(@"C:\000.png");

                        if (CompareMemCmp(cropped, target[5].Value) == true)
                        {
                            //count = target[5].Value.Width;
                            textBox2.AppendText(target[5].Key);
                            break;
                        }
                        else { textBox2.AppendText("noo"); }

                //textBox1.Text = "yes!";
            }
            else
            {
                //textBox1.Text = "noo";
            }
            break;
        }

К сожалению, хотя обрезанное изображение визуально выглядит одинаково - оно имеет другой размер, поэтому memcmp (мой метод сравнения основан на этом) возвращает false ..

Растровое изображение, которое должно быть распознано, и все изображения шаблонов выполнены в цветах BlackAndWhite. Мне интересно, есть ли более надежный способ сравнить одно изображение в другом изображении и вернуть его значение через словарь (OCR) ..

1 Ответ

0 голосов
/ 21 февраля 2012

Сопоставление с образцом на основе значений пикселей не является надежным, как вы обнаружили.Если шрифт полностью предсказуем и постоянно отображается, вы можете выполнить эту работу, нормализовав изображения (выровнять, масштабировать, повернуть, чтобы соответствовать), и вычислив среднеквадратичную разницу между изображениями, а затем принять, если он достаточно мал.1002 * Перед лицом неизвестных шрифтов или различных источников изображения (снимок экрана, камера, сканирование и т. Д.) Вам нужна более надежная схема, основанная на некотором типе машинного обучения (ML).Распознавание цифр из растровых изображений является классическим вводным примером для нейронных сетей, но многие другие схемы ML будут работать - см. Контролируемое обучение # Approaches_and_algorithms в Википедии .Обратите внимание, что это потребует обучения, а это означает, что вам нужен хороший разнообразный набор данных для обучения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...