RECONOCIMIENTO DE TEXTOS: OCR Luis Martin-Cobos Blanco Ingenieria de Telecomunicaciones Universidad Carlos III de Madrid Av. De la Universidad, 30 28911 Leganés (Madrid) 100276565 [email protected]

RESUMEN En el presente artículo se describen las características principales del reconocimiento óptico de caracteres y se desarrolla al final un pequeño ejemplo de la aplicación de las mismas mediante el uso de CCA. Términos Generales Algorithms, Human Factors, Documentation . Palabras Clave OCR, redes neuronales, algoritmo knn, Matlab , Capchta, CCA.

1. INTRODUCCION El OCR (Optical Character Recognition) es una tecnología que trata de emular la capacidad del ojo humano para reconocer objetos. Concretamente es un software que permite el reconocimiento óptico de los caracteres contenidos en una imagen de forma que estos se vuelven comprensibles o reconocibles para un ordenador, obteniendo como resultado final un archivo en un formato de texto editable. El proceso básico que se lleva a cabo en el Reconocimiento Óptico de Caracteres es por tanto, convertir el texto que aparece 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 necesite. Este proceso se desarrolla en 4 fases que son: binarizacion, segmentación ,reducción de características o adelgazamiento y análisis.

Alberto Godino Martinez Ingenieria de Telecomunicaciones Universidad Carlos III de Madrid Av. De la Universidad, 30 28911 Leganés (Madrid) 100275692 [email protected]

existen algoritmos y aplicaciones más complejas y fiables. Algunos ejemplos de este reconocimiento de caracteres manuscritos los podremos encontrar en el sector bancario y postal por ejemplo:

2.1.1 Bancario Lectura de cheques de forma automática para la correcta transferencia de dinero. No obstante, a veces requiere una confirmación manual. Aun así, en general reduce los tiempos de espera en muchos bancos.

2.1.2 Servicios postales: En la actualidad, numerosas compañías dedicadas a todos aquellos relacionados con la entrega de cartas y paquetes utilizan este sistema para agilizar los trámites de reparto. Los sistemas de OCR son los encargados de leer, entre otros campos:



Direcciones: códigos postales, ciudad, calle, número.



Números de producto.



Indicaciones de cantidad.



Números de proveedores

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 los ámbitos. Entre ellas podríamos destacar las siguientes:

Figura 1. Reconocimiento de caracteres en el correo

2.1 Reconocimiento de texto manuscrito

2.2 Reconocimiento de matrículas

El reconocimiento de texto manuscrito sigue siendo uno de los principales desafíos para las aplicaciones de OCR. Cada vez

Podemos hacer mención a dos tipos de aplicaciones diferentes y bastante corrientes dentro de este campo:

2.3 Otras aplicaciones comunes 2.2.1 Radares Radares utilizados para controlar la velocidad en las carreteras. Deben recoger la matrícula de aquellos vehículos que hallan excedido un determinado limite, para después poder sancionar:El sistema usado actualmente es ANPR (Automatic number plate recognition) , el cual hace uso del reconocimiento óptico de caracteres (OCR) en las imágenes tomadas por las cámaras fotográficas.

Existen otra serie de aplicaciones cotidianas que hacen uso de OCR continuamente, y que resultan realmente valiosas. Que los documentos escaneados sean algo más que archivos de imagen, convirtiéndose en documentos sobre los que se pueden hacer búsquedas con contenido de texto, o el reconocimiento de los códigos de barras son un ejemplo de alguna de estas aplicaciones.

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.



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.

Figura 3. Digitalizacion del documento

2.4 OCR y capchta

