Resolver un laberinto con MatLab Integrante 1 (Luis Arturo García Amézquita) e-mail:
[email protected]
RESUMEN: considerar dentro del sistema es, un espacio definido para posicionar el laberinto, en donde no se llegue a mover, ya que al momento de tomar las fotos lo ideal es que sean iguales. Cuando las imágenes salen movidas o fuera de cuadro ocasiona también muchos problemas difíciles de identificar y muchas veces se pierde tiempo buscando alternativas cuando el problema esta directamente en la foto y no en la lógica del programa.
El trabajo que se realiza es el resolver un laberinto con la ayuda de MatLab, para lo cual se utiliza un sistema de visión y el procesamiento de imágenes de la misma plataforma. Dentro del laberinto hay un objeto el cual puede ser colocado en cualquier parte, el programa identifica la pieza y a partir de la misma traza la trayectoria hacia la salida PALABRAS CLAVE: MatLab, visión, resolver laberinto.
INTRODUCCIÓN MATLAB (abreviatura de MATrix LABoratory, ("laboratorio de matrices") es un software matemático que ofrece un entorno de desarrollo integrado(IDE) con un lenguaje de programación propio (lenguaje M).
Fig. 1. Sistema de visión y laberinto
El procesamiento digital de imágenes es el conjunto de técnicas que se aplican a las imágenes digitales con el objetivo de mejorar la calidad o facilitar la búsqueda de información.
OBTENCION DE LA IMAGEN Y SELECCIÓN DE OBJETO EN EL LABERINTO
El toolbox de MatLab contiene un conjunto de funciones de los algoritmos mas conocidos para trabajar con imágenes binarias, transformaciones geométricas, manipulación de color junto con las funciones ya integradas en MatLab.
Con la foto obtenida teniendo en cuenta las consideraciones anteriores lo siguiente es empezar a trabajar con ella dentro de MatLab. Primero se selecciona la imagen, se cambia a escala de grises, se binariza y dilata. Se crean también otras 2 matrices del mismo tamaño que el de la imagen las cuales servirán para posicionar el punto donde esta el objeto y crear la trayectoria de salida.
CREACION DEL LABERINTO Y EL SISTEMA DE VISION Lo primero que se realiza es la construcción del laberinto y un sistema o mueble en donde se pueda colocar para tomar las fotografías, esta es la parte más importante del programa. Por un lado esta el laberinto, el cual debe tener bien definidos sus espacios y sus paredes, esto por que al momento del procesado, si hay espacios más pequeños o paredes disparejas crea problemas difíciles de resolver. El sistema debe tener perfectamente establecido una altura considerable para la obtención de las fotos, también debe contar con una buena iluminación, esto con el fin de eliminar sombras. Otra cosa importante a
Fig. 2. Imagen dilatada y original Lo siguiente es identificar el objeto dentro de la imagen. Lo primero es identificar el numero de objetos que se encuentran dentro de la imagen y conocer sus propiedades, esto con el fin de identificar el objeto de
1
interés y así hacer una selección del objeto de interés que sirve de referencia para encontrar el camino.
CONCLUSIONES
Dependiendo de la intensidad de la dilatación pueden aparecer mas de un objeto por lo cual dentro del mismo programa se incluye un margen para eliminar todos los que resulten innecesarios y quedarnos solo con el de interés. Dentro de las propiedades encontradas también esta el centroide de las imágenes, una vez eliminadas las demás imágenes se asigna una variable al valor del centroide del objeto en coordenadas de ‘x’, ‘y’.
El realizar este programa resulto difícil, aun a pesar de que ya se tenia el conocimiento previo del procesamiento de imágenes y trazado de trayectorias. La adquisición de las fotos fue de los peores problemas. Con algunas lograba encontrar la salida pero si se movía un poco afectaba encerrándolo en un ciclo y mandando un error, si el laberinto tenia mucha luz en algunas ocasiones las líneas se brincaban los bordes. En caso contrario con poca luz me encontraba mas de un objeto con las mismas dimensiones o en definitiva dejaba la imagen oscura. Sumando a todo esto que no hay o por lo menos yo no encontré una guía en donde se hablara de este tipo de problemas.
Fig. 3. Objeto seleccionado
Fue de mucha ayuda el volver a ver programas anteriores realizados en Ubuntu con la librería graphics ya que en teoría era la misma técnica de incrementar un punto.
PROCESO DE SOLUCION DEL LABERINTO. Con el objeto identificado dentro del laberinto y sus propiedades ya establecidas lo siguientes es indicar un punto en el lugar donde se encuentra el objeto. Con las matrices de ceros que se hicieron al principio se marca el punto y se dan las coordenadas del centroide del objeto. Lo siguiente es ir trazando el camino lo cual se logra dando incrementos en la posición del punto, dependiendo hacia donde se mueve, se decide si se debe incrementar o decrementar, esto se hace con ciclos For. Con ayuda de los while se puede ir repitiendo el código mientras la condición se siga cumpliendo. Una condición importante es el poder decir al programa que cuando encuentra una pared, es decir un uno debe cambiar de dirección.
Fig. 4 laberinto resuelto
2
REFERENCIAS
Erik Valdemar Cuevas Jiménez, Daniel Zaldívar Navarro, “Visión por computadora utilizando MatLab y el toolbox de procesamiento digital de imágenes”, pp.34 Rafael Gonzalez, Richard Woods, Steven Eddin,”digital image processing using MatLab”, Prentice Hall, pp 344, 2004 Procesamiento de imagines con MatLab, http://loonely113.blogspot.com Rosa Echeverría Líbano, Dpto. ecuaciones diferenciales y análisis numérico, universidad de Sevilla, “introducción rápida a MatLab”, pp 39. Ubuntu http://www.ubuntu-es.org
Daniel Hernández Moedano, “instalación y uso de graphics para Ubuntu “
PROGRAMA PRINCIPAL 3
%LIMPIA LA PANTALLA Y TODAS LAS VARIABLES clear all clc %SELECCIONA IMAGEN Y LA CAMBIA A ESCALA DE GRISES A=imread('i39.jpg'); figure(1) imshow(A);
J(i,j)=0; else
J(i,j)=1;
end
end end figure (5) imshow(J); J=not(J); imshow(J)
[d1,d2,d3] = size(A); O=d1*d2; if (d3>=3) d=rgb2gray(A); else d=(A); end
[L Ne]=bwlabel(J); %% CALCULAR LAS PROPIEDADES DE LOS OBJETOS DE LA IMAGEN propied= regionprops(L); hold on
% MUESTRA EL TAMAÑO DE LA IMAGEN Y CREA OTRAS DOS MATRICES DEL MISMO TAMAÑO C=size(A); B=zeros(d1,d2); B2=zeros(d1,d2);
%% BUSCAR AREAS MENORES s=find([propied.Area]>20 & [propied.Area] 460)
for i=1:5 for j=1:5
figure(3) imshow(base); cont2=1; cont1=1;
base(i+x,j+y) = 1; end
end
end figure(2) imshow(base) impixelinfo
if base2(y+5,x)== 1 ab =1; end
rep =0; cont1=0;
for i=1:5 for j=1:5
5
%izquierda while izq ~= 1
base(i+y,j+x) = .80; end
x=x-1;
end
if base2(y,x-5)== 1 izq =1; end
end %izquierda izq=0; %izquierda while izq ~= 1
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
x=x-1;
end
if base2(y,x-5)== 1 izq =1; end
end end %abajo ab=0; %abajo while ab ~= 1
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
y=y+1;
end end
if ((y+5) > 460)
end %arriba arr=0; %arriba end
while arr ~= 1
figure(3) imshow(base); cont2=1; cont1=1;
if base2(y+5,x)== 1 ab =1; end
y=y-1; if base2(y-5,x)== 1 arr =1; end
for i=1:5 for j=1:5
for i=1:5 for j=1:5
base(i+y,j+x) = .80;
base(i+y,j+x) = .80; end
end
end
end
end
end rep=rep+1; if (x==close(1) && y==close(2))
%izquierda izq=0;
6
cont1=1; end if (rep >=35) cont1=1; end end
end end end %abajo ab=0; %abajo while ab ~= 1
rep2=0; close2 = point; while cont2 ~= 1
y=y+1;
%arriba arr=0; %arriba
if ((y+5) > 460) figure(3) imshow(base); cont2=1; cont1=1;
while arr ~= 1 y=y-1; end
if base2(y-5,x)== 1 arr =1; end
if base2(y+5,x)== 1 ab =1; end
for i=1:5 for j=1:5
for i=1:5 for j=1:5
base(i+y,j+x) = .80; end
end
base(i+y,j+x) = .80;
end
end
end
end
%derecha der=0; %derecha while der ~= 1
%izquierda izq=0; %izquierda while izq ~= 1
x=x+1;
x=x-1;
if base2(y,x+5)== 1 der =1; end
if base2(y,x-5)== 1 izq =1; end
for i=1:5 for j=1:5
for i=1:5 for j=1:5
base(i+y,j+x) = .80;
base(i+y,j+x) = .80;
7
end
arr=0; %arriba
end
while arr ~= 1
end
y=y-1;
%arriba arr=0; %arriba
if base2(y-5,y)== 1 arr =1; end
while arr ~= 1 y=y-1;
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
if base2(y-5,x)== 1 arr =1; end
end for i=1:5 for j=1:5
end end
base(i+y,j+x) = .80;
%izquierda izq=0; %izquierda while izq ~= 1
end end
x=x-1;
end
if base2(y,x-5)== 1 izq =1; end
%izquierda izq=0; %izquierda while izq ~= 1 x=x-1;
for i=1:5 for j=1:5
if base2(y,x-5)== 1 izq =1; end
base(i+y,j+x) = .80; end
for i=1:5 for j=1:5
end end
base(i+y,j+x) = .80;
%abajo ab=0;
end end
%abajo while ab ~= 1
end
y=y+1;
%arriba
8
if ((y+5) > 460)
end
figure(3) imshow(base);
arr =1;
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
cont2=1; break; end
end
if base2(y+5,x)== 1 ab =1; end
end end %derecha der=0;
for i=1:5 for j=1:5
%derecha while der ~= 1
base(i+y,j+x) = .80;
x=x+1;
end
if base2(y,x+25)== 1 der =1; end
end end
for i=1:5 for j=1:5
rep2=rep2+1; if (x==close2(1) && y==close2(2)) cont2=1;
base(i+y,j+x) = .80;
end if (rep2 >=10)
end
figure(3) imshow(base) cont2=1;
end end %arriba arr=0; %arriba
end end rep3 =0; cont3=0; cont4=0; close = point;
while arr ~= 1 y=y-1; if base2(y-5,x)== 1 arr =1; end
%arriba arr=0; %arriba while arr ~= 1
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
y=y-1; if base2(y-5,x)== 1
9
%derecha while der ~= 1
end end
x=x+1;
end %derecha der=0;
if base2(y,x+25)== 1 der =1; end
%derecha while der ~= 1
for i=1:5 for j=1:5
x=x+1; if base2(y,x+25)== 1 der =1; end
base(i+y,j+x) = .80; end end
for i=1:5 for j=1:5
end %arriba arr=0; %arriba
base(i+y,j+x) = .80; end
while arr ~= 1
end
y=y-1;
end %arriba arr=0; %arriba
if base2(y-5,x)== 1 arr =1; end
while arr ~= 1 for i=1:5 for j=1:5 base(i+y,j+x) = .80;
y=y-1; if base2(y-5,x)== 1 arr =1; end
end end
for i=1:5 for j=1:5 base(i+y,j+x) = .80;
end %derecha der=0; %derecha while der ~= 1
end end
y=x+1;
end %derecha der=0;
if base2(y,x+5)== 1 der =1; end
10
end for i=1:5 for j=1:5
end
base(i+y,j+x) = .80;
end
11