2 % Script de MathLab para detectar el borde de las imagenes.
\r
7 disp(' DETECTOR DE BORDES PARA MATHLAB');
\r
8 disp(' ======== == ====== ==== =======');
\r
10 disp('Imagenes del MathLab: flujet, spine, gatlin2, clown, earth, mandrill');
\r
14 % Pregunta si quiere borrar todas las imagenes y variables
\r
15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
16 sBorrar = input('Desea borrar todos los datos anteriores (S/N)? ', 's');
\r
18 if (sBorrar == 'S') | (sBorrar == 's')
\r
22 % Entrada de la imagen
\r
23 %%%%%%%%%%%%%%%%%%%%%%%
\r
24 sArchivo = input ('Ingrese el nombre de la imagen (*.mat): ', 's');
\r
27 % Entrada de la tolerancia de la deteccion de bordes
\r
28 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
29 nTolerancia= input ('Ingrese la tolerancia para detectar los bordes (0 = sin tolerancia, 15 = mucha tolerancia): ');
\r
31 % Pregunta si quiere ativar la correccion de zonas constantes
\r
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
33 sCorrect = input('Desea evitar que los intervalos constantes se detecten como bordes (S/N)? ', 's');
\r
35 % Crea una nueva figura y muestra la imagen a la que se le detectarán los bordes
\r
36 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
39 image(X), colormap(copper)
\r
40 disp('MOSTRANDO IMAGEN ORIGINAL. Presione cualquier tecla para continuar ...');
\r
43 % Comienza a detectar los bordes, creando otra matriz con la imagen de los mismos
\r
44 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
46 disp(' CALCULANDO LOS BORDES. Espere por favor ...');
\r
47 [m,n]=size(X); % obtiene el tamaño de la matriz original
\r
48 mBorde=ones(m,n); % Crea la matriz borde iniciada en 1 (1 es Negro)
\r
49 for i = 2: 1: m-1 % Recorre la matriz en busca de los bordes
\r
51 if (sCorrect == 'S') | (sCorrect == 's') % Si esta activada la correccion ...
\r
52 % Primero se fija que los valores que rodean al elemento actual y dicho elemento sean (al menos uno)
\r
53 % distintos entre sí (dependiendo de la tolerancia). Esto evita que en los intervalos que la funcion
\r
54 % es constante nos detecte un borde, ya que en ese caso, tambien cumple la ecuacion de Laplace pero no
\r
55 % es un borde en realidad.
\r
56 if (abs(X(i+1, j) - X(i, j-1)) > nTolerancia) | (abs(X(i+1, j) - X(i, j)) > nTolerancia) | (abs(X(i+1, j) - X(i, j+1)) > nTolerancia) | (abs(X(i+1, j) - X(i-1, j)) > nTolerancia) | (abs(X(i-1, j) - X(i, j+1)) > nTolerancia) | (abs(X(i-1, j) - X(i, j)) > nTolerancia) | (abs(X(i-1, j) - X(i, j-1)) > nTolerancia) | (abs(X(i-1, j) - X(i+1, j)) > nTolerancia) | (abs(X(i, j+1) - X(i, j)) > nTolerancia) | (abs(X(i, j+1) - X(i, j-1)) > nTolerancia) | (abs(X(i, j+1) - X(i+1, j)) > nTolerancia) | (abs(X(i, j+1) - X(i-1, j)) > nTolerancia) | (abs(X(i, j-1) - X(i, j+1)) > nTolerancia) | (abs(X(i, j-1) - X(i, j)) > nTolerancia) | (abs(X(i, j-1) - X(i+1, j)) > nTolerancia) | (abs(X(i, j-1) - X(i-1, j)) > nTolerancia)
\r
57 % Calcula el elemento actual aplicando la ecuacion de Laplace
\r
58 nElemento = X(i+1, j) + X(i, j-1) + X(i, j+1) + X(i-1, j) - 4 * X(i, j);
\r
59 if (abs(nElemento) <= nTolerancia) % Para que cumpla con Laplace el elemento debe ser
\r
60 % igual a cero, pero como se trata de una funcion
\r
61 % discrete es muy comun que no de exactamente cero.
\r
62 % Es por esto que uso la tolerancia.
\r
63 mBorde(i, j) = 256; % Si encontró el borde, le asigna un color alto (256 es blanco)
\r
64 end % if abs(nElemento) <= nTolerancia
\r
67 % Calcula el elemento actual aplicando la ecuacion de Laplace
\r
68 nElemento = X(i+1, j) + X(i, j-1) + X(i, j+1) + X(i-1, j) - 4 * X(i, j);
\r
69 if (abs(nElemento) <= nTolerancia) % Para que cumpla con Laplace el elemento debe ser
\r
70 % igual a cero, pero como se trata de una funcion
\r
71 % discrete es muy comun que no de exactamente cero.
\r
72 % Es por esto que uso la tolerancia.
\r
73 mBorde(i, j) = 256; % Si encontró el borde, le asigna un color alto (256 es blanco)
\r
74 end % if abs(nElemento) <= nTolerancia
\r
75 end % if (sCorrect == 'S') ...
\r
79 disp(' FINALIZO EL CALCULO DE LOS BORDES. Presione cualquier tecla para verlos ...'), pause
\r
81 % Crea una nueva figura y muestra el borde en ella
\r
82 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
84 image(mBorde), colormap(gray(256))
\r
86 % Borra todas las variables temporales que usa el programa
\r
87 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\r
99 %%%%%%%%%%%%%%%%%%%%
\r
102 disp(' La matriz que contiene al borde se llama "nBorde".');
\r
104 disp('------------------------------------------------------------------------');
\r
106 disp(' Este programa fue desarrollado por Leandro Lucarella. PADRON: 77.891');
\r
107 disp(' para la Facultad de Ingeniería de la Universidad de Buenos Aires.');
\r
108 disp(' Catedra de Análisis Matemático II, curso 8.');
\r
110 disp(' Comentarios y/o sugerencias a: lluca@cnba.uba.ar | (C) 1999');
\r