Figura 2. Reconocimiento de caracteres en matricula de coches Como dato curioso cabe resaltar que en el año 2002 , se produjo el cambio en las matrículas de los vehículos holandeses y uno de los cambios que introdujeron las nuevas fue el de la fuente tipográfica de las mismas con el objetivo de permitir un mayor y mejor reconocimiento por parte de estas aplicaciones.

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 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 a una de las 2 palabras. Si acertamos esa, (nosotros realmente no sabemos cual ha podido identificar el OCR y cual no) seremos reconocidos como humanos y podremos seguir adelante. ¿Qué ocurre con la otra? Si 10 personas la reconocen como la misma 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 Con todo lo anterior, las técnicas de OCR son útiles para digitalizar textos (caracteres impresos) o formularios rellenados manualmente (caracteres manuscritos). Tanto en un caso como en el otro la manera de identificar los caracteres individuales de dichos documentos es mucho más sencillo que en el caso de texto manuscrito continuo, para el que es necesario la aplicación de técnicas de preproceso y segmentación más complejas que en el caso de OCR. Tomando como referencia por tanto, una de las aplicaciones mas comunes de OCR, la digitalización de documentos, la técnica para el reconocimiento de caracteres se basa en los siguientes pasos:

3.2 Segmentacion Para reconocer caracteres es necesaria, en primer lugar, su localización dentro del texto del documento. Existen tres magnitudes que determinan el orden de los caracteres dentro de un texto:   

los renglones de los que consta las palabras de un renglón las letras de una palabra.

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 5. Fases a seguir en OCR

Figura 7. Reconocimiento de caracteres en un documento: segmentacion

3.1 Binarizacion Tras las digitalización del documento en cuestión, a través de un escáner por ejemplo, y la separación previa en dicho documento de imágenes y texto, ya que ambos son entendidos por el ordenador como 0s y 1s, se procede a convertir la imagen digital en una imagen en blanco y negro preservando las propiedades esenciales .

3.2 Reducción de dimensiones y extracción de características Una vez acabado el proceso de segmentación tenemos una representación de cada carácter (obtenido tras la segmentación) 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 de información procesado. Para hacer una buena extracción de características, debe cumplirse que cada una tenga:    

Discriminación: Deben ser características que diferencien suficientemente una clase de otra. Deben tener igual valor para mismas clases. Independencia: Las características deben estar incorreladas unas de otras. Pequeño espacio para características: El número de características debe ser pequeño para la rapidez y facilidad de clasificación.

    

Encuentra la relación lineal más grande entre dos conjuntos de vectores de características. Es invariante con respecto al escalado. Los diferentes auto vectores dan soluciones incorreladas. CCA es simple y rápido. ICA es iterativo y puede dar diferentes soluciones en función de la pre asunción inicial. CCA considera el orden de las muestras (auto correlación) que es la medición real de señales e imágenes.

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 y por tanto sean fácilmente clasificables. Esta transformación permite reducir la dimensión del nuevo espacio sin perjudicar sensiblemente la capacidad discriminativa de la nueva representación. -LDA (Linear Discriminant Analysis): LDA y PCA son muy parecidos ya que ambos utilizan combinaciones lineales de variables para representar a los datos. En concreto, LDA modela la diferencia entre las clases de datos. -ICA (Independent Component Analysis): Este método consiste principalmente en obtener un conjunto de vectores lo mas independientes posible. -NDA (Non-linear Discriminant Analysis): NDA sigue la misma idea que LDA pero representa los datos mediante combinaciones no lineales. CCA (Canonical Correlation Analysis): -CCA Se trata de un modelo estadístico multivariante que facilita el estudio de interrelaciones entre conjuntos de variables dependientes y variables independientes. La correlación canónica predice simultáneamente múltiples variables dependientes de múltiples variables independientes. CCA pone menos 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 calidad y puede ser presentado de una manera más interpretable . Por esta razón , muchos investigadores consideran correlación canónica como un último esfuerzo , que se utilizará cuando el resto de técnicas superior es se hayan agotado. Sin embargo, en situaciones con múltiples variables dependientes e independientes, la correlación canónica es la técnica más adecuada y potente. Se ha ganado la aceptación en muchos campos y representa una herramienta útil para el análisis multi variable , especialmente cuando el interés de los investigadores se ha extendido a considerar múltiples variables dependientes. CCA se caracteriza por:

