Está en la página 1de 9

RECONOCIMIENTO DE TEXTOS: OCR

Luis Martin-Cobos Blanco Alberto Godino Martinez


Ingenieria de Telecomunicaciones Ingenieria de Telecomunicaciones
Universidad Carlos III de Madrid Universidad Carlos III de Madrid
Av. De la Universidad, 30 Av. De la Universidad, 30
28911 Leganés (Madrid) 28911 Leganés (Madrid)
100276565 100275692
100276565@alumnos.uc3m.es 100275692@alumnos.uc3m.es

RESUMEN existen algoritmos y aplicaciones más complejas y fiables.


En el presente artículo se describen las características principales Algunos ejemplos de este reconocimiento de caracteres
del reconocimiento óptico de caracteres y se desarrolla al final un manuscritos los podremos encontrar en el sector bancario y postal
pequeño ejemplo de la aplicación de las mismas mediante el uso por ejemplo:
de CCA.

Términos Generales
2.1.1 Bancario
Algorithms, Human Factors, Documentation . Lectura de cheques de forma automática para la correcta
transferencia de dinero. No obstante, a veces requiere una
Palabras Clave confirmación manual. Aun así, en general reduce los tiempos de
OCR, redes neuronales, algoritmo knn, Matlab , Capchta, CCA. espera en muchos bancos.

1. INTRODUCCION 2.1.2 Servicios postales:


El OCR (Optical Character Recognition) es una tecnología que
trata de emular la capacidad del ojo humano para reconocer En la actualidad, numerosas compañías dedicadas a todos
objetos. Concretamente es un software que permite el aquellos relacionados con la entrega de cartas y paquetes utilizan
reconocimiento óptico de los caracteres contenidos en una este sistema para agilizar los trámites de reparto. Los sistemas de
imagen de forma que estos se vuelven comprensibles o OCR son los encargados de leer, entre otros campos:
reconocibles para un ordenador, obteniendo como resultado final
un archivo en un formato de texto editable.  Direcciones: códigos postales, ciudad, calle, número.
El proceso básico que se lleva a cabo en el Reconocimiento
Óptico de Caracteres es por tanto, convertir el texto que aparece
 Números de producto.
en una imagen en un archivo de texto que podrá ser editado y
utilizado como tal por cualquier otro programa o aplicación que lo  Indicaciones de cantidad.
necesite. Este proceso se desarrolla en 4 fases que son:
binarizacion, segmentación ,reducción de características o  Números de proveedores
adelgazamiento y análisis.
En el caso concreto de los textos, existen y se generan
continuamente grandes cantidades de información escrita,
tipográfica o manuscrita en todo tipo de soportes. En este ámbito,
poder llevar a cabo de forma automática la introducción de
caracteres evitando tener que introducirlos por teclado, implica un
importante ahorro de recursos humanos y un aumento de la
productividad, al mismo tiempo que se mantiene o se mejora, la
calidad de muchos servicios.
Las aplicaciones basadas en OCR son cada dia mas imporatnes y
mas numerosas. Se trta de una disciplina en pleno crecimiento.

2. APLICACIONES
En la actualidad son numerosas las aplicaciones de OCR en todos Figura 1. Reconocimiento de caracteres en el correo
los ámbitos. Entre ellas podríamos destacar las siguientes:

2.1 Reconocimiento de texto manuscrito 2.2 Reconocimiento de matrículas


El reconocimiento de texto manuscrito sigue siendo uno de los Podemos hacer mención a dos tipos de aplicaciones diferentes y
principales desafíos para las aplicaciones de OCR. Cada vez bastante corrientes dentro de este campo:
2.3 Otras aplicaciones comunes
2.2.1 Radares Existen otra serie de aplicaciones cotidianas que hacen uso de
OCR continuamente, y que resultan realmente valiosas. Que los
Radares utilizados para controlar la velocidad en las carreteras. documentos escaneados sean algo más que archivos de imagen,
Deben recoger la matrícula de aquellos vehículos que hallan convirtiéndose en documentos sobre los que se pueden hacer
excedido un determinado limite, para después poder sancionar:El búsquedas con contenido de texto, o el reconocimiento de los
sistema usado actualmente es ANPR (Automatic number plate códigos de barras son un ejemplo de alguna de estas aplicaciones.
recognition) , el cual hace uso del reconocimiento óptico de
caracteres (OCR) en las imágenes tomadas por las cámaras
fotográficas.
Estos sistemas deben atender a 5 dificultades principales:
 Localización de la matrícula - responsable de encontrar
