2015-03-13 2 views
0

Я читаю символы с изображения в 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 

Насколько я знаю, есть две альтернативы:

  1. Центр масс

    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 будет помещен вне куска и, следовательно, повреждает данные?

  2. ограничивающего параллелепипеда

    Calculate центр min(x, y) и max(x, y) и диф с центром матрицы.

Какое из них даст наилучшие (самые последовательные) результаты, если входные символы случайным образом искажены (слегка) в обоих измерениях?

Полученный кусок используется при обучении многоуровневой нейронной сети персептрона (MLP), если это помогает.

ответ

0

Законченный с использованием метода ограничительной рамки:

var min = { 
    x: size, 
    y: size 
}; 
var max = { 
    x: 0, 
    y: 0 
}; 

for(y = 0; y < size; y++) { 
    for(x = 0; x < size; x++) { 
    if(chunk[size * y + x]) { 
     if(min.x > x) 
     min.x = x; 

     if(min.y > y) 
     min.y = y; 

     if(max.x < x) 
     max.x = x; 

     if(max.y < y) 
     max.y = y; 
    } 
    } 
} 

var diff = { 
    x: Math.floor((size/2) - (min.x + (max.x - min.x)/2)), 
    y: Math.floor((size/2) - (min.y + (max.y - min.y)/2)) 
}; 

// move 1's accordingly 
Смежные вопросы