Figura 8. CCA Donde: - X es la matriz de características del caracter quiere identificar - Wx es el auto vector cuyo autovalor es el más la matriz de covarianza de X - Y es la matriz de características del caracter tiene guardado - Wy es el auto vector cuyo autovalor es el más la matriz de covarianza de Y

que se alto de que se alto de

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 realizar la binarización ni segmentación puesto que los datos no se van a obtener de ningún documento (van a ser introducidos por el usuario).

3.4 Analisis Una vez se tienen las características más importantes de la imagen a analizar hay que determinar el carácter correspondiente por medio de las técnicas de minería de datos que se explicarán a continuación.

3.4.1 Algoritmos de decision Una vez que se han obtenido sub imágenes en la que cada una contiene un carácter de la palabra a identificar, se pasa a clasificar cada imagen por separado (llamado identificar el pattern, es decir, la configuración de pixeles binarios que constituyen esa sub imagen). Puesto que es un sistema de inteligencia artificial, es necesario que el sistema OCR vaya aprendiendo de las sucesivas iteraciones para poder realizar cada vez la clasificación con mayor precisión.

Principalmente hay dos tipos de procesado que se pueden usar para la clasificación: - Template matching (simple) - Feature analysis (más sofisticado y por tanto más caro)

En el caso de KNN (K - Nearest Neighbour) es una clasificación de tipo supervisada y, por tanto, es necesario tener almacenado previamente los ejemplos de entrenamiento. Cuando se va a clasificar un nuevo objeto se extraen los objetos más parecidos y 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 En este caso, se necesitan en memoria una serie de modelos que corresponderán a cada carácter que se quiera identificar. Una vez que tengamos el carácter que queremos identificar, será necesario realizar la correlación entre este y todos los modelos que tenemos guardados en memoria. El modelo en memoria que presente mayor correlación será el que se cree como escrito. Si ninguno de los modelos obtiene una correlación suficiente, se dejara ese carácter como no clasificable. Si, por el contrario, se obtienen dos o más modelos con una correlación alta, estos modelos se pasan a la siguiente fase, el post-processing. En esta fase, se calcula la distancia Euclidea (fig.1) entre los modelos que han dado correlación alta y el carácter a identificar.

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 carácter determinado son los nodos del árbol y los resultados finales de los mismos pasaran a ser las hojas. Una vez construido el árbol, se puede tratar siguiendo la arquitectura de condiciones ( si se cumple la condición se realiza una acción y si no se cumple se realiza otra). En este tipo de clasificación es muy importante el orden de evaluación de los atributos del carácter que se quiere clasificar para alcanzar un ajuste óptimo del árbol. Para ello será necesario realizar una serie de funciones que evalúan los atributos y les da diferente importancia. Finalmente, las redes neuronales son un tipo de arquitectura que tratan de imitar la composición y funcionamiento del cerebro. 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 conjunto de elementos que son necesarios extraer no son muy altos y por tanto la fase de clasificación (mediante KNN, arboles de decisión o redes neuronales) puede hacerse bastante rápido.

3.4.1.3 Extracción de características 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.

3.5 La clasificación Como hemos comentado anteriormente, puede realizarse mediante KNN, arboles de decisión o redes neurales.

Figura 10. Red neuronal aplicada en OCR Cabe destacar, que si solo hubiera una capa oculta (single-layer), 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 podrán ser curvas.

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. Además, su eficiencia y efectividad es cada vez mayor, realizando 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 caligrafía de cada persona dificulta mucho la tarea de OCR ya sea tanto en cuanto al reconocimiento de cada carácter en si mismo como a la hora de separación de las palabras ,renglones,etc que conforman el documento.

