Está en la página 1de 87

Inteligencia Artificial

Universidad Pontificia de Salamanca

RECONOCIMIENTO PTICO DE
CARACTERES (OCR)

MANUAL DE USUARIO

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

ndice
1. Presentacin............................................................................................................. 3
2. Proceso de ejecucin............................................................................................. 3
2.1. Abrir archivo.................................................................................................... 3
2.2. Ejecucin directa............................................................................................ 5
2.3. Ejecucin paso por paso .............................................................................. 6
2.3.1. Paso 1: Escala de grises ........................................................................... 7
2.3.2. Paso 2: Blanco y negro.............................................................................. 7
2.3.3. Paso 3: Cajas de texto............................................................................... 8
2.3.4. Paso 4: Conexin cajas de texto.............................................................. 8
2.3.5. Paso 5: Filtrado de cajas ........................................................................... 9
2.3.6. Paso 6: Decisin ......................................................................................... 9
2.4. Entrenamiento .............................................................................................. 10
2.4.1. Crear Red Neuronal ................................................................................. 10
2.4.2. Activar OCR............................................................................................... 10
2.4.3. Entrenar Red Neuronal............................................................................ 10
2.4.4. Grficos de Matlab ................................................................................... 11
2.5. Correccin..................................................................................................... 11
2.5.1. Texto Corregido ........................................................................................ 11
2.5.2. Botn Corregir ........................................................................................... 12
2.5.3. Grficos de Matlab ................................................................................... 12
2.6. Activacin final del OCR ............................................................................. 13
2.6.1. Activar OCR .......................................................................................... 13
3. Parmetros.............................................................................................................. 13
3.1. Funciones de activacin ............................................................................. 13
3.2. Tipo de entrenamiento ................................................................................ 14
3.3. Otros parmetros ......................................................................................... 14
4. ANEXO I: Cdigo fuente...................................................................................... 16

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

1. Presentacin
El Reconocedor ptico de Caracteres (de aqu en adelante OCR) presenta una
interfaz sencilla y de fcil utilizacin. Esta interfaz podra dividirse en tres secciones
claramente diferenciadas: la barra de herramientas y accesos directos; la zona de
visualizacin; y la zona de seleccin de parmetros.
El objetivo principal de esta aplicacin es obtener a partir de una imagen que contenga
texto obtener un documento de texto que sea modificable y legible por cualquier editor
de texto. Este procedimiento se lleva a cabo con una red neuronal a la que hay que
entrenar para que obtenga los resultados ms ptimos y por otra parte, resultados
esperados.

2. Proceso de ejecucin
2.1. Abrir archivo
Para comenzar la ejecucin y procesamiento del OCR se abre un archivo de
imagen. Para ello la aplicacin ofrece dos mecanismos: acceso directo y acceso
mediante men. El primero, el ms rpido, se procede pulsando el primero de los
botones visibles en la barra de herramientas.

El segundo, mediante men: Fichero/Abrir fichero.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

En ambos procedimientos aparecer una clsica ventana de bsqueda de archivos


donde se selecciona el archivo deseado:

El archivo seleccionado anteriormente se abrir en una ventana donde se mostrar


la imagen:

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.2.

Ejecucin directa

El siguiente proceso a llevar acabo es ejecutar la preparacin de la imagen. Si se


elige la ejecucin directa no se mostrar los distintos pasos por los que va
pasando la imagen. Para ello la aplicacin ofrece dos mecanismos: acceso directo
y acceso mediante men. El primero, el ms rpido, se procede pulsando uno de
los botones visibles en la barra de herramientas.

El segundo, mediante men: Aplicacin/Ejecucin completa.

El resultado final de este proceso se obtiene en una ventana cuyo nombre ser
Resultado Final de igual forma que la primera imagen a la que denominamos
Imagen Original.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.3.

Ejecucin paso por paso

El siguiente proceso a llevar acabo es ejecutar la preparacin de la imagen. Si se


elige la ejecucin paso por paso se irn mostrando los distintos pasos por los que
va pasando la imagen. Para ello la aplicacin ofrece dos mecanismos: acceso
directo y acceso mediante men. El primero, el ms rpido, se procede pulsando
uno de los botones visibles en la barra de herramientas.

El segundo, mediante men: Aplicacin/Ejecucin paso a paso.

Para ir ejecutando los distintos pasos del proceso tambin ofrece dos mecanismos:
acceso directo y acceso mediante men. El primero, el ms rpido, se procede
pulsando uno de los botones visibles en la barra de herramientas.

El segundo, mediante men: Aplicacin/Siguiente paso.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.3.1. Paso 1: Escala de grises


El primer paso consiste en transformar la imagen a una imagen en escala de
grises.

2.3.2. Paso 2: Blanco y negro


El segundo paso consiste en transformar la imagen a una imagen en blanco y
negro.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.3.3. Paso 3: Cajas de texto


El tercer paso divide cada palabra en caracteres separndolos mediante cajas de
texto.

2.3.4. Paso 4: Conexin cajas de texto


En el cuarto paso se unen las cajas de texto.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.3.5. Paso 5: Filtrado de cajas


En el quinto paso se filtran las cajas.

2.3.6. Paso 6: Decisin


Por ltimo se obtiene el resultado final.

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.4.

Entrenamiento

2.4.1. Crear Red Neuronal


Una vez que la imagen est preparada para ser procesada se crea la red neuronal.

2.4.2. Activar OCR


Se activa el OCR para obtener el resultado inicial, es decir, lo que la red neuronal
en este punto obtiene metindole como entrada la imagen preparada. Si el
resultado no es el adecuada habr que proceder a entrenarla.

El resultado aparece en el cuadro de texto de la derecha.

2.4.3. Entrenar Red Neuronal


Si el resultado no es el adecuado se entrenar la red neuronal:

10

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.4.4. Grficos de Matlab


Al entrenar la red aparecer un grfico de Matlab, en el que aparece el proceso
que se sigue, as como otros datos de inters como son el Goal o las Epochs. El
primer parmetro identifica el mximo error que se puede obtener que en este
caso es de un 0,001 y el segundo parmetro representa el numero de veces que
se va a entrenar la red.

2.5.

Correccin

Para completar el entrenamiento hay que introducir la palabra correcta para que la
red la contenga y en prximas iteraciones realice correctamente la identificacin.

2.5.1. Texto Corregido


El texto corregido se introducir en maysculas.

11

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.5.2. Botn Corregir


Despus de introducir el texto se pulsa el botn Corregir.

2.5.3. Grficos de Matlab


Matlab mostrar un grfico como el que a continuacin se muestra por cada uno
de los caracteres que se quiere entrenar.

12

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

2.6. Activacin final del OCR


2.6.1. Activar OCR
Finalmente, cuando la red neuronal ya est entrenada se procede a activar
nuevamente el OCR para comprobar que obtiene la salida correcta.

3. Parmetros
3.1. Funciones de activacin
La aplicacin permite seleccionar las distintas funciones de activacin que se van a
utilizar en cada una de las tres capas de neuronas que tiene la red neuronal.

Las distintas opciones son:


- Purelin:

13

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

Tansig: tangente sigmoidal hiperblica

Logsig:

3.2.

Tipo de entrenamiento

Traingdx: entrenamiento de retropropagacin de gradiente descendente con


momento y tasa de aprendizaje adaptativa.
Traingda: entrenamiento de retropropagacin de gradiente descendente con tasa
de aprendizaje adaptativa.
Traingd: entrenamiento de retropropagacin de gradiente descendente.

3.3.

Otros parmetros

Se pueden seleccionar otros parmetros referentes a la red neuronal.

14

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

3.3.1. Learning rates: rangos de aprendizaje.


3.3.2. Goal: error deseado.
3.3.3. Bias: para simplificar el sistema de entrenamiento, el valor umbral (U) pasa
a expresarse como un peso sinptico ms (-W0), est asociado a una neurona
siempre activa (X0). Esta neurona siempre activa, se denomina bias.
3.3.4. LW: capa de pesos entre la capa oculta y la capa de salida.
3.3.5. Momentum: el factor que se aade a los incrementos de pesos para evitar
que la convergencia haca el objetivo puede ser muy lenta.
3.3.6. Iterations: el nmero de epochs.

15

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

4. ANEXO I: Cdigo fuente


4.1.1. Interfaz principal:
Es la interfaz principal de la aplicacin.

/*
* NewJFrame.java
*
* Created on 8 de mayo de 2007, 17:35
*/
import java.awt.image.ImageFilter;
import javax.swing.filechooser.FileFilter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.io.IOException;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

javax.swing.ImageIcon;
javax.swing.JButton;
javax.swing.JDesktopPane;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JInternalFrame;
javax.swing.JLabel;
javax.swing.JLayeredPane;
javax.swing.JMenu;
javax.swing.JMenuBar;
javax.swing.JMenuItem;
javax.swing.JOptionPane;
javax.swing.JScrollPane;
javax.swing.JTextField;
javax.swing.JToolBar;
java.awt.BorderLayout;
jmatlink.*;

import javax.swing.JFrame;
import
import
import
import
import

javax.swing.JPanel;
javax.swing.*;
java.awt.Label;
java.awt.*;
java.awt.event.ActionEvent;

16

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