y aislar la matrícula en la imagen.
 Orientación y tamaño de la matrícula - compensa los
ángulos que hacen que la matrícula parezca "torcida" y
ajusta las dimensiones al tamaño requerido.
 Normalización - ajusta el brillo y el contraste de la
imagen.
 Segmentación de los caracteres - encuentra los distintos
caracteres presentes en la matrícula.
 Reconocimiento óptico de caracteres. Figura 3. Digitalizacion del documento
 Análisis sintáctico y geométrico - comprueba los
caracteres encontrados y sus posiciones con las reglas
específicas del país al que pertenece la matrícula.
2.4 OCR y capchta

Una herramienta que últimamente está ayudando en la


digitalización de los libros son los famosos Captcha que
encontramos en numerosas web a la hora de tener que
identificarnos o registrarnos en alguna sección y que pretenden
discriminar si somos un humano o somos una máquina.
Los libros más antiguos son realmente un reto para los algoritmos
de OCR ya que el 30% de sus caracteres no son reconocidos. En
la actualidad los Captcha se forman de dos palabras, una conocida
por el sistema y otra que no se ha podido identificar durante el
proceso de digitalización de un cierto documento. Cuando
tenemos que resolver un Captcha se selecciona una de esas
Figura 2. Reconocimiento de caracteres en matricula de coches palabras que la maquina no ha podido identificar y se le presenta
al usuario junto con la otra que si ha podido ser reconocida por el
sistema. De este modo el ordenador solo sabe la respuesta correcta
Como dato curioso cabe resaltar que en el año 2002 , se produjo a una de las 2 palabras. Si acertamos esa, (nosotros realmente no
el cambio en las matrículas de los vehículos holandeses y uno de sabemos cual ha podido identificar el OCR y cual no) seremos
los cambios que introdujeron las nuevas fue el de la fuente reconocidos como humanos y podremos seguir adelante. ¿Qué
tipográfica de las mismas con el objetivo de permitir un mayor y ocurre con la otra? Si 10 personas la reconocen como la misma
mejor reconocimiento por parte de estas aplicaciones. palabra el ordenador la aprenderá y la incorporara de modo que
estaremos ayudando a digitalizar libros.
2.1.2 Seguridad
Lectores de placas que permiten el acceso a los vehículos
autorizados en determinadas áreas (oficinas, cocheras,...).
Distintas instituciones, ya llevan utilizando este sistema varios
años. Esta aplicación tiene un funcionamiento muy parecido al
anterior en cuanto al modo de lectura de las placas del vehículo.

Figura 4. Capchtas y su aplicación en OCR


3. DESARROLLO OCR 3.2 Segmentacion
Con todo lo anterior, las técnicas de OCR son útiles para
digitalizar textos (caracteres impresos) o formularios rellenados Para reconocer caracteres es necesaria, en primer lugar, su
manualmente (caracteres manuscritos). Tanto en un caso como en localización dentro del texto del documento.
el otro la manera de identificar los caracteres individuales de
dichos documentos es mucho más sencillo que en el caso de texto Existen tres magnitudes que determinan el orden de los caracteres
manuscrito continuo, para el que es necesario la aplicación de dentro de un texto:
técnicas de preproceso y segmentación más complejas que en el
caso de OCR.  los renglones de los que consta
 las palabras de un renglón
Tomando como referencia por tanto, una de las aplicaciones mas
comunes de OCR, la digitalización de documentos, la técnica para  las letras de una palabra.
el reconocimiento de caracteres se basa en los siguientes pasos:
Por tanto ,y siguiendo el orden en un primer paso deberemos
reconocer los renglones del documento en cuestión. Para ello se
suelen realizar proyecciones horizontales que nos proporcionan
finalmente los renglones de los que consta un texto.