5. ANEXO: IMPLEMENTACION DE UN CASO PRACTICO EN MATLAB Con el objetivo de poner en practica algunos de los conceptos explicados a lo largo del documento se ha realizado un pequeño código en Matlab que pretende procesar un número que el usuario “pinta ” por pantalla y reconocer de que numero verdaderamente se trata .La técnica CCA será la empleada: archivo "autoEnOrden.m" function [A, B] = autoEnOrden(M) % autoEnOrden Autovalores y autovectores ordenados % autoEnOrden(M) es una matriz cuyas columnas son los autovectores de M % ordenados en orden descendiente conforme al valor de sus % autovalores. % % % [A, B] = autoEnOrden(M) produce una matriz A con los autovectores y un % vector B con los correspondientes valores de autovalores de % Los autovalores y autovectores estan ordenados de forma que la % primera columa de A es el autovector correspondiente al % autovalor mayor y asi sucesivamente. % Los autovalores son ordenados con abs(e)

[V, D] = eig(M); % Calcula autovalores y autovectores V = fliplr(V); % invertimos el orden de los autovectores d = flipud(diag(D)); % extramos los autovalores e invertimos sus posiciones [foo, I] = sort(abs(d)); d = d(I); % ordenamos los autovalores invertidos en orden ascendente B = flipud(d); %restauramos los autovalores en orden descendiente for j = 1:length(I) A(:,j) = V(:,I(j)); % %ordenamos los autovectores invertidos en orden ascendiente end A = fliplr(A); %restauramos los autovectores guardados en orden descendiente

archivo "cca.m" %CCA close all %Primero, guardamos los numeros escritos por el usuario para despues hacer

%la correlacion con el que se quiera identificar. %Por tanto, pedimos al usuario que dibuje los numeros del 0 al 9 y se %guarda en las variables n0- n9 %Funcionamiento: %Aparecera una ventana con un recuadro blanco. En el, se puede escribir un %numero haciendo click izquierdo con el raton y arrastrando. Tambien se %puede escribir, soltar, empezar en otro sitio y seguir. (por ejemplo para %hacer el 7) %Cuando se haya terminado de escribir el numero y deberia aparecer una nueva ventana. Si no, darle a "Enter". %Para el correcto funcionamiento del programa, hay que meter los numeros %del 0 al 9 en ese orden. n0 = draw(1,20); n1 = draw(2,20); n2 = draw(3,20); n3 = draw(4,20); n4 = draw(5,20); n5 = draw(6,20); n6 = draw(7,20); n7 = draw(8,20); n8 = draw(9,20); n9 = draw(10,20); %Normalizamos las matrices que guardan los numeros del 0 al 9 por filas. n0(1,:) = n0(1,:)-mean(n0(1,:)); n0(2,:) = n0(2,:)-mean(n0(2,:)); n1(1,:) = n1(1,:)-mean(n1(1,:)); n1(2,:) = n1(2,:)-mean(n1(2,:)); n2(1,:) = n2(1,:)-mean(n2(1,:)); n2(2,:) = n2(2,:)-mean(n2(2,:)); n3(1,:) = n3(1,:)-mean(n3(1,:)); n3(2,:) = n3(2,:)-mean(n3(2,:)); n4(1,:) = n4(1,:)-mean(n4(1,:)); n4(2,:) = n4(2,:)-mean(n4(2,:)); n5(1,:) = n5(1,:)-mean(n5(1,:)); n5(2,:) = n5(2,:)-mean(n5(2,:)); n6(1,:) = n6(1,:)-mean(n6(1,:)); n6(2,:) = n6(2,:)-mean(n6(2,:)); n7(1,:) = n7(1,:)-mean(n7(1,:)); n7(2,:) = n7(2,:)-mean(n7(2,:)); n8(1,:) = n8(1,:)-mean(n8(1,:)); n8(2,:) = n8(2,:)-mean(n8(2,:)); n9(1,:) = n9(1,:)-mean(n9(1,:)); n9(2,:) = n9(2,:)-mean(n9(2,:));