import java.awt.event.ActionListener;
import javax.imageio.*;
import java.awt.Graphics;
import java.awt.Canvas;
import java.awt.image.MemoryImageSource;
import java.util.*;
/**
*
* @author Alberto
*/
public class NewJFrame extends javax.swing.JFrame {
private JDesktopPane jdp = new JDesktopPane();
/** Creates new form NewJFrame */
private ImageIcon imageHelp =
new ImageIcon(NewJFrame.class.getResource("help.gif"));
private ImageIcon imageClose =
new ImageIcon(NewJFrame.class.getResource("save1.gif"));
private ImageIcon imageOpen =
new
ImageIcon(NewJFrame.class.getResource("abrirFichero1.gif"));
private ImageIcon imageCompleta =
new
ImageIcon(NewJFrame.class.getResource("completa.gif"));
private ImageIcon imagePasoAPaso =
new
ImageIcon(NewJFrame.class.getResource("pasoAPaso.gif"));
private ImageIcon imageSiguiente =
new
ImageIcon(NewJFrame.class.getResource("siguientePaso.gif"));
private Image imagenOriginal;
Vector centradas;
JPanel jPanel2 = new JPanel();
JLabel jLabel6 = new JLabel();
JLabel jLabel7 = new JLabel();
JPanel pnlImagenOriginal = new JPanel();
JPanel pnlSeparados = new JPanel();
JLabel jLabel8 = new JLabel();
JPanel jPanel3 = new JPanel();
JLabel jLabel9 = new JLabel();
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JLabel jLabel4 = new JLabel();
JLabel jLabel5 = new JLabel();
JButton btnCrear = new JButton();
JButton btnEntrenar = new JButton();
JPanel jPanel4 = new JPanel();
JLabel jLabel10 = new JLabel();
JPanel pnlEncuadrada = new JPanel();
JPanel pnlSinMarco = new JPanel();
JPanel jPanel5 = new JPanel();
17

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

JLabel jLabel11 = new JLabel();


control controlador;
Vector cortados;
JPanel jPanel6 = new JPanel();
JLabel jLabel12 = new JLabel();
JLabel jLabel13 = new JLabel();
JLabel jLabel14 = new JLabel();
JLabel jLabel15 = new JLabel();
JLabel jLabel16 = new JLabel();
JLabel jLabel17 = new JLabel();
JLabel jLabel18 = new JLabel();
JLabel jLabel19 = new JLabel();
JLabel jLabel20 = new JLabel();
JLabel jLabel21 = new JLabel();
JButton btnCorregir = new JButton();
private JButton buttonHelp = new JButton();
private JButton buttonClose = new JButton();
private JButton buttonOpen = new JButton();
private JButton buttonCompleta = new JButton();
private JButton buttonPasoAPaso = new JButton();
private JButton buttonSiguiente = new JButton();
private JLabel statusBar = new JLabel();
private JMenuItem menuHelpAbout = new JMenuItem();
private JMenuItem menuFileExit = new JMenuItem();
private JMenuItem menuAbrirFichero = new JMenuItem();
private JMenu menuFile = new JMenu();
private
private
JMenuItem();
private
private
private

JMenuItem menuEjecucionCompleta = new JMenuItem();


JMenuItem menuEjecucionPasoAPaso = new
JMenuItem menuSiguientePaso = new JMenuItem();
JMenuItem menuHistogramaMarcas = new JMenuItem();
JMenu menuAplicacion = new JMenu();

private JMenuItem menuOpciones = new JMenuItem();


private JMenu menuConfiguracion = new JMenu();
private JMenu menuHelp = new JMenu();
private JMenuBar menuBar = new JMenuBar();
private BorderLayout layoutMain = new BorderLayout();
private JFileChooser fc = new JFileChooser();
private JInternalFrame interno;
private JInternalFrame interno2;
private JTextField jTextField1 = new JTextField();
18

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

private JTextField jTextField2 = new JTextField();


private JTextField jTextField3 = new JTextField();

private ControlPrograma analizador = new


ControlPrograma();
private String nombreRuta = "";
int altura,anchura;
/*************************************************************
********************************************
**/
public NewJFrame() {
initComponents();
this.setJMenuBar(menuBar);
this.getContentPane().setLayout(layoutMain);
this.setSize(new Dimension(600, 600));
this.setTitle("Identificacin de Areas de Texto");
menuFile.setText("Ficheros");
txtGoal.setText("0.001");
menuAbrirFichero.setText("Abrir fichero");
menuAbrirFichero.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
abrirFichero_actionPerformed(ae);
}
});
menuFileExit.setText("Salir");
menuFileExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
fileExit_ActionPerformed(ae);
}
});
menuAplicacion.setText("Aplicacion");
menuEjecucionCompleta.setText("Ejecucion completa");
menuEjecucionCompleta.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionCompleta();
menuHistogramaMarcas.setEnabled(true);
}
});
19

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

menuEjecucionCompleta.setEnabled(false);
buttonCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setText("Ejecucion paso a paso");
menuEjecucionPasoAPaso.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionPasoAPaso();
menuEjecucionCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setEnabled(false);
menuSiguientePaso.setEnabled(true);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setEnabled(true);
}
});
menuEjecucionPasoAPaso.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
menuSiguientePaso.setText("Siguiente paso...");
menuSiguientePaso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
ejecucionPasoAPaso();
if(analizador.getPasoActual() == 6)
{
menuEjecucionCompleta.setEnabled(true);
menuEjecucionPasoAPaso.setEnabled(true);
menuSiguientePaso.setEnabled(false);
buttonCompleta.setEnabled(true);
buttonPasoAPaso.setEnabled(true);
buttonSiguiente.setEnabled(false);
}
else if (analizador.getPasoActual()==3)
{
menuHistogramaMarcas.setEnabled(true);
}
}
});
menuSiguientePaso.setEnabled(false);
buttonSiguiente.setEnabled(false);
menuHistogramaMarcas.setText("Obtener histograma de las
cajas");
menuHistogramaMarcas.addActionListener(new ActionListener()
20

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{
public void actionPerformed(ActionEvent ae)
{
interno2=analizador.PintarHistogramaMarcas();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
});
menuHistogramaMarcas.setEnabled(false);
menuConfiguracion.setText("Configuracion");
menuOpciones.setText("Opciones");
menuOpciones.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
obtenerMenuOpciones();
}
});

menuHelp.setText("Ayuda");
menuHelpAbout.setText("Acerca de");
menuHelpAbout.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
helpAbout_ActionPerformed(ae);
}
});

statusBar.setText("");
buttonOpen.setToolTipText("Abrir Fichero");
buttonOpen.setIcon(imageOpen);
buttonOpen.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
abrirFichero_actionPerformed(ae);
}
});
buttonClose.setToolTipText("Cerrar Fichero");
buttonClose.setIcon(imageClose);
buttonCompleta.setToolTipText("Ejecucion Completa");
buttonCompleta.setIcon(imageCompleta);
buttonCompleta.addActionListener(new ActionListener()
21

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionCompleta();
menuHistogramaMarcas.setEnabled(true);
}
});
menuEjecucionCompleta.setEnabled(false);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setToolTipText("Ejecucion Paso A Paso");
buttonPasoAPaso.setIcon(imagePasoAPaso);
buttonPasoAPaso.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
inicializa();
ejecucionPasoAPaso();
menuEjecucionCompleta.setEnabled(false);
menuEjecucionPasoAPaso.setEnabled(false);
menuSiguientePaso.setEnabled(true);
buttonCompleta.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setEnabled(true);
}
});
menuEjecucionPasoAPaso.setEnabled(false);
buttonPasoAPaso.setEnabled(false);
buttonSiguiente.setToolTipText("Siguiente Paso");
buttonSiguiente.setIcon(imageSiguiente);
buttonSiguiente.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
ejecucionPasoAPaso();
if(analizador.getPasoActual() == 6)
{
menuEjecucionCompleta.setEnabled(true);
menuEjecucionPasoAPaso.setEnabled(true);
menuSiguientePaso.setEnabled(false);
buttonCompleta.setEnabled(true);
buttonPasoAPaso.setEnabled(true);
buttonSiguiente.setEnabled(false);
}
else if (analizador.getPasoActual()==3)
{
menuHistogramaMarcas.setEnabled(true);
}
}
22

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

});
menuSiguientePaso.setEnabled(false);
buttonSiguiente.setEnabled(false);
buttonHelp.setToolTipText("Acerca de");
buttonHelp.setIcon(imageHelp);
buttonHelp.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
helpAbout_ActionPerformed(ae);
}
});
menuFile.add(menuAbrirFichero);
//menuFile.add(menuGuardarFichero);
//menuFile.add(menuCerrarFichero);
menuFile.addSeparator();
menuFile.add(menuFileExit);
menuBar.add(menuFile);
menuAplicacion.add(menuEjecucionCompleta);
menuAplicacion.add(menuEjecucionPasoAPaso);
menuAplicacion.addSeparator();
menuAplicacion.add(menuSiguientePaso);
menuAplicacion.add(menuHistogramaMarcas);
menuBar.add(menuAplicacion);
menuConfiguracion.add(menuOpciones);
menuBar.add(menuConfiguracion);
menuHelp.add(menuHelpAbout);
menuBar.add(menuHelp);
this.getContentPane().add(statusBar, BorderLayout.SOUTH);
toolBar.add(buttonOpen);
toolBar.add(buttonClose);
toolBar.add(buttonCompleta);
toolBar.add(buttonPasoAPaso);
toolBar.add(buttonSiguiente);
toolBar.add(buttonHelp);
toolBar.add(ActivarOCR);
toolBar.add(jButton4);
//toolBar.setSize(buttonCompleta.getSize());
this.getContentPane().add(toolBar, BorderLayout.NORTH);
this.getContentPane().add(jPanel1, BorderLayout.SOUTH);
this.getContentPane().add(jdp);

23

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

jPanel2.add(jLabel21);
jPanel2.add(jLabel8);

// <editor-fold defaultstate="collapsed" desc="


