Publicado el 20 de Julio del 2017
695 visualizaciones desde el 20 de Julio del 2017
283,1 KB
13 paginas
Creado hace 22a (29/05/2002)
CAPITULO 5
DISEÑO DE MODULOS DE SISTEMA, PRUEBAS Y CORRECCIONES
En el presente capítulo se describen cada uno de los detalles de implementación
de las herramientas necesarias para el navegador en Intranet basado en reconocimiento de
imágenes, que se basan en el diseño conceptual definido en el capítulo anterior. Se
explica como se fueron integrando cada uno de los módulos del proyecto así como la
especificación de cada uno de
los módulos y
las herramientas utilizadas para su
desarrollo.
5.1.-Módulos del sistema
A continuación se presenta una descripción de los detalles de implementación de
los módulos que integran nuestro sistema.
5.1.1.-Reducción de información
Primero, se decidió hacer un programa que pudiera reducir la información de las
imágenes manejadas para facilitar la transmisión de la información a través de la red de
una forma más rápida y además para observar como se segmenta la imagen y como
genera su cadena.
Lo primero que había que hacer era decidir por medio de que método se reduciría
dicha información, una de las más apropiadas para nuestro caso es el de quadtrees.
Hemos visto en capítulos anteriores el funcionamiento del quadtree, de la cual se podía
optar por manejar cadenas de información ya sea por medio de la forma de los
componentes de la imagen, o por medio de los colores que se manejaban, la cual fue la
forma escogida.
Al momento de realizar nuestro código de reducción de una imagen por medio de
quadtrees, habría que ver la forma de no manejar tanta información, así que se realizó la
clase ScannerColorPixelImage en donde se definen los colores que conforman el RGB de
cualquier imagen, y que va escaneando los colores de una imagen píxel por píxel.
Ya que se tiene dicha clase, se opta por particionar la imagen de acuerdo a mx-
quadtrees. En esta parte es muy importante calcular el ancho y el largo de la imagen, para
que a partir de esas características se particiona 3 veces. Como se puede ver a
continuación:
Figura 5.1.-Ejemplo de partición de la imagen
Para poder segmentar la imagen en cuadrantes hay que tener el ancho y el largo de la
imagen y a partir de ahí definir los cuadrantes. A continuación se presenta parte del
método que se utilizó para obtener los cuadrantes:
{
inSubHeight));
inSubHeight));
inSubHeight));
inSubHeight));
inSubHeight));
inSubHeight));
}
int inSubWidth = width / 8;
int inSubHeight = height / 8;
poCuadrantes[0] = new Point(0, height - inSubHeight);
poCuadrantes[1] = new Point(0, height - (2 * inSubHeight));
poCuadrantes[4] = new Point(0, height - (3 * inSubHeight));
poCuadrantes[5] = new Point(0, height - (4 * inSubHeight));
poCuadrantes[16] = new Point(0, height - (5* inSubHeight));
poCuadrantes[17] = new Point(0, height - (6 * inSubHeight));
poCuadrantes[20] = new Point(0, height - (7 * inSubHeight));
poCuadrantes[21] = new Point(0, height - (8 * inSubHeight));
.
.
.
.
poCuadrantes[42] = new Point(inSubWidth*7, height - inSubHeight);
poCuadrantes[43]
Point(inSubWidth*7,
height
new
=
poCuadrantes[46]
poCuadrantes[47]
=
=
new
Point(inSubWidth*7,
height
new
Point(inSubWidth*7,
height
-
-
-
poCuadrantes[58] = new Point(inSubWidth*7, height - (5* inSubHeight));
poCuadrantes[59]
Point(inSubWidth*7,
height
new
=
-
poCuadrantes[62]
poCuadrantes[63]
=
=
new
Point(inSubWidth*7,
height
new
Point(inSubWidth*7,
height
-
-
(2
(3
(4
(6
(7
(8
*
*
*
*
*
*
}
La cadena generada maneja números del 0 al 7, los cuales representan los siguientes
colores:
?? 0=Rojo, donde Rojo>Verde y Rojo>Azul
?? 1=Verde, donde Verde>Rojo y Verde>Azul
?? 2=Azul, donde Azul>Rojo y Azul>Verde
?? 3=Amarillo, donde Rojo=Verde y Rojo>Azul
?? 4=Violeta, donde Rojo=Azul y Rojo>Verde
?? 5=Azul Cielo, donde Verde=Azul y Verde>Rojo
?? 6=Blanco, donde Rojo>200 y Verde>200 y Azul>200
?? 7=Negro, donde Rojo<55 y Verde<55 y Azul<55
Las condiciones anteriores se pueden observar con más detalle en la siguiente muestra
de código:
for(int i=0;i<veColors.size();i++)
{
if(veColors.elementAt(i) == null) continue;
color = (Color)veColors.elementAt(i);
if(color.getRed() < 55 && color.getGreen() < 55 && color.getBlue() < 55)
inBlack++;
else
if(color.getRed() > 200 && color.getGreen() > 200 && color.getBlue() > 200)
inWhite++;
else
if(color.getRed() > color.getGreen() && color.getRed() > color.getBlue())
inRed++;
else
if(color.getRed() == color.getGreen() && color.getRed() > color.getBlue())
inYellow++;
}
else if(color.getRed() == color.getBlue() && color.getRed() > color.getGreen())
inViolet++;
else if(color.getGreen() > color.getRed() && color.getGreen() > color.getBlue())
inGreen++;
else if(color.getBlue() > color.getRed() && color.getBlue() > color.getGreen())
inBlue++;
else if(color.getGreen() == color.getBlue() && color.getGreen() > color.getRed())
inSkyBlue++;
Esto es debido a ciertos casos que se pueden presentar al momento de escanear la
imagen. También existe el caso donde por ejemplo, puede haber la misma cantidad de
pixeles de color rojo y de color blanco, en este caso, se le da prioridad al color que este
antes en la lista, en este caso el rojo, como se indica en el siguiente for:
for(int i=0;i<results.length-1;i++)
{
}
if(results[mayorIndex] < results[i+1])
mayorIndex = i + 1;
Al momento de presentarlo en pantalla, hay que escoger el método por el cual se
quiere reducir la imagen, en este caso por medio de quadtree y luego examinar la imagen
que se quiere reducir(Figura 5.1), una vez escogida dicha imagen , pide que se genere la
cadena resultante, y se muestra la imagen particionada en cuadrantes idénticos.
En
la
figura
5.2
podemos
ver
que
la
cadena
generada
es:
066662626660600022222222000071076666000066006212000.
5.1.2.-Movilidad en la navegación
Después de realizar el módulo de reducción de información, el siguiente paso era
lograr la comunicación cliente-servidor mediante servlets. Claro que una vez que se
quisiera integrar el sistema completo, habría que integrar las actividades del módulo de
reducción de información a los servlets. Por eso es que se logró hacer una clase muy
importante en la que se llevan a cabo todas las actividades de nuestro sistema.
Figura 5.2.-Escoger una imagen que se quiera reducir mediante mx-quadtrees.
Figura 5.3.-Ejemplo de cadena generada.
Era muy
importante hacer una comunicación cliente-servidor ya que
la
navegación se da por medio de la comunicación que hay entre máquinas. Además de que
existe un cliente con el que el usuario interactúa directamente y en donde realiza sus
peticiones. Y un servidor donde se reciben las peticiones y el cual se encarga de
comunicarse con una base de datos local donde se almacenan imágenes y donde busca la
petición del cliente.
La conexión al servlet se realiza mediante el siguiente código:
public void init(ServletConfig servletConfig)
{
try{
super.init(servletConfig);
trace("Initializing connection...");
connPool = new ConnectionPool();
trace("Initialized connection...");
}
catch(ServletException svtException){
}
}
trace("ServletException: (init) " + svtException);
Primero hay que poder hacer una conexión a una base de datos, en este caso el
manejador de bases MySQL. Aquí se crea una sola tabla que va a incluir imágenes, que
incluyan un id de entrada, la ruta de la imagen y la cadena generada.
Tabla imágenes
Campo
pathname
img_reducida
Id
Tipo de dato
varchar(100)
varchar(64)
Integer
No
No
No
Nulo
Tabla 5.1.-Tabla de imágenes creada en la base de datos para el sistema
Para poder dar de alta imágenes en la BD es importante que la imagen tenga la
extensión ".jpeg" o ".gif", en caso de que así no sea, no se podrá dar de alta imágenes en
la base de datos:
inOffset = stBytes.indexOf("image/gif") + 13;
stBytes = stBytes.substring(inOffset, stBytes.length());
inCount = stBytes.indexOf("-----------------------------") - 2;
stBytes = stBytes.substring(inOffset, inCount);
if(stBytes.indexOf("image/gif") != -1)
{
}
else if(stBytes.indexOf("image/pjpeg") != -1)
{
}
inOffset = stBytes.indexOf("image/pjpeg") + 15;
stBytes = stBytes.substring(inOffset, stBytes.length());
inCount = stBytes.indexOf("-----------------------------") - 2;
stBytes = stBytes.substring(inOffset, inCount);
Cuando se quiere realizar una búsqueda, hay que escoger en un editor de archivos
la imagen que se quiera buscar, luego el sistema se va al servlet y es capaz de conectarse
con la base de datos para poder hacer la búsqueda.
Otra parte
importante de
la
implementación del sistema fue el patrón de
comparación de las imágenes, en el cual, se comparan tal cual la cadena de la imagen de
la cual se quieren encontrar
Comentarios de: CAPITULO 5 DISEÑO DE MODULOS DE SISTEMA, PRUEBAS Y CORRECCIONES (0)
No hay comentarios