Я читаю символы с изображения в 20х20 куски для выполнения оптического распознавания символов (OCR), и мне интересно, как реализовать лучший способ центрирования двоичной матрицы данных.Центрирование двоичной матрицы для OCR
Например, персонаж h
может быть превращено в следующие одномерный массива (пробелы и символы новой строки добавлены для ясности):
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Насколько я знаю, есть две альтернативы:
Центр масс
var mass = 0, sum = { x: 0, y: 0 }; for(y = 0; y < size; y++) { for(x = 0; x < size; x++) { if(chunk[size * y + x]) { sum.x += x; sum.y += y; mass++; } } } // diff center of mass and center of matrix var diff = { x: Math.round((size/2) - (sum.x/mass)), y: Math.round((size/2) - (sum.y/mass)) }; // move 1's accordingly
Вопрос в том, как обращаться, если этот тип центрирования приводит к тому, что какой-либо из 1 будет помещен вне куска и, следовательно, повреждает данные?
ограничивающего параллелепипеда
Calculate центр
min(x, y)
иmax(x, y)
и диф с центром матрицы.
Какое из них даст наилучшие (самые последовательные) результаты, если входные символы случайным образом искажены (слегка) в обоих измерениях?
Полученный кусок используется при обучении многоуровневой нейронной сети персептрона (MLP), если это помогает.