Generated Code ">
private void initComponents() {
jFrame1 = new javax.swing.JFrame();
jTextField7 = new javax.swing.JTextField();
toolBar = new javax.swing.JToolBar();
ActivarOCR = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
panel1 = new java.awt.Panel();
jPanel1 = new javax.swing.JPanel();
jTextField9 = new javax.swing.JTextField();
jTextField8 = new javax.swing.JTextField();
txtNeuronas2 = new javax.swing.JTextField();
txtNeuronas = new javax.swing.JTextField();
cmbCentro = new javax.swing.JComboBox();
jTextField4 = new javax.swing.JTextField();
jTextField5 = new javax.swing.JTextField();
cmbIzquierda = new javax.swing.JComboBox();
jTextField6 = new javax.swing.JTextField();
cmbDerecha = new javax.swing.JComboBox();
cmbEntrenamiento = new javax.swing.JComboBox();
jButton1 = new javax.swing.JButton();
jTextField10 = new javax.swing.JTextField();
jTextField11 = new javax.swing.JTextField();
jTextField12 = new javax.swing.JTextField();
jTextField13 = new javax.swing.JTextField();
jTextField14 = new javax.swing.JTextField();
jTextField15 = new javax.swing.JTextField();
jTextField16 = new javax.swing.JTextField();
txtLR = new javax.swing.JTextField();
txtGoal = new javax.swing.JTextField();
txtBiass = new javax.swing.JTextField();
txtIteraciones = new javax.swing.JTextField();
txtLW = new javax.swing.JTextField();
txtMomentum = new javax.swing.JTextField();
jButton2 = new javax.swing.JButton();
jTextField17 = new javax.swing.JTextField();
txtCorreccion = new javax.swing.JTextField();
jTextField18 = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
24

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

txt = new javax.swing.JTextArea();


jMenuBar1 = new javax.swing.JMenuBar();
org.jdesktop.layout.GroupLayout jFrame1Layout =
new
org.jdesktop.layout.GroupLayout(jFrame1.getContentPane());
jFrame1.getContentPane().setLayout(jFrame1Layout);
jFrame1Layout.setHorizontalGroup(
jFrame1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 504, Short.MAX_VALUE)
);
jFrame1Layout.setVerticalGroup(
jFrame1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 179, Short.MAX_VALUE)
);
jTextField7.setText("Tipo de entrenamiento");
setDefaultCloseOperation(
javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBackground(new java.awt.Color(255, 204, 102));
ActivarOCR.setText("Activar OCR");
ActivarOCR.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
activarOcr(evt);
}
});
toolBar.add(ActivarOCR);
jButton4.setText("Correccion");
jButton4.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
correcion(evt);
}
});
toolBar.add(jButton4);
org.jdesktop.layout.GroupLayout panel1Layout =
new org.jdesktop.layout.GroupLayout(panel1);
panel1.setLayout(panel1Layout);
panel1Layout.setHorizontalGroup(
panel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 0, Short.MAX_VALUE)
25

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

);
panel1Layout.setVerticalGroup(
panel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(0, 0, Short.MAX_VALUE)
);
jPanel1.setBackground(new java.awt.Color(255, 204, 51));
jPanel1.setBorder
(javax.swing.BorderFactory.createBevelBorder(javax.
swing.border.BevelBorder.RAISED));
jTextField9.setBackground(new java.awt.Color(255, 204,
51));
jTextField9.setEditable(false);
jTextField9.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField9.setText("Numero de neronas 2\u00aa Capa");
jTextField9.setBorder(null);
jTextField8.setBackground(new java.awt.Color(255, 204,
51));
jTextField8.setEditable(false);
jTextField8.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField8.setText("Numero de neronas 1\u00aa Capa");
jTextField8.setBorder(null);
txtNeuronas2.setText("17");
txtNeuronas.setText("50");
cmbCentro.setModel(new javax.swing.DefaultComboBoxModel
(new String[] { "purelin", "tansig", "logsig" }));
jTextField4.setBackground(new java.awt.Color(255, 204,
51));
jTextField4.setEditable(false);
jTextField4.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField4.setText("1\u00aa Capa");
jTextField4.setBorder(null);
jTextField5.setBackground(new java.awt.Color(255, 204,
51));
jTextField5.setEditable(false);
jTextField5.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField5.setText("2\u00aa Capa");
jTextField5.setBorder(null);
cmbIzquierda.setModel(new
javax.swing.DefaultComboBoxModel
(new String[] { "tansig", "logsig", "purelin" }));
jTextField6.setBackground(new java.awt.Color(255, 204,
26

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

51));
jTextField6.setEditable(false);
jTextField6.setFont(new java.awt.Font("Tahoma", 1, 11));
jTextField6.setText("3\u00aa Capa");
jTextField6.setBorder(null);
cmbDerecha.setModel(new javax.swing.DefaultComboBoxModel
(new String[] { "purelin", "tansig", "logsig" }));
cmbEntrenamiento.setModel(new
javax.swing.DefaultComboBoxModel
(new String[] { "traingdx", "traingda", "traingd" }));
jButton1.setFont(new java.awt.Font("Tahoma", 1, 11));
jButton1.setText("Crear red Neuronal");
jButton1.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
crearRedNeuronal(evt);
}
});
jTextField10.setBackground(new java.awt.Color(255, 204,
51));
jTextField10.setEditable(false);
jTextField10.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField10.setText("Tipo de entrenamiento");
jTextField10.setBorder(null);
jTextField11.setBackground(new
java.awt.Color(255, 204, 51));
jTextField11.setEditable(false);
jTextField11.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField11.setText("Learning rates");
jTextField11.setBorder(null);
jTextField12.setBackground(new java.awt.Color(255, 204,
51));
jTextField12.setEditable(false);
jTextField12.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField12.setText("Goal");
jTextField12.setBorder(null);
jTextField13.setBackground(new java.awt.Color(255, 204,
51));
jTextField13.setEditable(false);
jTextField13.setFont(new java.awt.Font("Tahoma", 1,
27

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

11));
jTextField13.setText("Iterations");
jTextField13.setBorder(null);
jTextField14.setBackground(new java.awt.Color(255, 204,
51));
jTextField14.setEditable(false);
jTextField14.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField14.setText("Biass");
jTextField14.setBorder(null);
jTextField15.setBackground(new java.awt.Color(255, 204,
51));
jTextField15.setEditable(false);
jTextField15.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField15.setText("LW");
jTextField15.setBorder(null);
jTextField16.setBackground(new java.awt.Color(255, 204,
51));
jTextField16.setEditable(false);
jTextField16.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField16.setText("Momentum");
jTextField16.setBorder(null);
txtLR.setText("0.9");
txtGoal.setText("0.001");
txtBiass.setText("0.01");
txtIteraciones.setText("2000");
txtLW.setText("0.01");
txtMomentum.setText("0.2");
jButton2.setFont(new java.awt.Font("Tahoma", 1, 11));
jButton2.setText("Entrenar red Neuronal");
jButton2.addMouseListener(new
java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent
evt) {
entrenarRedNeuronal(evt);
}
});
jTextField17.setBackground(new java.awt.Color(102, 102,
28

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

102));
jTextField17.setEditable(false);
jTextField18.setBackground(new java.awt.Color(255, 204,
51));
jTextField18.setEditable(false);
jTextField18.setFont(new java.awt.Font("Tahoma", 1,
11));
jTextField18.setText("Texto Correccion");
jTextField18.setBorder(null);
org.jdesktop.layout.GroupLayout jPanel1Layout =
new org.jdesktop.layout.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING, false)
.add
(cmbEntrenamiento, 0,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
Short.MAX_VALUE)
.add(jTextField10,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
130,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(53, 53, 53)
.add(
jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.TRAILING)
.add
(jPanel1Layout.createSequentialGroup()
.add(jTextField8,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
204, Short.MAX_VALUE)
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtNeuronas,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
38, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.createSequentialGroup()
.add(jTextField9,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 205,
Short.MAX_VALUE)
.addPreferredGap(
29

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtNeuronas2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 37,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(44, 44, 44)
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(20, 20, 20)
.add(jTextField4,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(61, 61, 61)
.add(jTextField5,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.
createSequentialGroup()
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbCentro,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 109,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbIzquierda,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(jPanel1Layout.
createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.
createSequentialGroup()
.add(17, 17, 17)
.add(jTextField6,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(jPanel1Layout.createSequentialGroup()
.addPreferredGap
(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbDerecha,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
110, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(28, 28, 28))
.add(jPanel1Layout.createSequentialGroup()
.add(4, 4, 4)
.add(jTextField18,
30

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 105,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtCorreccion,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 171,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 383,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)))
.add(jTextField17,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(48, 48, 48)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jTextField11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 94,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(org.jdesktop.layout.GroupLayout.LEADING, jTextField14)
.add(org.jdesktop.layout.GroupLayout.LEADING, jTextField12,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 61,
Short.MAX_VALUE)))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED, 46, Short.MAX_VALUE)
.add(jPanel1Layout.createParallelGroup
(org.jdesktop.layout.GroupLayout.LEADING)
.add(txtGoal,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 48,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLR,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 48,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtBiass,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 49,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(57, 57, 57)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING, false)
.add(jTextField15)
.add(jTextField16,
31

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 76,
Short.MAX_VALUE)
.add(jTextField13))
.add(22, 22, 22)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING, false)
.add(txtMomentum,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 44,
Short.MAX_VALUE)
.add(txtIteraciones)
.add(txtLW)))
.add(jPanel1Layout.createSequentialGroup()
.add(10, 10, 10)
.add(jButton2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 252,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED, 126,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(jPanel1Layout.createSequentialGroup()
.addContainerGap()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField4,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField5,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField6,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField10,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField8,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
32

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

.add(txtNeuronas,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(cmbEntrenamiento,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField9,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtNeuronas2,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbCentro,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbIzquierda,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbDerecha,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(15, 15, 15)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField18,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jButton1)
.add(txtCorreccion,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(jPanel1Layout.createSequentialGroup()
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(jTextField15,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
33

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

.add(jTextField11,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLR,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtLW,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(txtMomentum,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtGoal,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField12,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField16,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jPanel1Layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.BASELINE)
.add(txtIteraciones,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 19,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtBiass,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField14,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jTextField13,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
34

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jButton2)))
.addContainerGap(
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.add(jTextField17,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 109,
Short.MAX_VALUE)
);
txt.setBackground(new java.awt.Color(204, 204, 204));
txt.setColumns(20);
txt.setFont(new java.awt.Font("Comic Sans MS", 0, 13));
txt.setRows(5);
jScrollPane1.setViewportView(txt);
setJMenuBar(jMenuBar1);
org.jdesktop.layout.GroupLayout layout = new
org.jdesktop.layout.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING,
layout.createSequentialGroup()
.addContainerGap(2986, Short.MAX_VALUE)
.add(panel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(534, 534, 534))
.add(layout.createSequentialGroup()
.add(toolBar,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 651,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(
org.jdesktop.layout.LayoutStyle.RELATED)
.add(jScrollPane1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 649,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(2214, Short.MAX_VALUE))
.add(layout.createSequentialGroup()
.add(377, 377, 377)
.add(jPanel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(1838, Short.MAX_VALUE))
);
layout.setVerticalGroup(
35

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(
org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(toolBar,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 39,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(layout.createSequentialGroup()
.add(39, 39, 39)
.add(jScrollPane1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 567,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(80, 80, 80)
.add(jPanel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(121, 121, 121)
.add(panel1,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE,
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE,
org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addContainerGap(
org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
private void correcion(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
controlador.correccion(txtCorreccion.getText(),
analizador.ObtenerCajas(),analizador.numero);
}
private void activarOcr(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
CORTADOS
txt.setText(controlador.reconocimiento(
analizador.ObtenerCajas()));
}
private void entrenarRedNeuronal(java.awt.event.MouseEvent
evt) {
// TODO add your handling code here:
controlador.entrenamiento(txtGoal.getText(),
txtIteraciones.getText(),txtLR.getText(),txtMomentum.getText(),
txtBiass.getText(),txtLW.getText());
}
36

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

private void crearRedNeuronal(java.awt.event.MouseEvent evt)


{
// TODO add your handling code here:

controlador=new control();
controlador.creacion((String)cmbEntrenamiento.
getSelectedItem
(),
(String)cmbDerecha.getSelectedItem(),(String)
cmbCentro.getSelectedItem(),(String)cmbIzquierda.getSelectedItem
(),txtNeuronas.getText(),txtNeuronas2.getText());
}

void fileExit_ActionPerformed(ActionEvent e)
{
System.exit(0);
}
void helpAbout_ActionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(this,
new Frame1_AboutBoxPanel1(), "Acerca de",
JOptionPane.PLAIN_MESSAGE);
}

private void inicializa()


{
analizador.inicializa();
}
protected static ImageIcon createImageIcon(String
path,String description)
{
if (path != null) {
return new ImageIcon(path, description);
}else{
System.err.println("Couldn't find file: " + path);
37

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

return null;
}
}
private void ejecucionCompleta()
{
interno2=analizador.ejecucionCompleta();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
private void ejecucionPasoAPaso()
{
interno2=analizador.ejecucionPasoAPaso();
jdp.add(interno2);
jdp.moveToFront(interno2);
}
private void obtenerMenuOpciones()
{
JLabel jLabel1 = new JLabel();
JLabel jLabel2 = new JLabel();
JLabel jLabel3 = new JLabel();
JButton jButton1 = new JButton();
JButton jButton2 = new JButton();
interno = new JInternalFrame("
Opciones",false,false,false,false);
interno.setSize(300,200);
interno.setLocation(100,100);
interno.setVisible(true);
interno.setFrameIcon(null);
interno.setResizable(false);
interno.setMaximizable(false);
JDesktopPane jdpInt = new JDesktopPane();
jdpInt.setSize(300,200);
jdpInt.setBackground(new Color(128,128,128));
jLabel1.setBounds(25, 75, 81, 20);
jLabel1.setText(" Iteraciones");
jLabel2.setBounds(25, 100, 120, 20);
jLabel2.setText(" Factor de Correcion");
jLabel3.setBounds(25, 50, 130, 20);
jLabel3.setText(" Factor de Aceptacion");
jTextField1.setBounds(190, 50, 45, 20);
jTextField1.setText(Double.toString(
analizador.getfAceptacion()));
jTextField2.setBounds(190, 75, 45, 20);
38

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

jTextField2.setText(Integer.toString(
analizador.getnumIteraciones()));
jTextField3.setBounds(190, 100, 45, 20);
jTextField3.setText(Double.toString(
analizador.getmodUnificacion()));
jButton1.setBounds(30, 140, 90, 20);
jButton1.setText("Aceptar");
jButton2.setBounds(140, 140, 90, 20);
jButton2.setText("Cancelar");
jdpInt.add(jLabel1);
jdpInt.add(jLabel2);
jdpInt.add(jLabel3);
jdpInt.add(jTextField1);
jdpInt.add(jTextField2);
jdpInt.add(jTextField3);
jdpInt.add(jButton1);
jdpInt.add(jButton2);
interno.getContentPane().add(jdpInt);
jdp.add(interno);
jdp.setLayer(interno,JLayeredPane.POPUP_LAYER.intValue());
jButton1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
analizador.setfAceptacion(
Double.parseDouble(jTextField1.getText()));
analizador.setnumIteraciones(
Integer.parseInt(jTextField2.getText()));
analizador.setmodUnificacion(
Double.parseDouble(jTextField3.getText()));
try {
interno.setClosed(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
});
jButton2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
try {
interno.setClosed(true);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
39

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

}
});

public void abrirFichero_actionPerformed(ActionEvent e)


{
JLabel jLabel1=new JLabel();
ImageFilter filtro=new ImageFilter();

int returnVal = fc.showOpenDialog(this);


if (returnVal == JFileChooser.APPROVE_OPTION)
{
File file = fc.getSelectedFile();
try
{
nombreRuta = file.getCanonicalPath();
}
catch (IOException e1)
{
e1.printStackTrace();
}
ImageIcon icon = createImageIcon(nombreRuta,"
Imagen Original");
imagenOriginal = icon.getImage();
altura = imagenOriginal.getHeight(null);
anchura = imagenOriginal.getWidth(null);
analizador.setImagen(imagenOriginal);
menuEjecucionCompleta.setEnabled(true);
menuEjecucionPasoAPaso.setEnabled(true);
menuSiguientePaso.setEnabled(false);
menuHistogramaMarcas.setEnabled(false);
buttonCompleta.setEnabled(true);
buttonPasoAPaso.setEnabled(true);
buttonSiguiente.setEnabled(false);
jLabel1.setIcon(icon);
FrameInterno frame1=new FrameInterno(altura,
anchura,6);
frame1.getContentPane().add(new
JScrollPane(jLabel1),
BorderLayout.CENTER);
jdp.add(frame1);
jdp.moveToFront(frame1);
}
40

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
public void btnCrear_actionPerformed(ActionEvent e) {
controlador=new control();
controlador.creacion((String)cmbEntrenamiento.
getSelectedItem(),
(String)cmbDerecha.getSelectedItem(),(String)cmbCentro.
getSelectedItem(),(String)cmbIzquierda.getSelectedItem(),
txtNeuronas.getText(),txtNeuronas2.getText());
}

public void btnReconocer_actionPerformed(ActionEvent e) {


//txtMatricula.setText(controlador.reconocimiento(
cortados));
}
public void btnCorregir_actionPerformed(ActionEvent e) {
controlador.correccion(txtCorreccion.getText(),analizador.
ObtenerCajas(),analizador.numero);
}
// Variables declaration - do not modify
private javax.swing.JButton ActivarOCR;
private javax.swing.JComboBox cmbCentro;
private javax.swing.JComboBox cmbDerecha;
private javax.swing.JComboBox cmbEntrenamiento;
private javax.swing.JComboBox cmbIzquierda;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton4;
private javax.swing.JFrame jFrame1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
41

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

private javax.swing.JTextField jTextField10;


private javax.swing.JTextField jTextField11;
private javax.swing.JTextField jTextField12;
private javax.swing.JTextField jTextField13;
private javax.swing.JTextField jTextField14;
private javax.swing.JTextField jTextField15;
private javax.swing.JTextField jTextField16;
private javax.swing.JTextField jTextField17;
private javax.swing.JTextField jTextField18;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;
private javax.swing.JTextField jTextField7;
private javax.swing.JTextField jTextField8;
private javax.swing.JTextField jTextField9;
private java.awt.Panel panel1;
private javax.swing.JToolBar toolBar;
private javax.swing.JTextArea txt;
private javax.swing.JTextField txtBiass;
private javax.swing.JTextField txtCorreccion;
private javax.swing.JTextField txtGoal;
private javax.swing.JTextField txtIteraciones;
private javax.swing.JTextField txtLR;
private javax.swing.JTextField txtLW;
private javax.swing.JTextField txtMomentum;
private javax.swing.JTextField txtNeuronas;
private javax.swing.JTextField txtNeuronas2;
// End of variables declaration
}

4.1.2. Interfaz secundario:


Interfaz secundaria en la que aparecen todos los resultados que se van obteniendo.

import javax.swing.JInternalFrame;
public class FrameInterno extends JInternalFrame
{
static int openFrameCount = 0;
static int xOffset = 30, yOffset = 30;
private static String[] titulosFrame= {"Paso1:I.Escala de
Grises","Paso2:I. Blanco y Negro","Paso3:Cajas de
Texto","Paso4:Conexion Cajas de Texto","Paso5:Filtrado de
Cajas","Paso6:Decision","Imagen Original","Resutaldo
Final","Histograma de marcas"};
public FrameInterno(int altura,int anchura,int pasoActual)
{

42

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

super(titulosFrame[pasoActual], true, true, true,


true);
openFrameCount++;
setResizable(false);
if (altura>400)
{
altura=400;
setResizable(true);
}
if (anchura>400)
{
anchura=400;
setResizable(true);
}
setSize(anchura+10,altura+35);
setLocation(xOffset, yOffset);
xOffset += 30;
yOffset += 30;
setVisible(true);
if(xOffset > 500)
{
xOffset = 30;
yOffset = 30;
}
}
}

4.1.3. Preparacin de la imagen:


a. Gestin de la preparacin:
Gestiona la preparacin de la imagen a tratar. Llama desde aqu a todas las clases
que irn modificando la imagen original.

import
import
import
import
import
import
import
import
import
import
import
import

java.awt.BorderLayout;
java.awt.Color;
java.awt.Container;
java.awt.Graphics2D;
java.awt.Image;
java.awt.MediaTracker;
java.awt.image.BufferedImage;
java.awt.image.FilteredImageSource;
java.awt.image.ImageObserver;
java.awt.image.PixelGrabber;
java.util.ArrayList;
java.util.Iterator;

import javax.swing.ImageIcon;
import javax.swing.JInternalFrame;

43

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

import javax.swing.JLabel;
import javax.swing.JScrollPane;
import java.io.*;

public class ControlPrograma


{
private Container contenedor = new Container();
private Image imagenOriginal;
private Image imagenGrises;
private Image imagenbn;
private Image imagenResultado;
private int[][] matrizImagen;
private int[][] matrizBinaria;
private IdentificacionDeMarcas idMarcas;
private ArrayList todosRectangulos;
private ArrayList textos = new ArrayList();
private ArrayList imagenes = new ArrayList();
private ArrayList porAnalizar = new ArrayList();
private int altura,anchura;
private int pasoActual=0;
private String nombreRuta = "";
private double fAceptacion=3.5;
private double modUnificacion=2;
private int numIteraciones=10;
int numero;

public ControlPrograma()
{
inicializa();
}
public void setImagen(Image imagenTratar)
{
imagenOriginal=imagenTratar;
altura = imagenOriginal.getHeight(null);
anchura = imagenOriginal.getWidth(null);
inicializa();
}

public void inicializa()


{
imagenGrises = null;
imagenbn = null;
imagenResultado = null;
matrizImagen = null;
matrizBinaria = null;
idMarcas = null;
44

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

pasoActual = 0;
textos = new ArrayList();
porAnalizar = new ArrayList();
todosRectangulos = new ArrayList();
imagenes = new ArrayList();
}
protected static ImageIcon createImageIcon(String
path,String description)
{
if (path != null)
{
return new ImageIcon(path, description);
}
else
{
System.err.println("Couldn't find file: " + path);
return null;
}
}
/*
* Funcion utilizada para realizar una ejecucion directa
del algoritmo, una vez cargada una imagen
* Una vez terminada la ejecucin del mismo devuelve una
referencia a una ventana que contiene
* la imagen resultante del algoritmo
* Consume menos recursos que la ejecucion paso a paso
*/
public JInternalFrame ejecucionCompleta()
{
aplicaFiltroDeColor();
aplicaFiltroBlancoYNegro();
matrizImagen=null;
ObtenerCajas();
ObtenerMarcas();
filtroDeRectangulos(todosRectangulos);
analisisRectangulos();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,textos,Color.GREEN);
PintarCajas(gbn,imagenes,Color.RED);
imagenResultado=(Image) imagenconbuffer;
FrameInterno frame2=new FrameInterno(altura,anchura,7);
JLabel jLabel = new JLabel();
45

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

ImageIcon iconSalida = new ImageIcon(imagenResultado,


"Imagen de salida");
jLabel.setIcon(iconSalida);
frame2.getContentPane().add(new JScrollPane(jLabel),
BorderLayout.CENTER);
return (JInternalFrame) frame2;
}
/*
* Funcion que permite realizar una ejecucion paso a paso,
consume mas recursos que la
* funcin anterior, pero muestra una ventana de resultado
por cada paso principal del
* algoritmo.
*/
public JInternalFrame ejecucionPasoAPaso()
{
Image imagenAPintar;
if (pasoActual==0)
{
aplicaFiltroDeColor();
imagenAPintar=imagenGrises;
}
else if(pasoActual==1)
{
aplicaFiltroBlancoYNegro();
matrizImagen=null;
imagenAPintar=imagenbn;
}
else if(pasoActual==2)
{
ArrayList cajasAPintar=ObtenerCajas();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,cajasAPintar,Color.BLUE);
imagenAPintar=(Image)imagenconbuffer;
}
else if(pasoActual==3)
{
ObtenerMarcas();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,todosRectangulos,Color.BLUE);
imagenAPintar=(Image)imagenconbuffer;
}
46

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

else if(pasoActual==4)
{
filtroDeRectangulos(todosRectangulos);
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,porAnalizar,Color.BLUE);
imagenAPintar=(Image)imagenconbuffer;
}
else
{
analisisRectangulos();
BufferedImage imagenconbuffer = new
BufferedImage(imagenbn.getWidth(null),imagenbn.getHeight
(null),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.drawImage(imagenbn,null,null);
PintarCajas(gbn,textos,Color.GREEN);
PintarCajas(gbn,imagenes,Color.RED);
imagenResultado=(Image) imagenconbuffer;
imagenAPintar=imagenResultado;
}
FrameInterno frame2= new FrameInterno(altura,anchura,
pasoActual);
JLabel jLabel = new JLabel();
ImageIcon iconSalida = new ImageIcon(imagenAPintar,
"TXT");
jLabel.setIcon(iconSalida);
frame2.getContentPane().add(new JScrollPane(jLabel),
BorderLayout.CENTER);
pasoActual++;
return (JInternalFrame)frame2;
}
/*
* Convierte una imagen en color en una imagen en escala de
grises
*/
private void aplicaFiltroDeColor()
{
FiltroDeColor filtroGrises = new FiltroDeColor();
imagenGrises = contenedor.createImage(new
FilteredImageSource(imagenOriginal.getSource(),filtroGrises));
MediaTracker tracker=new MediaTracker(contenedor);
tracker.addImage(imagenGrises, 0);
try
47

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{
tracker.waitForID(0);
}
catch (InterruptedException e)
{
System.out.println("ERROR convirtiendo la
imagen");
}
matrizImagen = aMatriz(imagenGrises);
}
/*
* Conmvierte una imagen en escala de grises en una imagen
en Blanco y nego
*/
private void aplicaFiltroBlancoYNegro()
{
int fcorte;
BinarizadorImagenes binarizador;
fcorte=procesarHistograma(matrizImagen);
FiltroBlancoNegro filtrobn = new FiltroBlancoNegro
(fcorte);
imagenbn = contenedor.createImage(new
FilteredImageSource(imagenGrises.getSource(),filtrobn));
MediaTracker tracker=new MediaTracker(contenedor);
tracker.addImage(imagenbn, 1);
try
{
tracker.waitForID(1);
}
catch (InterruptedException e)
{
System.out.println("ERROR convirtiendo la
imagen");
}
binarizador = new BinarizadorImagenes(matrizImagen,
fcorte);
matrizBinaria = binarizador.getMatrizBinaria();

}
/*
* Obtencion de las cajas(que rodean a cada componente conexa)
de una matriz
*/
public ArrayList ObtenerCajas()
{
idMarcas = new IdentificacionDeMarcas(matrizBinaria);
numero=idMarcas.numero;
48

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

return idMarcas.obtenerCajas();
}
/*
* Analisis de las cajas previamente obtenidas, permite
obtener aquellos rectangulos
* que unifican con sus vecinos (solo son devueltos los mas
frecuentes)
*/
private void ObtenerMarcas()
{
idMarcas.setMaxIteracion(numIteraciones);
idMarcas.setModUnificacion(modUnificacion);
idMarcas.analizarCajas();
todosRectangulos = idMarcas.obtenerRectangulos();
}
/*
* Funcion que decide que rectangulos son imagen y cuales
son texto en funcion
* de sus texturas
*/
private void analisisRectangulos()
{
Caja recActual;
IdentificacionDeTexto txtAnalizer= new
IdentificacionDeTexto
(matrizBinaria);
Iterator it=porAnalizar.iterator();
while(it.hasNext())
{
recActual = (Caja) it.next();
if (txtAnalizer.analizarCaja(recActual))
{
textos.add(recActual);
//System.out.println("nueva linea");
}
else
{
imagenes.add(recActual);
}
}
}
/*
* Permite dibujar las cajas de decision en una imagen
*/
private void PintarCajas(Graphics2D gbn,ArrayList porDibujar,
Color color)
49

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{
int i=0;
gbn.setColor(color);
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(i==1)
gbn.setColor(color);
else
gbn.setColor(Color.GREEN);
gbn.drawRect(recActual.getOrigenX(),
recActual.getOrigenY(),
recActual.getAnchura(),recActual.getAltura());
i++;
}
}
/*
* Funcion que tras haber obtenido las marcas de una imagen
permite mostrar el histograma
*/
public JInternalFrame PintarHistogramaMarcas()
{
int[] hist=idMarcas.generarHistogramaCajas();
int maxHist=0,longitudHist=0;
double log10=Math.log(10);
for (int i=0;i<hist.length;i++)
{
if (hist[i]>maxHist)
{
maxHist=hist[i];
}
if (hist[i]>1)
{
longitudHist=i+1;
}
}
BufferedImage imagenconbuffer = new
BufferedImage(longitudHist*20+100,(int)(50*Math.log(maxHist)
+100),5);
Graphics2D gbn = (imagenconbuffer).createGraphics();
gbn.setColor(Color.WHITE);
gbn.fillRect(0,0,longitudHist*20+100,(int)(50*Math.log
(maxHist)+100));
gbn.setColor(Color.BLACK);
char[] cad=new char[6];
for(int i=0;i<=Math.ceil(Math.log(maxHist)/Math.log(10));
50

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

i+=1)
{
int j;
cad[0]='1';
for(j=1;j<=i;j++)
{
cad[j]='0';
}
gbn.drawChars(cad,0,j,10,300-i*50);
}

for (int i=0;i<longitudHist;i++)


{
//System.out.println("hist["+i+"]="+hist[i]);
gbn.fillRect(40+i*20,300(int)(50*(Math.log(hist[i])/log10)),20,(int)((50*Math.log(
hist[i]))/log10));
}
gbn.drawRect(40,50,longitudHist*20+20,250);
FrameInterno frame2= new FrameInterno(400,400,8);
JLabel jLabel = new JLabel();
ImageIcon iconSalida = new ImageIcon(imagenconbuffer,
"TXT");
jLabel.setIcon(iconSalida);
frame2.getContentPane().add(new
JScrollPane(jLabel),BorderLayout.CENTER);
return (JInternalFrame)frame2;
}
/*
* Conversin de una imagen en una matriz
*/
private int[][] aMatriz(Image imagen)
{
int h = imagen.getHeight(null);
int w = imagen.getWidth(null);
int[] pixels = new int[w * h];
int[][] matrizPixel = new int [h][w];
PixelGrabber pg = new PixelGrabber(imagen,0, 0,w,h,
pixels, 0,w);
try
{
pg.grabPixels();
}
catch (InterruptedException e)
{
System.err.println("interrupted waiting for
pixels!");
}
51

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

if ((pg.getStatus() & ImageObserver.ABORT) != 0)


{
System.err.println("image fetch aborted or
errored");
}
for (int j = 0; j < h ; j++)
{
for (int i = 0; i < w; i++)
{
int paso = pixels[j*w+i];
matrizPixel[j][i] = paso;
}
}
return matrizPixel;
}
/*
* Analisis del histograma de una imagen en tonos de grises,
permite obtener un tono
* adecuado para la binarizacion de la misma
*/
private int procesarHistograma(int[][] imagen)
{
int i,j,numpixels=0,altura,anchura;
int[] histograma=new int[256];
altura = imagen.length;
anchura = imagen[0].length;
for(i=0;i<altura;i++)
{
for(j=0;j<anchura;j++)
{
numpixels++;
histograma[(imagen[i][j]&0xff)]++;
}
}
i=0;
j=0;
while (j<numpixels/2)
{
j+=histograma[i];
i++;
}
if (i>240 || i<15)i=128;
//para los valores extremos mejor devolvemos el centro
//es muy posible que sean textos sobre fondo claro o
viceversa
//Asi reducimos el ruido.
return i;
}
/*
52

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

* Filtra los rectangulos que tenemos en funcion de su


relacion altura:longitud
*/
private void filtroDeRectangulos(ArrayList rectangulos)
{
imagenes=idMarcas.obtenerNoAceptadosPorFrecuencias();
Iterator it = rectangulos.iterator();
while(it.hasNext())
{
Caja actual = (Caja) it.next();
if ( (double) actual.getAltura()*fAceptacion <
(double)actual.getAnchura())
{
porAnalizar.add(actual);
}
else
{
imagenes.add(actual);
}
}
}
/*Funciones modificadoras y observadoras adicionales*/
public int getPasoActual()
{
return pasoActual;
}
public double getfAceptacion()
{
return fAceptacion;
}
public void setfAceptacion(double fa)
{
fAceptacion=fa;
}
public int getnumIteraciones()
{
return numIteraciones;
}
public void setnumIteraciones(int numIteraciones)
{
this.numIteraciones=numIteraciones;
}
public double getmodUnificacion()
{
return modUnificacion;
53

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

}
public void setmodUnificacion(double modUnificacion)
{
this.modUnificacion=modUnificacion;
}
}
b. Binarizacin de la imagen:
Obtiene la imagen original.

public class BinarizadorImagenes


{
private int[][] matrizPixels;
private int[][] matrizBinaria;
int frecCorte;
public BinarizadorImagenes(int[][] matriz,int frecCorte)
{
this.matrizPixels = matriz;
this.frecCorte = frecCorte;
binarizaMatriz();
matrizPixels=null;
}
private void binarizaMatriz()
{
int altura = matrizPixels.length;
int anchura = matrizPixels[0].length;
matrizBinaria = new int[altura][anchura];
for(int i=0;i<altura;i++)
{
for(int j=0;j<anchura;j++)
{
if((matrizPixels[i][j]&0xff)<frecCorte)
{
matrizBinaria[i][j]=1;
}
else
{
matrizBinaria[i][j]=0;
}
}
}
}
public int[][] getMatrizBinaria()
{

54

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

return matrizBinaria;
}
}
c. Filtro blanco y negro: filtroBlancoNegro
Pasa la imagen a escala de grises.

import java.awt.image.RGBImageFilter;
public class FiltroBlancoNegro extends RGBImageFilter
{
private int frecCorte;
public FiltroBlancoNegro(int frecCorte)
{
canFilterIndexColorModel = true;
this.frecCorte = frecCorte;
}
public int filterRGB(int x, int y, int rgb)
{
int rojo = (rgb & 0xff0000)/(0x10000);
int verde = (rgb & 0xff00)/(0x100);
int azul = (rgb & 0xff);
int salida;
if(azul<frecCorte)
salida=0;
else
salida=255;
salida = salida + (salida * 0x100) + (salida *
0x10000) + (rgb & 0xff000000);
//System.out.println("Rojo : "+rojo+" Verde: "+verde+" Azul
: "+azul+" Salida:"+salida);
return salida;
}
}

d. Filtro color:
Obtener la imgen en blanco y negro.

import java.awt.image.RGBImageFilter;
public class FiltroDeColor extends RGBImageFilter{

55

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

public FiltroDeColor()
{
canFilterIndexColorModel = true;
}
public int filterRGB(int x, int y, int rgb)
{
int rojo = (rgb & 0xff0000)/(0x10000);
int verde = (rgb & 0xff00)/(0x100);
int azul = (rgb & 0xff);
int salida = (int) (rojo*0.299 + azul*0.114 +
verde*0.587);
salida = salida + (salida * 0x100) + (salida *
0x10000) + (rgb & 0xff000000);
//System.out.println("Rojo : "+rojo+" Verde: "+verde+" Azul
: "+azul+" Salida:"+salida);
return salida;
}
}

e. Identificacin de marcas:
Muestra las cajas con los caracteres obtenidos dentro de cada caja.

import
import
import
import
import
import
import
import
import
import
import

java.awt.image.ImageFilter;
javax.swing.filechooser.FileFilter;
java.awt.BorderLayout;
java.awt.Color;
java.awt.Dimension;
java.awt.Image;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.beans.PropertyVetoException;
java.io.File;
java.io.IOException;

import
import
import
import
import
import
import
import
import
import
import
import

javax.swing.ImageIcon;
javax.swing.JButton;
javax.swing.JDesktopPane;
javax.swing.JFileChooser;
javax.swing.JFrame;
javax.swing.JInternalFrame;
javax.swing.JLabel;
javax.swing.JLayeredPane;
javax.swing.JMenu;
javax.swing.JMenuBar;
javax.swing.JMenuItem;
javax.swing.JOptionPane;

56

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.*;
import java.awt.Label;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.imageio.*;
import java.awt.Graphics;
import java.awt.Canvas;
import java.awt.image.MemoryImageSource;
import java.util.*;
import javax.swing.*;
public class IdentificacionDeMarcas
{
private int[][] matrizOrigen;
private ArrayList cajas;
private ArrayList rectangulos;
private boolean[][] matrizBusqueda;
private int[] histogramaCajas;
private int alturaMaxima=0;
private int picoActual;
private double modUnificacion=2;
private int maxIteracion=10;
int altura;
int anchura;
int numero;
public IdentificacionDeMarcas(int[][] origen)
{
this.matrizOrigen = origen;
this.altura = matrizOrigen.length;
this.anchura = matrizOrigen[0].length;
picoActual = 0;
cajas = new ArrayList();
rectangulos= new ArrayList();
matrizBusqueda = new boolean[altura][anchura];
recorreMatriz();
}
private void recorreMatriz()
{
57

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

int i,j;
int altura = matrizOrigen.length;
int anchura = matrizOrigen[0].length;
Caja actual;
int suma=0;
int posi=0;
for(i=0;i<altura;i++)
for(j=0;j<anchura;j++)
matrizBusqueda[i][j] = false;
for(i=0;i<altura;i++)
{
for(j=0;j<anchura;j++)
{
if(matrizBusqueda[i][j] == false)
{
matrizBusqueda[i][j] = true;
if(matrizOrigen[i][j] == 1)
{
actual = obtenerComponenteConexa
(i,j);
if
(actual.getAltura()+1>alturaMaxima)
{
alturaMaxima=
actual.getAltura
()+1;
}
//solo aadimos las de tamao por
lo menos 3*3
if (actual.getAltura()>1)
{
cajas.add(actual);

numero++;
actual.relleno();
if(actual.getOrigenX()<suma){
actual.tieneRenglon();
suma=0;
}
if((actual.getOrigenX()-suma)>=5){
actual.tieneEspacio();
58

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

System.out.println("espacio"+actual.getOrigenX()+" ancho
"+actual.getAnchura()+
"suma="+(actual.getOrigenX()+actual.getAnchura()));
suma=(actual.getOrigenX()+actual.getAnchura());
//
actual.imprimir();
//
actual.impresion();
}
}
}
}
}
}
private Caja obtenerComponenteConexa(int i,int j)
{
int maxI=i,maxJ=j,minI=i,minJ=j;
Stack porRecorrer = new Stack();
//int altura = matrizOrigen.length;
//int anchura = matrizOrigen[0].length;
int[] elem={i,j};
porRecorrer.push(elem);
ArrayList visitados=new ArrayList();
while(!porRecorrer.isEmpty() )
{
elem = (int[])porRecorrer.pop();
porRecorrer.removeElement(elem);
int elem0 = (int)(new
Integer(elem[0]).intValue());
int elem1 = (int)(new
Integer(elem[1]).intValue());
//VERIFICACION NINGUN PIXEL SE TRATA 2 VECES
//System.out.println("Pto: "+elem0+", "+elem1);
/* Iterator it4=visitados.iterator();
int[] elemN=new int[2];
while(it4.hasNext())
{
elem = (int[])it4.next();
int elemN0 = (int)(new
Integer(elemN[0]).intValue());
int elemN1 = (int)(new
59

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

Integer(elemN[1]).intValue());
if (elem0==elemN0 && elem1==elemN1)
{
System.out.println("VISITAMOS 2 veces
el mismo");
}
}
visitados.add(elem);
*/
//Primero las de arriba
if(elem0-1 > 0)
{
if(!matrizBusqueda[elem0-1][elem1])
{
if(matrizOrigen[elem0-1][elem1] == 1)
{
int[] elemNuevo3 = new int[2];
elemNuevo3[0] = elem0-1;
elemNuevo3[1] = elem1;
porRecorrer.push(elemNuevo3);
}
matrizBusqueda[elem0-1][elem1]=true;
}
}
if(elem0-1 > 0 && elem1-1>0)
{
if(!matrizBusqueda[elem0-1][elem1-1])
{
if(matrizOrigen[elem0-1][elem1-1] ==
1)
{
int[] elemNuevo7 = new int[2];
elemNuevo7[0] = elem0-1;
elemNuevo7[1] = elem1-1;
porRecorrer.push(elemNuevo7);
}
matrizBusqueda[elem0-1][elem1-1]=true;
}
}

if(elem0-1>0 && elem1+1 < anchura)


{
if(!matrizBusqueda[elem0-1][elem1+1])
{
if(matrizOrigen[elem0-1][elem1+1] ==
1)
{
int[] elemNuevo6 = new int[2];
60

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

elemNuevo6[0] = elem0-1;
elemNuevo6[1] = elem1+1;
porRecorrer.push(elemNuevo6);
}
matrizBusqueda[elem0-1][elem1+1]=true;
}
}
//Acontinuacion los de Abajo
if(elem0+1 < altura)
{
if(!matrizBusqueda[elem0+1][elem1])
{
if(matrizOrigen[elem0+1][elem1] == 1)
{
int[] elemNuevo1 = new int[2];
elemNuevo1[0] = elem0+1;
elemNuevo1[1] = elem1;
porRecorrer.push(elemNuevo1);
}
matrizBusqueda[elem0+1][elem1]=true;
}
}
if(elem0+1 < altura && elem1-1 > 0)
{
if(!matrizBusqueda[elem0+1][elem1-1])
{
if(matrizOrigen[elem0+1][elem1-1] ==
1)
{
int[] elemNuevo8 = new int[2];
elemNuevo8[0] = elem0+1;
elemNuevo8[1] = elem1-1;
porRecorrer.push(elemNuevo8);
}
matrizBusqueda[elem0+1][elem1-1]=
true;
}
}

if(elem0+1 < altura && elem1+1 <anchura)


{
if(!matrizBusqueda[elem0+1][elem1+1])
{
if(matrizOrigen[elem0+1][elem1+1] ==
1)
{
int[] elemNuevo5 = new int[2];
elemNuevo5[0] = elem0+1;
61

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

elemNuevo5[1] = elem1+1;
porRecorrer.push(elemNuevo5);
}
matrizBusqueda[elem0+1][elem1+1]=true;
}
}
//Por ultimo los de su mismo nivel
if(elem1+1 < anchura)
{
if(!matrizBusqueda[elem0][elem1+1])
{
if(matrizOrigen[elem0][elem1+1] ==
1)
{
int[] elemNuevo2 = new int[2];
elemNuevo2[0] = elem0;
elemNuevo2[1] = elem1+1;
porRecorrer.push(elemNuevo2);
}
matrizBusqueda[elem0][elem1+1]=true;
}
}
if(elem1-1 > 0)
{
if(!matrizBusqueda[elem0][elem1-1])
{
if(matrizOrigen[elem0][elem1-1] == 1)
{
int[] elemNuevo4 = new int[2];
elemNuevo4[0] = elem0;
elemNuevo4[1] = elem1-1;
porRecorrer.push(elemNuevo4);
}
matrizBusqueda[elem0][elem1-1]=true;
}
}
if(elem0<minI)
minI = elem0;
if(elem0>maxI)
maxI = elem0;
if(elem1<minJ)
minJ = elem1;
if(elem1>maxJ)
maxJ = elem1;
}
int altoc=(maxI-minI);
int anchoc=(maxJ-minJ);
int variableauxiliar=0;
62

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

double mimatriz[][]=new double[altoc][anchoc];


double mimatriz2[][]=new
double[altoc*anchoc][1];
int imagen[][][];
for (int a = 0; a < altoc; a++) {
for (int b = 0; b < anchoc; b++) {
//mimatriz[variableauxiliar++] =
matrizOrigen[a][b];
mimatriz2[variableauxiliar++][0]=(double)matrizOrigen[minI+a]
[minJ+b];
mimatriz[a][b]=(double)matrizOrigen[minI+a][minJ+b];;
//System.out.print(mimatriz2
[a][b]);

}
// System.out.println("");
}

return new Caja(minJ,minI,maxJ-minJ,maxIminI,mimatriz);


}
public ArrayList obtenerCajas()
{
return cajas;
}
public void setMaxIteracion(int maxI)
{
maxIteracion=maxI;
}
public void setModUnificacion(double mU)
{
modUnificacion=mU;
}
public void analizarCajas()
{
int iteracion = 0;
Caja cajaActual;
generarHistogramaCajas();
obtenerPicoMaximo();
//Voy a realizar solo una iteracion como
63

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

prueba
while( iteracion <maxIteracion &&
histogramaCajas[picoActual] != 0)
{
//System.out.println("Juntando cajas con pico:
"+picoActual);
histogramaCajas[picoActual] = 0;
Iterator it = cajas.iterator();
while(it.hasNext())
{
cajaActual = (Caja) it.next();
if(!cajaActual.getUnificada() &&
cajaActual.getAltura() == picoActual)
realizaUnificacionCajas(cajaActual);
}
iteracion++;
obtenerPicoMaximo();
}
}
public int[] generarHistogramaCajas()
{
Caja actual;
histogramaCajas=new int[alturaMaxima];
Iterator recorreCajas = cajas.iterator();
while (recorreCajas.hasNext())
{
actual = (Caja) recorreCajas.next();
histogramaCajas[actual.getAltura()] +=1;
}
return histogramaCajas;
}
private void obtenerPicoMaximo()
{
int i;
for(i=0;i<alturaMaxima;i++)
{
if(histogramaCajas[i]>histogramaCajas[picoActual])
{
picoActual = i;
}
}
}
private void realizaUnificacionCajas(Caja cajaInicio)
{
int h1,h2,h3,origenInferior,origenSuperior;
64

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

ArrayList cajasEnLinea = new ArrayList();


boolean algunUnificado = true;
int numUnificados=1;
int inicioX = cajaInicio.getOrigenX();
int inicioY = cajaInicio.getOrigenY();
int inicioAltura = cajaInicio.getAltura();
int inicioAnchura = cajaInicio.getAnchura();
cajaInicio.setUnificada();
h1 = inicioAltura;
h2 = h1/2;
h3 = h2/2;
origenInferior = cajaInicio.getOrigenY() + h2;
origenSuperior = origenInferior - h3;
int suma=0;
Iterator it = cajas.iterator();
while(it.hasNext())
{

Caja actual = (Caja) it.next();


int alturaCaja = actual.getAltura();
if( alturaCaja < 2*h1 && alturaCaja > h1/2 &&
!actual.getUnificada())
{
int posicionY = actual.getOrigenY();
if(posicionY < origenInferior &&
posicionY + alturaCaja > origenSuperior)
cajasEnLinea.add(actual);
}

}
Iterator enLinea;
while(algunUnificado)
{
algunUnificado = false;
enLinea = cajasEnLinea.iterator();
boolean noUnificado = true;
while(enLinea.hasNext() && noUnificado)
{
Caja cajaProxima = (Caja) enLinea.next();
int cpX = cajaProxima.getOrigenX();
int cpY = cajaProxima.getOrigenY();
int cpan = cajaProxima.getAnchura();
int cpal = cajaProxima.getAltura();
//Condicion de unificacion de cajas
if(((cpX + cpan > inicioX -(
65

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

modUnificacion * h1) && cpX + cpan < inicioX + inicioAnchura +


h1) ||
(cpX > inicioX - h1 && cpX < inicioX +
inicioAnchura +( modUnificacion*h1)))&&
!cajaProxima.getUnificada())
{
cajaProxima.setUnificada();
noUnificado = false;
algunUnificado = true;
numUnificados++;
//Si unifica y no tiene la altura q
estamos mirando
//Lo eliminamos de las alturas
if(cpal!=h1)
{
histogramaCajas[cpal]--;
}
if(inicioX > cpX)
{
inicioAnchura += (inicioX-cpX);
inicioX = cpX;
}
if(inicioY > cpY)
{
inicioAltura += (inicioY-cpY);
inicioY = cpY;
}
if(inicioX + inicioAnchura < cpX +
cpan)
{
inicioAnchura = cpX - inicioX +
cpan;
}
if(inicioY + inicioAltura < cpY +
cpal)
{
inicioAltura = cpY - inicioY +
cpal;
}
}
}
}
int auxX=inicioX-h1;
int auxAnchura=inicioAnchura+2*h1;
if (auxX<0)
{
auxAnchura=auxAnchura+auxX;
auxX=0;
}
66

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

if (auxAnchura+auxX > matrizOrigen[0].length)


{
auxAnchura=matrizOrigen[0].length-auxX;
}
//System.out.println("Aadiendo
Caja:"+inicioX+","+inicioY+","+inicioAnchura+","+inicioAltura
+ "
Con :" +numUnificados+" Elementos.");
rectangulos.add(new
Caja(auxX,inicioY,auxAnchura,inicioAltura,null));
}
public ArrayList obtenerRectangulos()
{
return rectangulos;
}
public ArrayList obtenerNoAceptadosPorFrecuencias()
{
ArrayList salida=new ArrayList();
Iterator it=cajas.iterator();
Caja proxima;
while(it.hasNext())
{
proxima = (Caja)it.next();
if (!proxima.getUnificada())
{
salida.add(proxima);
}
}
return salida;
}

}
f.

Identificacin de texto: IdentificacionDeTexto

Compureba si las cajas son texto o contienen imgenes.

public class IdentificacionDeTexto


{
private int[][] matrizBinaria;
private int[] histogramaDSE = new int[512];
private int numDSE;
private static final double[][] CentersClasses = {
{0.062, 0.062,
0.0614,
0.06,
0.0251,

0.0232,

67

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

0.0, 0.0, 0.0, 0.0, 0.038,


0.04,
0.0},
{0.0393,
0.0385,
0.0354,
0.0345,
0.0473,
0.0454,
0.0, 0.0, 0.0, 0.0, 0.029,
0.023,
0.0},
{0.0011, 0.0015,
0.0025,
0.0027,
0.013,
0.0128,
0.0467,
0.0425,
0.0264,
0.0243,
0.0025,
0.0047,
0.0001},
{0.0011, 0.071,
0.0011,
0.0072,
0.0345,
0.0344,
0.0, 0.0, 0.0016,
0.0, 0.0917,
0.0917,
0.0737}};
private static final int[] featureToDSECN =
{219,
73,
438, 292, 1,
256, 170, 341,
186, 495, 448, 7,
56};
private double[] distancias = new double[4];
private boolean texto;
private int altura,anchura,x,y;

public IdentificacionDeTexto(int[][] matriz)


{
this.matrizBinaria = matriz;
numDSE=0;
}
public boolean analizarCaja(Caja entrada)
{
for(int i=0;i<4;i++)
{
distancias[i]=0;
}
altura=entrada.getAltura();
anchura=entrada.getAnchura();
x=entrada.getOrigenX();
y=entrada.getOrigenY();
generaHistogramaBinario();
calculoDistancias();
generaDecision();
return texto;
}
private void generaHistogramaBinario()
{
int i,j;
int dsecn;
numDSE=0;
for(i=0;i<512;i++)
histogramaDSE[i]=0;
for(i=y+1;i<y+altura-1;i++)
{
for(j=x+1;j<x+anchura-1;j++)
68

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{
dsecn =
matrizBinaria[i+1][j+1]+matrizBinaria[i+1][j]*2+matrizBinaria
[i+1][j-1]*4+
matrizBinaria[i][j+1]*8+matrizBinaria[i][j]*16+matrizBinaria[i]
[j-1]*32+
matrizBinaria[i-1][j+1]*64+matrizBinaria[i1][j]*128+matrizBinaria[i-1][j-1]*256;
if(!(dsecn == 0 || dsecn ==511))
{
histogramaDSE[dsecn]+=1;
numDSE++;
}
}
}
}
private void calculoDistancias()
{
double acumulador,featureValor;
double var,varianza=1;
for(int i=0; i<4; i++)
{
acumulador = 0;
/*
double media=0;
for(int l=0; l<13; l++)
//media
=(double)((double)histogramaDSE[featureToDSECN[l]]/numDSE);
media += CentersClasses[i][l];
media = media / 13;
for(int k=0;k<13;k++)
{
varianza += Math.pow(CentersClasses[i][k]media,2);
}
varianza = varianza / 13;*/
for(int j=0; j<13; j++)
{

featureValor
=(double)((double)histogramaDSE[featureToDSECN[j]]/numDSE);
//System.out.println("VARIANZA:" +varianza + "DSE "+
69

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

numDSE);
//Veamos que valores pueden ser erroneos:
if (featureValor>1)
{
System.err.println("Posible error frec
elevada:"+featureValor);
}
if (CentersClasses[i][j]>1)
{
var =CentersClasses[i][j];
//System.out.println("Posible error CENTRO
elevada:"+var+ " en " +i+","+j);
}
//System.out.println("Feture: "+j+ " Caso: "+i+"
Esperado:" +CentersClasses[i][j]+" Encontrado: "+ featureValor);
acumulador += Math.pow((featureValorCentersClasses[i][j])/varianza,2);
}
acumulador = Math.sqrt(acumulador);
//System.out.println("D"+i+ "=" + acumulador);
distancias[i] = acumulador;
}
}
private void generaDecision()
{
double minimo = distancias[0];
if(distancias[1]<minimo)
minimo = distancias[1];
if(distancias[2]<minimo)
minimo = distancias[2];
if(distancias[3]<minimo)
minimo = distancias[3];
if( (minimo == distancias[0] || minimo == distancias[1]))
{
texto = true;
System.out.println("ES TEXTO!!!!! " + minimo );
}
else
{
texto = false;
// System.out.println("ES IMAGEN!!!!!
" + minimo);
}
}
public boolean obtenerResultado()
{
return texto;
70

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

}
public int[][] obtenerMatrizBinaria()
{
return matrizBinaria;
}
}

4.1.4. Control:
Crea la red neuronal y gestiona todo lo relacionado con esta.

import
import
import
import
import
import
import
import

java.util.ArrayList;
java.util.Iterator;
java.util.Vector;
java.awt.Toolkit;
java.awt.Image;
java.awt.*;
jmatlink.*;
java.awt.image.PixelGrabber;

public class control {


private JMatLink engine=new JMatLink();
public control() {
engine.engOpen();
}
public Vector centrar(Vector caracteres){
Vector caracter=new Vector();
int altoc,anchoc;
int[][][] matrizc;
int[][][] matrizcentrada;
int[][] matrizIntensidades;
int[] imagencaracter;
Vector imagen;
Vector imagenes=new Vector();
for(int i=0; i<caracteres.size(); i++){
caracter=(Vector)caracteres.elementAt(i);
altoc=((Integer)caracter.elementAt(0)).intValue();
anchoc=((Integer)caracter.elementAt(1)).intValue();
matrizc=new int[altoc][anchoc][4];
matrizc=(int[][][])caracter.elementAt(2);

71

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

//pintarImagen(matrizc,anchoc,altoc,5*(i*10),25);
//matrizcentrada=new int[altoc][anchoc][4];
centrado imagenCentrada=new centrado();
matrizcentrada=imagenCentrada.CentradoImagen(matrizc,
anchoc,altoc);
matrizIntensidades=new int[14][10];
intensidades inten=new intensidades();
matrizIntensidades=inten.intensidad(imagenCentrada.
getMatriz(),imagenCentrada.getAlto(),imagenCentrada.getAncho());
imagen=new Vector();
imagen.add(new Integer(imagenCentrada.getAlto()));
imagen.add(new Integer(imagenCentrada.getAncho()));
imagen.add(imagenCentrada.getMatriz());
imagenes.add(imagen);
}
return imagenes;
}
public void creacion(String entrenamiento,String derecha,
String centro,String izquierda,String neuronas1,String
neuronas2){

double[][] objetivo=new double[36][36];


double[][] alfabeto=new double[140][36];
double alfabeto2[][]= {
{0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,
0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
72

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

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.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,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,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,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,
73

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

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.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,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},
{1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,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,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,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},
74

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,
0.0,1.0,1.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,1.0,
1.0,0.0,1.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,0.0,1.0,0.0,0.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,1.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,1.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,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,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,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,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0
1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,
1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,1.0,
75

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

1.0,1.0,1.0,
1.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,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,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,1.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,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,
76

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

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.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,
0.0,1.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,
0.0,1.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,
1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,
0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,0.0,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},
{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,
0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,
0.0,0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0
,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
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,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,1.0,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,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
77

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
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,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,1.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,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,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,
1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,
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,1.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
1.0,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},
78

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

{0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,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,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,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},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,
0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,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,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0,
1.0,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,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
1.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,1.0,0.0,0.0,0.0,
0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
0.0,1.0,1.0,1.0,1.0,1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,1.0,
0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,
79

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

0.0,1.0,0.0,0.0,0.0,0.0,1.0,0.0,0.0,0.
0,0.0,1.0,1.0,1.0,1.0,1.0,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}
};

for (int w=0;w<36;w++){


for(int x=0;x<140;x++){
alfabeto[x][w]=alfabeto2[w][x];
}
}
/*
int alto=20;
int ancho=794;
Vector imagenes;
Vector imagenescentradas;
Vector caracterInfo;
int nimagenes,nimagenescentradas;
int[][][] letra;
Image centrada;
int altoc,anchoc;
int[][] matrizIntensidades;
double[][] matrizUna;
double[][] alfabeto=new double[140][36];
double[][] objetivo=new double[36][36];
int[][][] entera;
int[][][] enteraFiltrada;

Image original=Toolkit.getDefaultToolkit().getImage(
"matriculaalfabeto.jpg");
//g.drawImage(original,5,1,ancho,alto,this);
int[] matAlfa = new int[ancho * alto];
PixelGrabber pixels = new PixelGrabber(original,
0, 0, ancho, alto,
matAlfa, 0,
ancho);
try{
pixels.grabPixels();
}catch(Exception e){
}
entera=utilidades.convertToThreeDim(matAlfa,ancho,
alto);
filtro filtrar=new filtro();
enteraFiltrada=filtrar.filtro(entera,ancho,alto,110);
recorte recortado=new recorte(enteraFiltrada,alto,
80

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

ancho);
imagenes=recortado.recortar(6);
nimagenes=imagenes.size();
centrado centrar=new centrado();
imagenescentradas=centrar.centrar(imagenes);
nimagenescentradas=imagenescentradas.size();
System.out.print("Caracteres entrenamiento: " +
nimagenescentradas);
for (int i = 0; i < nimagenescentradas; i++) {
caracterInfo = (Vector) imagenescentradas.
elementAt(i);
altoc = ((Integer)
caracterInfo.elementAt(0)).intValue();
anchoc = ((Integer)
caracterInfo.elementAt(1)).intValue();
letra = (int[][][]) caracterInfo.elementAt(2);
matrizIntensidades = new int[14][10];
intensidades inten=new intensidades();
matrizIntensidades = inten.intensidad(letra,
altoc, anchoc);
matrizUna=new double[140][1];
matrizUna=utilidades.pasarDeDosAUna(
matrizIntensidades);
for(int j=0;j<140;j++){
alfabeto[j][i] = matrizUna[j][0];
}
}
*/
for(int k=0;k<36;k++){
for(int l=0;l<36;l++){
if(k==l)
objetivo[k][l]=1;
else
objetivo[k][l]=0;
}
}
engine.engPutArray("alphabet",alfabeto);
engine.engPutArray("targets",objetivo);
engine.engEvalString("[R,Q] = size(alphabet);");
engine.engEvalString ("[S2,Q] = size(targets);");
engine.engEvalString("S1 = " + neuronas1 + ";");
engine.engEvalString("S3 = " + neuronas2 + ";");
String red="net = newff(minmax(alphabet),
[S1 S3 S2],{'" + derecha + "' '" + centro + "' '" +
81

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

izquierda + "'},'" + entrenamiento + "');";


engine.engEvalString (red);

}
public void entrenamiento(String goal, String iteraciones,
String lr, String momentum,String biass,String lw){
engine.engEvalString ("net.LW{2,1} = net.LW{2,1}*" +
lw + ";");
engine.engEvalString("net.b{2} = net.b{2}*" + biass +
";");
engine.engEvalString("net.performFcn = 'sse';");
engine.engEvalString("net.trainParam.goal =" + goal +
";");
engine.engEvalString("net.trainParam.show = 10;");
engine.engEvalString ("net.trainParam.epochs = " +
iteraciones + ";");
if(!lr.equalsIgnoreCase(""))
engine.engEvalString ("net.trainParam.lr=" + lr +
";");
if(!momentum.equalsIgnoreCase(""))
engine.engEvalString ("net.trainParam.mc=" + momentum
+ ";");
engine.engEvalString("P = alphabet;");
engine.engEvalString("T = targets;");
engine.engEvalString ("[net,tr] = train(net,P,T);");
}
public void correccion(String matriculareal,ArrayList
porDibujar,int nimagenescentradas){
char caracter;
//int nimagenescentradas;
Vector caracterInfo;
int altoc,anchoc;
int[][][] letra;
int[][] matrizIntensidades;
double[][] matrizUna=new double[140][1];
double[][] matrizAprendizaje;
double[][] matrizObjetivo;
int ascii;
//nimagenescentradas=4;//imagenesCentradas.size();
matrizAprendizaje=new double[140][nimagenescentradas];
matrizObjetivo=new double[36][nimagenescentradas];
82

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

for(int i=0;i<36;i++)
for(int j=0;j<nimagenescentradas;j++)
matrizObjetivo[i][j]=0;
int i=0;
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(recActual.getMatriz()!=null){
System.out.println("estoy con las lectras");
for(int j=0;j<140;j++)
matrizAprendizaje[j][i]=(recActual.
getMatriz())[j][0];

ascii=(int)matriculareal.charAt(i);
if(ascii>=65) //es una letra
matrizObjetivo[ascii-65][i]=1;
else
matrizObjetivo[ascii-22][i]=1;
engine.engPutArray("matricula",matrizAprendizaje);
engine.engPutArray("objetivo",matrizObjetivo);
engine.engEvalString("A = matricula;");
engine.engEvalString("O = objetivo;");
engine.engEvalString ("[net,tr] = train(net,A,O);");
i++;
}
}
}
public String reconocimiento(ArrayList porDibujar){
System.out.println("Estoy en reconocimiento de caracteres");
int ancho=201;
Vector imagenes;
Vector caracterInfo;
int nimagenes,nimagenescentradas;
int[][][] letra;
Image centrada;
int altoc,anchoc;
int[][] matrizIntensidades;
double[][] matrizUna=new double[140][1];
double[][] alfabeto=new double[140][36];
double[][] objetivo=new double[36][36];
double[][] retornoMat=new double[36][1];
String salida=new String();
83

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

try{
Iterator it = porDibujar.iterator();
while(it.hasNext())
{
Caja recActual = (Caja) it.next();
if(recActual.espacio==true)
salida=salida+" ";
if(recActual.renglon==true)
salida=salida+"\n";
if(recActual.getMatriz()!=null){
engine.engPutArray("letra",recActual.getMatriz());
engine.engEvalString("salida=
sim(net,letra)");
retornoMat=engine.engGetArray("salida");
salida=salida.concat(String.valueOf(utilidades.reconocido
(retornoMat)));
System.out.println(salida.trim());
}
}
}catch(Exception e){
}
System.out.println("salgo");
return salida;
}
}

4.1.5. Caja:
Esta clase sirve para guardar la parte de imagen recortada, junto con el carcter y la
posicin donde esta ese carcter.

public class Caja {


private int x;
private int y;
private
int anchura;
private int altura;
private boolean unificada;
double matriz[][];
boolean espacio=false;

84

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

boolean renglon=false;
public Caja(int x,int y,int anchura,int altura,double
matriz[][] )
{
this.x = x;
this.y = y;
this.anchura = anchura;
this.altura = altura;
this.unificada = false;
this.matriz=matriz;

}
public void tieneEspacio(){
this.espacio=true;
}
public void tieneRenglon(){
this.renglon=true;
}
public void relleno(){
int auxiliar=0;
double matriz2[][]=new double[140][1];
for(int i=0;i<14;i++){
for(int j=0;j<10;j++){
if(i<altura && j<anchura){
matriz2[auxiliar++][0]=(double)matriz[i][j];
}else{
matriz2[auxiliar++][0]=0.0;
}
}
}this.matriz=matriz2;
}
public double [][] getMatriz(){
return matriz;
}
public void setOrigen(int x,int y)
{
this.x = x;
this.y = y;
}
public void setX(int x)
{
this.x = x;
}
public void setY(int y)
{
this.y = y;
}
85

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

public void setAltura(int altura)


{
this.altura = altura;
}
public void setAnchura(int anchura)
{
this.anchura = anchura;
}
public void setUnificada()
{
this.unificada = true;
}
public int getAltura()
{
return altura;
}
public int getAnchura()
{
return anchura;
}
public int getOrigenX()
{
return x;
}
public int getOrigenY()
{
return y;
}
public int[] getOrigen()
{
int[] origen = new int[2];
origen[0] = x;
origen[1] = y;
return origen;
}
public boolean getUnificada()
{
return unificada;
}
public void imprimir(){
if(matriz!=null){
86

UNIVERSIDAD PONTIFICIA DE SALAMANCA EN MADRID


Facultad de Informtica

System.out.println("Alto "+altura+" anchura


"+anchura+" \n");
int p=0;
for (int i=0;i<14;i++){
for(int j=0;j<10;j++){
if(matriz[p++][0]==1.0){
System.out.print("*");
}else{
System.out.print(" ");
}
}System.out.println("");
}
}
}
public void impresion(){
System.out.println("{");
for(int o=0;o<140;o++)
System.out.print(matriz[o][0]+",");
System.out.println("}");
}
}

87

También podría gustarte