%Siguiendo la formula descrita en el manual, vamos a calcular los %autovalores y autovectores de cada numero y para ello primero, hacemos la %matriz de covarianza MatrizCovarianzan0 = zeros(size(n0,1), size(n0,1)); %Se crea la matriz de covarianza for i = 1:size(n0,1) for j = 1:size(n0,1) covarianza = mean((n0(i,:) - mean(n0(i,:))) * (n0(j,:) mean(n0(j,:)))');

MatrizCovarianzan0(i,j) = covarianza; end end %Se calculan los autovalores y autovectores [autovectoresn0,autovaloresn0] = autoEnOrden(MatrizCovarianzan0); %Mismo paso anterior para todos los numeros MatrizCovarianzan1 = zeros(size(n1,1), size(n1,1)); for i = 1:size(n1,1) for j = 1:size(n1,1) covarianza = mean((n1(i,:) - mean(n1(i,:))) * (n1(j,:) mean(n1(j,:)))'); MatrizCovarianzan1(i,j) = covarianza; end end [autovectoresn1,autovaloresn1] = autoEnOrden(MatrizCovarianzan1); MatrizCovarianzan2 = zeros(size(n2,1), size(n2,1)); for i = 1:size(n2,1) for j = 1:size(n2,1) covarianza = mean((n2(i,:) - mean(n2(i,:))) * (n2(j,:) mean(n2(j,:)))'); MatrizCovarianzan2(i,j) = covarianza; end end [autovectoresn2,autovaloresn2] = autoEnOrden(MatrizCovarianzan2); MatrizCovarianzan3 = zeros(size(n3,1), size(n3,1)); for i = 1:size(n3,1) for j = 1:size(n3,1) covarianza = mean((n3(i,:) - mean(n3(i,:))) * (n3(j,:) mean(n3(j,:)))'); MatrizCovarianzan3(i,j) = covarianza; end end [autovectoresn3,autovaloresn3] = autoEnOrden(MatrizCovarianzan3); MatrizCovarianzan4 = zeros(size(n4,1), size(n4,1)); for i = 1:size(n4,1) for j = 1:size(n4,1) covarianza = mean((n4(i,:) - mean(n4(i,:))) * (n4(j,:) mean(n4(j,:)))'); MatrizCovarianzan4(i,j) = covarianza; end end [autovectoresn4,autovaloresn4] = autoEnOrden(MatrizCovarianzan4); MatrizCovarianzan5 = zeros(size(n5,1), size(n5,1)); for i = 1:size(n5,1) for j = 1:size(n5,1) covarianza = mean((n5(i,:) - mean(n5(i,:))) * (n5(j,:) mean(n5(j,:)))');

MatrizCovarianzan5(i,j) = covarianza; end end [autovectoresn5,autovaloresn5] = autoEnOrden(MatrizCovarianzan5); MatrizCovarianzan6 = zeros(size(n6,1), size(n6,1)); for i = 1:size(n6,1) for j = 1:size(n6,1) covarianza = mean((n6(i,:) - mean(n6(i,:))) * (n6(j,:) mean(n6(j,:)))'); MatrizCovarianzan6(i,j) = covarianza; end end [autovectoresn6,autovaloresn6] = autoEnOrden(MatrizCovarianzan6); MatrizCovarianzan7 = zeros(size(n7,1), size(n7,1)); for i = 1:size(n7,1) for j = 1:size(n7,1) covarianza = mean((n7(i,:) - mean(n7(i,:))) * (n7(j,:) mean(n7(j,:)))'); MatrizCovarianzan7(i,j) = covarianza; end end [autovectoresn7,autovaloresn7] = autoEnOrden(MatrizCovarianzan7);

MatrizCovarianzan8 = zeros(size(n8,1), size(n8,1)); for i = 1:size(n8,1) for j = 1:size(n8,1) covarianza = mean((n8(i,:) - mean(n8(i,:))) * (n8(j,:) mean(n8(j,:)))'); MatrizCovarianzan8(i,j) = covarianza; end end [autovectoresn8,autovaloresn8] = autoEnOrden(MatrizCovarianzan8); MatrizCovarianzan9 = zeros(size(n9,1), size(n9,1)); for i = 1:size(n9,1) for j = 1:size(n9,1) covarianza = mean((n9(i,:) - mean(n9(i,:))) * (n9(j,:) mean(n9(j,:)))'); MatrizCovarianzan9(i,j) = covarianza; end end [autovectoresn9,autovaloresn9] = autoEnOrden(MatrizCovarianzan9); %Cogemos el autovector que mas identifica a cada numero autovectorn0 = autovectoresn0(:,1); autovectorn1 = autovectoresn1(:,1); autovectorn2 = autovectoresn2(:,1); autovectorn3 = autovectoresn3(:,1); autovectorn4 = autovectoresn4(:,1); autovectorn5 = autovectoresn5(:,1);

autovectorn6 = autovectoresn6(:,1); autovectorn7 = autovectoresn7(:,1); autovectorn8 = autovectoresn8(:,1); autovectorn9 = autovectoresn9(:,1); for k = 1:10 %Este bucle indica el numero de veces que queremos probar el programa %Pedimos al usuario que introduzca un numero test = draw(11,20); %Normalizamos por filas tal como hemos hecho anteriormente test(1,:) = test(1,:)-mean(test(1,:)); test(2,:) = test(2,:)-mean(test(2,:)); %Realizamos la matriz de covarianza para obtener sus autovectores y %autovalores MatrizCovarianzaTest = zeros(size(test,1), size(test,1)); for i = 1:size(test,1) for j = 1:size(test,1) covarianza = mean((test(i,:) - mean(test(i,:))) * (test(j,:) mean(test(j,:)))'); MatrizCovarianzaTest(i,j) = covarianza; end end [autovectorestest,autovalorestest] = autoEnOrden(MatrizCovarianzaTest); %Obtenemos el autovector que mas identifica del numero introducido que se %quiere averiguar autovectortest = autovectorestest(:,1);

%CorrelacionMayor va a guardar la que actualmente es la mayor correlacion %hasta el momento (puede que todavia no se haya hecho la correlacion con %todos los numeros) correlacionMayor = 0; %esta variable "numero" va a ser el numero que en ese momento se cree que %es el escrito numero = -1; %Ahora, calculamos la correlacion entre el numero a identificar y los %numeros que tenemos guardados. Si la correlacion que da es la mas alta %hsata el momento, se guarda y se cree que demomento es ese numero el %escrito %Calculamos la correlacion segun la formula del manual %Del 0 con el numero introducido correlacion = mean(autovectortest'*test*n0'*autovectorn0)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn0'*n0*n0'*autove ctorn0)); if(correlacion > correlacionMayor) correlacionMayor = correlacion;

numero = 0; end %Del 1 con el numero introducido correlacion = mean(autovectortest'*test*n1'*autovectorn1)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn1'*n1*n1'*autove ctorn1)); if(correlacion > correlacionMayor) correlacionMayor = correlacion; numero = 1; end %Del 2 con el numero introducido correlacion = mean(autovectortest'*test*n2'*autovectorn2)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn2'*n2*n2'*autove ctorn2)); if(correlacion > correlacionMayor) correlacionMayor = correlacion; numero = 2; end %Del 3 con el numero introducido correlacion = mean(autovectortest'*test*n3'*autovectorn3)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn3'*n3*n3'*autove ctorn3)); if(correlacion > correlacionMayor) correlacionMayor = correlacion; numero = 3; end %Del 4 con el numero introducido correlacion = mean(autovectortest'*test*n4'*autovectorn4)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn4'*n4*n4'*autove ctorn4)); if(correlacion > correlacionMayor) correlacionMayor = correlacion; numero = 4; end %Del 5 con el numero introducido correlacion = mean(autovectortest'*test*n5'*autovectorn5)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn5'*n5*n5'*autove ctorn5)); if(correlacion > correlacionMayor) correlacionMayor = correlacion; numero = 5; end %Del 6 con el numero introducido correlacion = mean(autovectortest'*test*n6'*autovectorn6)/sqrt(mean(autovector test'*test*test'*autovectortest)*mean(autovectorn6'*n6*n6'*autove 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://ocrfantini.blogspot.com.es/2012/11/el-reconocimiento-opticode-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