Una vez obtenidos los renglones sera necesaria aislar las palabras
y los caracteres de estas palabras. Nos basaremos en el uso de
proyecciones verticales en esta ocasión. Conseguiremos de esta
forma aislar cada carácter en una ventana rectangular con las
dimensiones correspondientes, su anchura y altura.

Figura 7. Reconocimiento de caracteres en un documento:


segmentacion
Figura 5. Fases a seguir en OCR

3.1 Binarizacion
Tras las digitalización del documento en cuestión, a través de un
3.2 Reducción de dimensiones y extracción de
escáner por ejemplo, y la separación previa en dicho documento características
de imágenes y texto, ya que ambos son entendidos por el
ordenador como 0s y 1s, se procede a convertir la imagen digital Una vez acabado el proceso de segmentación tenemos una
en una imagen en blanco y negro preservando las propiedades representación de cada carácter (obtenido tras la segmentación)
esenciales . representado en un formato matricial con las numerosas
características que lo representan.

El número de estas características suele ser muy elevado con lo


cual conviene llevar a cabo técnicas para reducir la
dimensionalidad. De este modo el procesamiento de cada uno de
ellos será más rápido y eficaz, puesto que trataremos de eliminar
aquellas características que no aportan información relevante.

Eficiencia, en este caso, significa que con una representación más


compacta se consigue un poder discriminativo igual o superior al
que se tenía con la representación original. Esto no es solo
importante por el ahorro de espacio en el almacenamiento de las
muestras, sino que durante el proceso de reconocimiento reduce
Figura 6. Binarizacion de un documento
los costes computacionales, debido a la reducción en el volumen  Encuentra la relación lineal más grande entre dos
de información procesado. conjuntos de vectores de características.
Para hacer una buena extracción de características, debe cumplirse  Es invariante con respecto al escalado.
que cada una tenga:  Los diferentes auto vectores dan soluciones
incorreladas.
 Discriminación: Deben ser características que  CCA es simple y rápido. ICA es iterativo y puede dar
diferencien suficientemente una clase de otra. diferentes soluciones en función de la pre asunción
 Deben tener igual valor para mismas clases. inicial.
 Independencia: Las características deben estar  CCA considera el orden de las muestras (auto
incorreladas unas de otras. correlación) que es la medición real de señales e
 Pequeño espacio para características: El número de imágenes.
características debe ser pequeño para la rapidez y
facilidad de clasificación. La formula más importante y que nos va a permitir calcular la
correlacion es:

Los métodos de extracción de características mas populares son:

-PCA (Principal Component Analysis):


El objetivo de esta técnica es definir una transformación lineal
desde el espacio de representación original a un nuevo espacio en
el que las distintas clases de las muestras quedan mejor separadas Figura 8. CCA
y por tanto sean fácilmente clasificables. Esta transformación
permite reducir la dimensión del nuevo espacio sin perjudicar Donde:
sensiblemente la capacidad discriminativa de la nueva
representación. - X es la matriz de características del caracter que se
quiere identificar
-LDA (Linear Discriminant Analysis): - Wx es el auto vector cuyo autovalor es el más alto de
LDA y PCA son muy parecidos ya que ambos utilizan la matriz de covarianza de X
combinaciones lineales de variables para representar a los datos. - Y es la matriz de características del caracter que se
En concreto, LDA modela la diferencia entre las clases de datos. tiene guardado
- Wy es el auto vector cuyo autovalor es el más alto de
-ICA (Independent Component Analysis): la matriz de covarianza de Y
Este método consiste principalmente en obtener un conjunto de
vectores lo mas independientes posible. Al final del documento vamos a llevar a cabo un ejemplo de OCR
con esta implementación. Por simpleza, nuestro código no va a
-NDA (Non-linear Discriminant Analysis): realizar la binarización ni segmentación puesto que los datos no se
NDA sigue la misma idea que LDA pero representa los datos van a obtener de ningún documento (van a ser introducidos por el
mediante combinaciones no lineales. usuario).
CCA (Canonical Correlation Analysis):

-CCA 3.4 Analisis


Se trata de un modelo estadístico multivariante que facilita el
estudio de interrelaciones entre conjuntos de variables Una vez se tienen las características más importantes de la imagen
dependientes y variables independientes. La correlación canónica a analizar hay que determinar el carácter correspondiente por
predice simultáneamente múltiples variables dependientes de medio de las técnicas de minería de datos que se explicarán a
múltiples variables independientes. CCA pone menos continuación.
restricciones sobre los tipos de datos en los que opera . Debido a
que las otras técnicas imponen restricciones más rígidas , se cree
generalmente que la información obtenida de ellos es de mayor 3.4.1 Algoritmos de decision
calidad y puede ser presentado de una manera más interpretable .
Por esta razón , muchos investigadores consideran correlación
Una vez que se han obtenido sub imágenes en la que cada una
canónica como un último esfuerzo , que se utilizará cuando el
contiene un carácter de la palabra a identificar, se pasa a clasificar
resto de técnicas superior es se hayan agotado. Sin embargo, en
cada imagen por separado (llamado identificar el pattern, es decir,
situaciones con múltiples variables dependientes e
la configuración de pixeles binarios que constituyen esa sub
independientes, la correlación canónica es la técnica más
imagen).
adecuada y potente. Se ha ganado la aceptación en muchos
campos y representa una herramienta útil para el análisis multi
Puesto que es un sistema de inteligencia artificial, es necesario
variable , especialmente cuando el interés de los investigadores se
que el sistema OCR vaya aprendiendo de las sucesivas iteraciones
ha extendido a considerar múltiples variables dependientes.
para poder realizar cada vez la clasificación con mayor precisión.
CCA se caracteriza por:
Principalmente hay dos tipos de procesado que se pueden usar En el caso de KNN (K - Nearest Neighbour) es una clasificación
para la clasificación: de tipo supervisada y, por tanto, es necesario tener almacenado
previamente los ejemplos de entrenamiento. Cuando se va a
- Template matching (simple) clasificar un nuevo objeto se extraen los objetos más parecidos y
- Feature analysis (más sofisticado y por tanto más caro) se usa su clasificación para clasificar el nuevo.

El proceso de aprendizaje es trivial siendo el de clasificación el


que consume más tiempo. Los vecinos más cercanos a una
distancia se obtiene, generalmente, usando la distancia Euclidea.

3.4.1.1 Template macthing: Nearest Neighbour Los arboles de decisión son, al igual que KNN, una técnica de
minería de datos. Los atributos que se quieren evaluar de un
En este caso, se necesitan en memoria una serie de modelos que carácter determinado son los nodos del árbol y los resultados
corresponderán a cada carácter que se quiera identificar. finales de los mismos pasaran a ser las hojas.

Una vez que tengamos el carácter que queremos identificar, será Una vez construido el árbol, se puede tratar siguiendo la
necesario realizar la correlación entre este y todos los modelos arquitectura de condiciones ( si se cumple la condición se realiza
que tenemos guardados en memoria. El modelo en memoria que una acción y si no se cumple se realiza otra). En este tipo de
presente mayor correlación será el que se cree como escrito. clasificación es muy importante el orden de evaluación de los
atributos del carácter que se quiere clasificar para alcanzar un
Si ninguno de los modelos obtiene una correlación suficiente, se ajuste óptimo del árbol. Para ello será necesario realizar una serie
dejara ese carácter como no clasificable. Si, por el contrario, se de funciones que evalúan los atributos y les da diferente
obtienen dos o más modelos con una correlación alta, estos importancia.
modelos se pasan a la siguiente fase, el post-processing.
Finalmente, las redes neuronales son un tipo de arquitectura que
En esta fase, se calcula la distancia Euclidea (fig.1) entre los tratan de imitar la composición y funcionamiento del cerebro.
modelos que han dado correlación alta y el carácter a identificar. Básicamente, se componen de una serie de unidades llamadas
neuronas que reciben una entrada que es multiplicada por un peso
(peso de cada neurona) y en función del resultado y de la función
de activación usada, dará como resultado una salida u otra.

La arquitectura típica de una red neuronal es la siguiente:


Figura 9. Distancia eucidea

3.4.1.2 Feature analysis


Este procesado se caracteriza en extraer una serie de
características o features del carácter a identificar (por ejemplo las
líneas verticales, las horizontales, cuantas esquinas tiene, la
cercanía entre las líneas, cuantos cruces hay, como es el contorno,
etc)

La dificultad reside en qué características han de obtenerse para


detectar eficientemente el carácter y esta fase puede ser costosa
computacionalmente. Como parte positiva, generalmente el Figura 10. Red neuronal aplicada en OCR
conjunto de elementos que son necesarios extraer no son muy
altos y por tanto la fase de clasificación (mediante KNN, arboles Cabe destacar, que si solo hubiera una capa oculta (single-layer),
de decisión o redes neuronales) puede hacerse bastante rápido. las líneas de decisión solo podrán ser una línea recta. En el caso
de 2 o más capas ocultas, (multi-layer), las líneas de decisión
3.4.1.3 Extracción de características podrán ser curvas.
Como hemos comentado anteriormente, la extracción de
características es la fase más importante de este tipo de decisión, y
por ello han sido descritas detalladamente en la sección anterior.
4. CONCLUSIONES
Tal y como hemos visto, las técnicas de reconocimiento óptico de
caracteres están viviendo un gran auge en los últimos años y cada
vez son mas las aplicaciones que hacen uso de ellas.
3.5 La clasificación
Como hemos comentado anteriormente, puede realizarse mediante Además, su eficiencia y efectividad es cada vez mayor, realizando
KNN, arboles de decisión o redes neurales. tareas complicadas en poco tiempo y con elevados porcentajes de
éxito en la resolución de las mismas. No obstante, aun queda
mucho por hacer , sobre todo en el campo del reconocimiento de
la escritura manuscrita ya que principalmente la diferente %la correlacion con el que se quiera identificar.
caligrafía de cada persona dificulta mucho la tarea de OCR ya sea %Por tanto, pedimos al usuario que dibuje los numeros del 0 al 9
tanto en cuanto al reconocimiento de cada carácter en si mismo y se
como a la hora de separación de las palabras ,renglones,etc que %guarda en las variables n0- n9
conforman el documento.
%Funcionamiento:
%Aparecera una ventana con un recuadro blanco. En el, se puede
escribir un
5. ANEXO: IMPLEMENTACION DE UN %numero haciendo click izquierdo con el raton y arrastrando.
CASO PRACTICO EN MATLAB Tambien se
Con el objetivo de poner en practica algunos de los conceptos %puede escribir, soltar, empezar en otro sitio y seguir. (por
explicados a lo largo del documento se ha realizado un pequeño ejemplo para
código en Matlab que pretende procesar un número que el usuario %hacer el 7)
“pinta ” por pantalla y reconocer de que numero verdaderamente %Cuando se haya terminado de escribir el numero y deberia
se trata .La técnica CCA será la empleada: aparecer una nueva ventana. Si no, darle a "Enter".
%Para el correcto funcionamiento del programa, hay que meter
los numeros
archivo "autoEnOrden.m" %del 0 al 9 en ese orden.
function [A, B] = autoEnOrden(M) n0 = draw(1,20);
n1 = draw(2,20);
% autoEnOrden Autovalores y autovectores ordenados n2 = draw(3,20);
% autoEnOrden(M) es una matriz cuyas columnas son los n3 = draw(4,20);
autovectores de M n4 = draw(5,20);
% ordenados en orden descendiente conforme al valor de n5 = draw(6,20);
sus n6 = draw(7,20);
% autovalores. n7 = draw(8,20);
% n8 = draw(9,20);
% n9 = draw(10,20);
% [A, B] = autoEnOrden(M) produce una matriz A con los
autovectores y un %Normalizamos las matrices que guardan los numeros del 0 al 9
% vector B con los correspondientes valores de autovalores por filas.
de n0(1,:) = n0(1,:)-mean(n0(1,:));
% Los autovalores y autovectores estan ordenados de forma n0(2,:) = n0(2,:)-mean(n0(2,:));
que la n1(1,:) = n1(1,:)-mean(n1(1,:));
% primera columa de A es el autovector correspondiente al n1(2,:) = n1(2,:)-mean(n1(2,:));
% autovalor mayor y asi sucesivamente. n2(1,:) = n2(1,:)-mean(n2(1,:));
% Los autovalores son ordenados con abs(e) n2(2,:) = n2(2,:)-mean(n2(2,:));
n3(1,:) = n3(1,:)-mean(n3(1,:));
n3(2,:) = n3(2,:)-mean(n3(2,:));
[V, D] = eig(M); % Calcula autovalores y autovectores n4(1,:) = n4(1,:)-mean(n4(1,:));
V = fliplr(V); % invertimos el orden de los autovectores n4(2,:) = n4(2,:)-mean(n4(2,:));
d = flipud(diag(D)); % extramos los autovalores e invertimos n5(1,:) = n5(1,:)-mean(n5(1,:));
sus posiciones n5(2,:) = n5(2,:)-mean(n5(2,:));
[foo, I] = sort(abs(d)); n6(1,:) = n6(1,:)-mean(n6(1,:));
d = d(I); % ordenamos los autovalores invertidos en orden n6(2,:) = n6(2,:)-mean(n6(2,:));
ascendente n7(1,:) = n7(1,:)-mean(n7(1,:));
B = flipud(d); %restauramos los autovalores en orden n7(2,:) = n7(2,:)-mean(n7(2,:));
descendiente n8(1,:) = n8(1,:)-mean(n8(1,:));
for j = 1:length(I) n8(2,:) = n8(2,:)-mean(n8(2,:));
A(:,j) = V(:,I(j)); % %ordenamos los autovectores invertidos en n9(1,:) = n9(1,:)-mean(n9(1,:));
orden ascendiente n9(2,:) = n9(2,:)-mean(n9(2,:));
end
A = fliplr(A); %restauramos los autovectores guardados en
orden descendiente %Siguiendo la formula descrita en el manual, vamos a calcular los
%autovalores y autovectores de cada numero y para ello primero,
hacemos la
archivo "cca.m" %matriz de covarianza
MatrizCovarianzan0 = zeros(size(n0,1), size(n0,1));
%CCA %Se crea la matriz de covarianza
for i = 1:size(n0,1)
close all for j = 1:size(n0,1)
%Primero, guardamos los numeros escritos por el usuario para covarianza = mean((n0(i,:) - mean(n0(i,:))) * (n0(j,:) -
despues hacer mean(n0(j,:)))');
MatrizCovarianzan0(i,j) = covarianza; MatrizCovarianzan5(i,j) = covarianza;

end end
end end
%Se calculan los autovalores y autovectores [autovectoresn5,autovaloresn5] =
autoEnOrden(MatrizCovarianzan5);
[autovectoresn0,autovaloresn0] =
autoEnOrden(MatrizCovarianzan0); MatrizCovarianzan6 = zeros(size(n6,1), size(n6,1));
for i = 1:size(n6,1)
%Mismo paso anterior para todos los numeros for j = 1:size(n6,1)
MatrizCovarianzan1 = zeros(size(n1,1), size(n1,1)); covarianza = mean((n6(i,:) - mean(n6(i,:))) * (n6(j,:) -
for i = 1:size(n1,1) mean(n6(j,:)))');
for j = 1:size(n1,1) MatrizCovarianzan6(i,j) = covarianza;
covarianza = mean((n1(i,:) - mean(n1(i,:))) * (n1(j,:) -
mean(n1(j,:)))'); end
MatrizCovarianzan1(i,j) = covarianza; end
[autovectoresn6,autovaloresn6] =
end autoEnOrden(MatrizCovarianzan6);
end
[autovectoresn1,autovaloresn1] = MatrizCovarianzan7 = zeros(size(n7,1), size(n7,1));
autoEnOrden(MatrizCovarianzan1); for i = 1:size(n7,1)
for j = 1:size(n7,1)
MatrizCovarianzan2 = zeros(size(n2,1), size(n2,1)); covarianza = mean((n7(i,:) - mean(n7(i,:))) * (n7(j,:) -
for i = 1:size(n2,1) mean(n7(j,:)))');
for j = 1:size(n2,1) MatrizCovarianzan7(i,j) = covarianza;
covarianza = mean((n2(i,:) - mean(n2(i,:))) * (n2(j,:) -
mean(n2(j,:)))'); end
MatrizCovarianzan2(i,j) = covarianza; end
[autovectoresn7,autovaloresn7] =
end autoEnOrden(MatrizCovarianzan7);
end
[autovectoresn2,autovaloresn2] =
autoEnOrden(MatrizCovarianzan2); MatrizCovarianzan8 = zeros(size(n8,1), size(n8,1));
for i = 1:size(n8,1)
MatrizCovarianzan3 = zeros(size(n3,1), size(n3,1)); for j = 1:size(n8,1)
for i = 1:size(n3,1) covarianza = mean((n8(i,:) - mean(n8(i,:))) * (n8(j,:) -
for j = 1:size(n3,1) mean(n8(j,:)))');
covarianza = mean((n3(i,:) - mean(n3(i,:))) * (n3(j,:) - MatrizCovarianzan8(i,j) = covarianza;
mean(n3(j,:)))');
MatrizCovarianzan3(i,j) = covarianza; end
end
end [autovectoresn8,autovaloresn8] =
end autoEnOrden(MatrizCovarianzan8);
[autovectoresn3,autovaloresn3] =
autoEnOrden(MatrizCovarianzan3); MatrizCovarianzan9 = zeros(size(n9,1), size(n9,1));
for i = 1:size(n9,1)
MatrizCovarianzan4 = zeros(size(n4,1), size(n4,1)); for j = 1:size(n9,1)
for i = 1:size(n4,1) covarianza = mean((n9(i,:) - mean(n9(i,:))) * (n9(j,:) -
for j = 1:size(n4,1) mean(n9(j,:)))');
covarianza = mean((n4(i,:) - mean(n4(i,:))) * (n4(j,:) - MatrizCovarianzan9(i,j) = covarianza;
mean(n4(j,:)))');
MatrizCovarianzan4(i,j) = covarianza; end
end
end [autovectoresn9,autovaloresn9] =
end autoEnOrden(MatrizCovarianzan9);
[autovectoresn4,autovaloresn4] =
autoEnOrden(MatrizCovarianzan4); %Cogemos el autovector que mas identifica a cada numero
autovectorn0 = autovectoresn0(:,1);
MatrizCovarianzan5 = zeros(size(n5,1), size(n5,1)); autovectorn1 = autovectoresn1(:,1);
for i = 1:size(n5,1) autovectorn2 = autovectoresn2(:,1);
for j = 1:size(n5,1) autovectorn3 = autovectoresn3(:,1);
covarianza = mean((n5(i,:) - mean(n5(i,:))) * (n5(j,:) - autovectorn4 = autovectoresn4(:,1);
mean(n5(j,:)))'); autovectorn5 = autovectoresn5(:,1);
autovectorn6 = autovectoresn6(:,1); numero = 0;
autovectorn7 = autovectoresn7(:,1); end
autovectorn8 = autovectoresn8(:,1);
autovectorn9 = autovectoresn9(:,1); %Del 1 con el numero introducido
correlacion =
for k = 1:10 %Este bucle indica el numero de veces que queremos mean(autovectortest'*test*n1'*autovectorn1)/sqrt(mean(autovector
probar el programa test'*test*test'*autovectortest)*mean(autovectorn1'*n1*n1'*autove
ctorn1));
%Pedimos al usuario que introduzca un numero
test = draw(11,20); if(correlacion > correlacionMayor)
%Normalizamos por filas tal como hemos hecho anteriormente correlacionMayor = correlacion;
test(1,:) = test(1,:)-mean(test(1,:)); numero = 1;
test(2,:) = test(2,:)-mean(test(2,:)); end

%Realizamos la matriz de covarianza para obtener sus %Del 2 con el numero introducido
autovectores y correlacion =
%autovalores mean(autovectortest'*test*n2'*autovectorn2)/sqrt(mean(autovector
MatrizCovarianzaTest = zeros(size(test,1), size(test,1)); test'*test*test'*autovectortest)*mean(autovectorn2'*n2*n2'*autove
for i = 1:size(test,1) ctorn2));
for j = 1:size(test,1)
covarianza = mean((test(i,:) - mean(test(i,:))) * (test(j,:) - if(correlacion > correlacionMayor)
mean(test(j,:)))'); correlacionMayor = correlacion;
MatrizCovarianzaTest(i,j) = covarianza; numero = 2;
end end
end
[autovectorestest,autovalorestest] = %Del 3 con el numero introducido
autoEnOrden(MatrizCovarianzaTest); correlacion =
mean(autovectortest'*test*n3'*autovectorn3)/sqrt(mean(autovector
%Obtenemos el autovector que mas identifica del numero test'*test*test'*autovectortest)*mean(autovectorn3'*n3*n3'*autove
introducido que se ctorn3));
%quiere averiguar
autovectortest = autovectorestest(:,1); if(correlacion > correlacionMayor)
correlacionMayor = correlacion;
numero = 3;
%CorrelacionMayor va a guardar la que actualmente es la mayor end
correlacion
%hasta el momento (puede que todavia no se haya hecho la %Del 4 con el numero introducido
correlacion con correlacion =
%todos los numeros) mean(autovectortest'*test*n4'*autovectorn4)/sqrt(mean(autovector
correlacionMayor = 0; test'*test*test'*autovectortest)*mean(autovectorn4'*n4*n4'*autove
%esta variable "numero" va a ser el numero que en ese momento ctorn4));
se cree que
%es el escrito if(correlacion > correlacionMayor)
numero = -1; correlacionMayor = correlacion;
numero = 4;
%Ahora, calculamos la correlacion entre el numero a identificar y end
los
%numeros que tenemos guardados. Si la correlacion que da es la %Del 5 con el numero introducido
mas alta correlacion =
%hsata el momento, se guarda y se cree que demomento es ese mean(autovectortest'*test*n5'*autovectorn5)/sqrt(mean(autovector
numero el test'*test*test'*autovectortest)*mean(autovectorn5'*n5*n5'*autove
%escrito ctorn5));

%Calculamos la correlacion segun la formula del manual if(correlacion > correlacionMayor)


correlacionMayor = correlacion;
%Del 0 con el numero introducido numero = 5;
correlacion = end
mean(autovectortest'*test*n0'*autovectorn0)/sqrt(mean(autovector
test'*test*test'*autovectortest)*mean(autovectorn0'*n0*n0'*autove %Del 6 con el numero introducido
ctorn0)); correlacion =
mean(autovectortest'*test*n6'*autovectorn6)/sqrt(mean(autovector
if(correlacion > correlacionMayor) test'*test*test'*autovectortest)*mean(autovectorn6'*n6*n6'*autove
correlacionMayor = correlacion; ctorn6));
if(correlacion > correlacionMayor)
correlacionMayor = correlacion;
numero = 6;
end

%Del 7 con el numero introducido


correlacion =
mean(autovectortest'*test*n7'*autovectorn7)/sqrt(mean(autovector
test'*test*test'*autovectortest)*mean(autovectorn7'*n7*n7'*autove
ctorn7));

if(correlacion > correlacionMayor)


correlacionMayor = correlacion;
numero = 7;
end

%Del 8 con el numero introducido


correlacion =
mean(autovectortest'*test*n8'*autovectorn8)/sqrt(mean(autovector
test'*test*test'*autovectortest)*mean(autovectorn8'*n8*n8'*autove
ctorn8));

if(correlacion > correlacionMayor)


correlacionMayor = correlacion;
numero = 8;
end

%Del 9 con el numero introducido


correlacion =
mean(autovectortest'*test*n9'*autovectorn9)/sqrt(mean(autovector
test'*test*test'*autovectortest)*mean(autovectorn9'*n9*n9'*autove
ctorn9));

if(correlacion > correlacionMayor)


correlacionMayor = correlacion;
numero = 9;
end
%Al final, imprimimos el numero que ha dado mayor correlacion.
numero
end

6. REFERENCES
[1] Blog de Fantini Fani Natali , estudiantes de Programador en
Sistemas administrativos http://ocr-
fantini.blogspot.com.es/2012/11/el-reconocimiento-optico-
de-caracteres.html

[2] OCR Javier Cano y Juan Carlos Pérez :


http://www.iti.es/media/about/docs/tic/02/2003-11-ocr.pdf

[3] OCR, Wikipedia


http://es.wikipedia.org/wiki/Reconocimiento_%C3%B3ptico
_de_caracteres

También podría gustarte