Cómo obtener el perfil de intensidad de una imagen con matlab



Resumen
En esta ocasiones requerimos obtener el perfil de intensidad de una imagen. Es decir, cual es el valor entre 0 y 255 que adquiere una serie de pixeles marcados en una línea arbitraria dentro de una imagen, incluso cuando se presenta varios canales. Para ello usamos el versátil comando improfile

Preguntas para pensar
2) Además de analizar patrones de difracción e interferogramas ópticas. ¿En que otras situaciones es útil obtener el perfil de intensidad de una imagen?

Ejercicio

1) El comando improfile permite marcar multiples líneas en una misma imagen. Obtnen gráficas diferenciadas de esta múltiples lineas

Cómo poner textura de imagen a una superficie 3D en Matlab



Resumen
Muchos video juego y simuladores usan texturas de imágenes sobre superficies de polinomios. Como si coloran una piel a un armazón. Aquí exploramos cómo se hace esta superposición en Matlab.

Además mostramos que se pueden cargar imagenes desde Internet a nuestro programa de Matlab.

Preguntas para pensar
1) ¿Cómo puede ser importante este programa para una aplicación médica?
2) ¿Cómo se eliminan las lineas guías (cuadricula) de la imagen 3D?
4) Las proyecciones planas se incorporaron a la superficie 3D. Lo que crea sitios con discontinuidades. ¿Como se puede mejorar el ajuste de una imagen que funciona como piel sobre una superficie digital?

Código Matlab
% Superficie 3D con una textura de imagen

% Inicialización
clear all; close all; clc; format compact;

% Constantes y valores iniciales
k = -.5; j = 0.6;

% Generando los valores x,y,z
[x,y] = meshgrid(-3:.2:3, -3:.2:3);
z = k.*(1-(cos(x.^2+y.^2))./(x.^2+y.^2+j));

% Dibujando la superficie
h = surf(x,y,z);

% Añadiendo una imagen a la superficie
img = imread('http://upload.wikimedia.org/wikipedia/en/5/5d/Ubinas_ali_2010205.jpg');

% Ubinas: el volcan más reciente de Perú
set(h,'CData',img,'FaceColor','texturemap')
axis off
% fin del guión.

Cómo hacer el símbolo del pentagrama con Matlab



Resumen
Un pentagrama es una estrella de cinco picos, hecha con cinco trazos. Tiene propiedades geométricas muy interesantes.

Para construirla, aquí dibujamos una linea horizontal, y la giramos mediante la función rot2d, cuyo al código encontraras al final de esta entrada. El guión del pentagrama se basa en dibujar una linea horizontal y luego rotarla. Sin embargo, se tiene cuidado de usar adecuadamente las definiciones de operaciones de matrices para obtener los vectores rotados.

Preguntas para pensar
1) ¿En que situaciones Matlab es una herramienta cómoda y adecuada para dibujar?, ¿y en situaciones Matlab es una pesima herramienta para hacer dibujos?
2) ¿Mejorando el entorno gráfico de Matlab, hace más amigable sus funciones de dibujo?

Ejercicios
1) Dibuje una estrella de David, utilizando de base los códigos de esta entrada
2) Explique con un ejemplo la importancia de de usar x = [x x(1)]; para obtener una rotación adecuada.
3) ¿En que coordenadas el punto en que gira la linea horizontal?, ¿Cómo puede especificar otro punto como pivote de los giros?

Códigos Matlab 
function [xt, yt] = rot2d(t, x, y)
% La función  rot2d rota un objeto bidimensional 
% que es representado por dos vectores: X y Y
% El ángulo de rotación es t, en radianes. 
r = [cos(t) -sin(t); sin(t) cos(t)];
x = [x x(1)];
y = [y y(1)];
z = r*[x;y];
xt = z(1,:);
 yt = z(2,:);

%guión para dibujar el pentagrama
%% Pentagrama 
%  Author: Vicente Torres Zuñiga 
%  
% Guión Matlab para graficar el símbolo de un pentagrama en el sistema 
% cartesiano
% El símbolo consiste en un círculo con un pentagrama en interior -un 
% estrella de cinco puntas dibujada con cinco lineas % 
%
% El algoritmo se enfoca en obtener las coordenadas de dibujo:
% primero de un circulo, luego de una linea horizontal, que posteriormente
% se rota para generar cuatro lineas para completar el pentagrama
%
close all; clear; clc % limpiamos la casa
num_puntos = 250; % número de puntos
t = linspace(0, 2*pi, num_puntos); % Intervalo
noLados = 5; % Número de lados del polígono
AnguloInt = 2*pi/noLados; % Ángulo interior del polígono
%
% Variables del círculo 
r = 2; % Radio
h = 0; k = 0; % Coordenadas del centro
%
% Ecuación parámetrica del círculo:
x = r*cos(t)+h; y = r*sin(t)+k; 
%
%% Ecuaciones para la linea horizontal
% Longitud de la linea horizontal
lH = 2*r*sin(AnguloInt);
% Distancia de la linea horizontal al centro: (0,0)
dist_lH = r*cos(AnguloInt);
%
% Definición del intervalo de la línea horizontal
xH = linspace(-lH/2, lH/2, num_puntos);
% Definición de vectores
L = zeros(2,num_puntos);
L(1,:) = xH;
L(2,:) = -dist_lH;
%
[L0rx  L0ry] = rot2d(AnguloInt*0, L(1,:), L(2,:));
[L1rx  L1ry] = rot2d(AnguloInt, L(1,:), L(2,:));
[L2rx  L2ry] = rot2d(AnguloInt*2, L(1,:), L(2,:));
[L3rx  L3ry] = rot2d(AnguloInt*3, L(1,:), L(2,:));
[L4rx  L4ry] = rot2d(AnguloInt*4, L(1,:), L(2,:));
%
% Gráficas
hold on
plot(x,y, 'r', 'LineWidth', 4) % círculo 
plot(L0rx, L0ry, 'LineWidth', 4)  % línea horizontal
plot(L1rx, L1ry, 'LineWidth', 4)
plot(L2rx, L2ry, 'LineWidth', 4)
plot(L3rx, L3ry, 'LineWidth', 4)
plot(L4rx, L4ry, 'LineWidth', 4)
axis square off
hold off
% fin del guión/script

Descubriendo huevos de Pascua en Matlab



Los huevos de Pascua son imagenes, fragmentos de audio o video o pedazos de código con una funcion inesperada e intencional de un programa. Fueron dejadas por los programadores para dejar un testimonio de su trabajo y aficiones; pero tal vez lo princiapal, estan ahí para que las descubramos.

Hay que enfatizar que los huevos de pascua no son demos, ni errores de programación.

De mis ejemplos favoritos en Matlab debo mendicionar siguientes:

  • fifteen
  • load handel, sound(y,Fs)
  • load audio48, sound(signal48kHz, Fs48)
  • why
  • spy
  • image

¡Debes probarlas!

Unas notas extras:

1) Parece que las versiones modernas de Matlab dejo de aparecer la imagen del espia. Pero la puedes recuperar con el código de una entrada de stackoverflow.

2) Image tiene una interesante historia, que la cuenta -en su blog- Steve Eddins.

Para ver las demas imagenes que se ocultan en la imagen por defecto puedes usar el siguiente código Matlab:
defImage = pow2(get(0,'DefaultImageCData'),47);
imgCell = repmat({zeros(size(defImage))},8,7);
for shift = 0:52
imgCell{shift+1} = bitshift(defImage,shift);
end;
allImages = cell2mat(imgCell.');
imshow(allImages,[min(allImages(:)) max(allImages(:))]);
%fin del script

Cómo ocultar una imagen en una rejilla espacial con Matlab



Se han hecho populares estas imágenes en Facebook, son fotos ocultadas a través de una densa rejilla espacial. Te mostramos cómo hacer esta ilusión óptica con Matlab.

Básicamente, se trata de disminuir el contraste de las fotos, alejarse de los tonos oscuros y luego introducir muchas franjas oscuras en la imagen. El resultado es que percibimos primero franjas oscuras y claras, pues entre ellas hay más contraste, cuando cambiamos de perspectiva (al inclinar la pantalla o la cabeza o alejarnos de la imagen) o sacudir la cabeza podemos ver la imagen oculta.

Se trata más de una curiosidad que de un verdadero sistema de criptografía, asi que diviértanse con el código y las imágenes que dejo en esta  entrada.

Preguntas para pensar
1) ¿Por qué aparece la imagen cuando cambiamos de perspectiva?

Ejercicios
1) Altera  el código para que sea una función de cuatro parámetros, que de de salida una imagen .gif

Imagen utilizada


Imagen de salida

Guión Matlab

% A limpiar la casa
 clear all; close all; clc;

% Cargar la imagen y ponerla en grises
im_fuente = rgb2gray(imread('maz.jpg'));

% cambia la clase de una variable
imgs = cast(im_fuente,'double'); 

% La imagen se ajusta a 60 tonos de gris, 
img = 60*((imgs)./(max(max(imgs))));
img = img + 195; % desplazar los tonos a 195
% al final tengo tonos de 195 a 255

[f c d] = size(img); % el proceso es para cada capa
% Paso es el número de columnas negras en la imagen final 
paso = floor(c/160); %redondea hacia abajo, frecuencia 1/160

for i = 1:2*paso:c
    img(:,i:i+paso,:) = 0; %img suele tener tres capas
end

im_final = cast(img,'uint8');
imshow(im_final); % ver para creer
%fin del guión

Más información en la ref.

Retirar datos atípicos (outliers) de una distribución de datos con Matlab



Los datos atípicos son datos que se alejan mucho de promedio de una distribución. Por lo general, se interpretan como errores experimentales aleatorios, por ello se suelen remover. En esta ocasión te muestro un script que usa cuartiles estadísticos para remover tales datos.

Preguntas para pensar
1)  En que caso un dato atípico brinda información experimental relevante y no debe removerse de la serie.

Ejercicios
1) Sugiere una modificación al guion presentado para usar la desviación-estándar como base para eliminar los datos atípicos.

GUIÓN MATLAB

%% Primer guión para remover datos atípicos
clc; clear; close all
%% Información de entrada
Y = [10 20 -150 40 50 60 70 200 90 100];
X = [2 4 6 8 10 12 14 16 18 20];
%% Cálculos
IQR = iqr(Y); %intervalo  intercuartil,
    % la diferencia entre el tercer  y el primer cuartil
    % de una distribución: 75%-25% de Y
    % σ= IQR * 0.7413

lowr=prctile(Y,25)-1.5*IQR; %Percentiles. Q1 - 1.5IQR.
highr=prctile(Y,75)+1.5*IQR; % Q3 + 1.5IQR

new_Y = Y(Y>lowr &   Y
new_X = X(Y>lowr &   Y

%%ver; es creer

hold on
plot(X, Y, 'bo','MarkerSize',20)
plot(new_X, new_Y, 'kx','MarkerSize',20)
hold off
%fin del guión

Juego de volados y casinos ricos



Guión:

%% ¿En cuanto tiempo un casino te deja sin dinero?
% este guion simula un juego de tirar una moneda entre un casino y un
% apostador.

%% Guión escrito por Vicente Torres Zúñiga; 18 de abril 2003.

clc; clear; close all % Limpia la memoria

casino = 100000; % Dinero con el que empieza el casino
apostador = 10; % Dinero con el que empieza el apostador

casino_zero = casino;
apostador_zero = apostador;

num_evento = 0; % Número de veces que han apostado, que se inicia en cero.

dinero_apostador(casino) = 0; % Tentativamente pongo este vector para
% hacer más rapida la asignición de memoria. Pero al final el vector puede
% ser más grande o pequeño que esta asignación

% Todas las apuestas son iguales, de una unidad. Es decir, en un juego
% se pierde o gana una unidad.

while (apostador > 0 && casino > 0)
num_evento = num_evento +1;
dinero_apostador(num_evento) = apostador;
moneda = rand(1); % rand brinda números pseudoaleatorios entre 0 y 1
if moneda >=0.5 % gana el casino
casino = casino +1;
apostador = apostador -1;

else % gana apostador
casino = casino - 1;
apostador = apostador +1;
end
end
porciento_perdida_casino = 100*max(dinero_apostador)/casino_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
porciento_ganancia_apostador = 100*(max(dinero_apostador)- apostador_zero)/apostador_zero; % porcentualmente cuanto es lo máximo que
% le puedo sacar al casino
num_juegos = num_evento; %cuantos juegos realizamos

% Vizualización
axes('fontsize',14,'fontweight','b')
plot(dinero_apostador,'b', 'LineWidth',6)

xlabel('Número de juego, N', 'fontsize',20,'fontweight','b')
ylabel('Dinero del apostador, D', 'fontsize',20,'fontweight','b')
title(['Al principio, el dinero del casino es ', num2str(casino_zero./apostador_zero), ' veces más grande que el del apostador'], 'fontsize',20,'fontweight','b')
set(gca, 'Fontsize',18, 'fontweight','b')
axis([0, num_juegos, 0, max(dinero_apostador)]);

salida = [porciento_ganancia_apostador, porciento_perdida_casino, num_juegos];

% fin del guión

¿Cuanto ruido puede resolver el proceso de correlación?

Comportamiento del proceso de correlación ante un incremento del ruido aplicado a una imagen 
Resumen
Basado en una entrada anterior, me dio mucha curiosidad saber cómo se comportaría el proceso de correlación ante un incremento controlado de ruido en las imágenes. ¿Siempre tendrá un buen rendimiento?

Así que seleccione una imagen – la original para este estudio – y le añadí ruido por medio de un Corel-Photo-Paint, para crear las imágenes “ruido”. Así, cree diez imágenes que presentaban ruido “gaussiano aleatorio“ en un intervalo de 0 a 100%, con incrementos de 10% para cada una.

Después, le hice unas ligeras modificaciones al código original de identificación de imágenes por correlación, de modo que me mostrara la tendencia del comportamiento del promedio-de-los máximos-de-la-correlación de las imágenes en cuestión (deben ver el código para entender este proceso).

El resultado es la imagen que ilustra esta entrada. Cuando la imagen no presenta ruido, el proceso de correlación de la imagen consigo misma es igual a 1 (el valor ideal). En contraste, cuando la el ruido es máximo la correlación es aprox. 0.6. Más aún la tendencia de de este estudio es una línea recta; en otras palabras, el proceso de correlación es lineal en función del ruido añadido. Lo cual es una buena noticia para quienes usamos esta función para diversos estudios comparativos.

Sin embargo, falta hacer este estudio con ruido programado desde Matlab u otro software con mayor control de las variables del ruido añadido. De modo que sea claro cuál es el umbral cuantitativo que muestre cuando este proceso sea inadecuado.

Preguntas para pensar
1) ¿Cómo se comportara este proceso ante ruido armónico?
2) Por si sólo este proceso no identifica el tipo de ruido. ¿Solo sirve para discriminar?, ¿Cómo se puede usar como filtro para mejorar la imagen?

Ejercicios
1) Use Matlab para añadir ruido a la imagen de modo sistemático. Analice los archivos generados. ¿Cómo se comporta el proceso de correlación ante el ruido blanco, el rosa, y otros?

Solución al ejercicio: Identificando huellas digitales simuladas con Matlab (video y script)



Resultado gráfico del análisis de las imágenes. El archivo núm. 14 corresponde al  análisis de la misma imagen. De toda la base datos, el archivo núm. 3 es el que se parece más al archivo núm. 14



Resumen
Hace unos días propuse un ejercicio estilo el programa de televisión CSI. Dibuje unos cuantos garabatos como si fueran huellas digitales; a una de ellos lo llamé "asesino" al resto "sospechoso_num" --a todas las imágenes les añadí un poco de ruido--. Pues bien. revisando la pequeña base de datos uno se puede dar cuenta que el archivo asesino coincide con la imagen del sospechoso número 3. El ejercicio trata de emplear código Matlab para hacer esta identificación.

Pueden existir muchas soluciones, aquí les muestre el uso de la función correlación estadística  (CORR, en Matlab) para hacer esta identificación automática. La correlación permite comparar señales, se usa mucho para estimar ajustes de curvas a datos experimentales, entre otras aplicaciones. En el caso ideal, cuando la imagen se compara consigo misma, la correlación es uno; cuando las imágenes son totalmente dispares, la correlación vale cero. En este caso, los análisis que más se aproximen a 1 indican mayor probabilidad de tener identificación de nuestro "asesino". 

Ahora bien, nos apoyamos en la obtención del máximo (MAX en Matlab) y luego del promedio (MEAN en Matlab) para tener el valor más representativo de la mayor variación que se puede presentar en el análisis. 

La figura que ilustra este post muestra el  resultado del script --que se presenta al final de la entrada-- . Podemos ver que la comparación de la imagen consigo misma da 1, y que el archivo 3 es el que más se acerca al valor ideal. Mientras que los demás valores están bastante alejados del valor del archivo núm. 3. Por lo cual la identificación es exitosa.

Preguntas para pensar
1) Menciona otras aplicaciones de la función de correlación.
2) ¿Mediante que otra función se puede hacer el análisis de identificación?

Ejercicios
1) A la base de datos de imagenes asocie una base datos con nombres ficticios. (Por ejemplo: alfa, beta, gamma, etc.)   Modifique el guión para que la pantalla le de el nombre del sospechoso más probable.
2) Dibuje sus propios garabatos y haga experimentos. Por ejemplo, a una imagen añada diferentes cantidades y clases de ruido.  Identifique cuales son los limites de este análisis.
3) Sí las imágenes se giran, la identificación es valida. Haga experimentos.
4) La función correlación es la que más tiempo consume en el guion. ¿Cómo puede aumentar el tiempo de calculo para hacer más rápido el proceso?

% INICIO DE GUION EN MATLAB
%Cierra todas las ventanas emergentes, limpia la memoria y la pantalla
close all; clear; clc;
Ases = imread('asesino','jpeg'); %Lee la imágen y la asocia a una matriz
G = fft2(Ases); %Calcula la transformada de fourier en 2D de la imagen
m(13) = mean(max(corr(G,G))); %Se compara la imagen consigo misma

% Con este for cargamos las imagenes, las procesamos y obtenemos un valor
% significativo
for n =1:12
nom_arch=['sospechoso', num2str(n)]; %esta cadena de caracteres cambia como lo hace n
Sosp =imread(nom_arch, 'jpeg'); %se carga la imagen a trabajar
F = fft2(Sosp); % se obtiene la trasformada de Fourier
m(n) = mean(max(corr(F,G))); % Se comparara la imagen con un estándar
%m(i).- Se guarda el valor del i-ésimo sospechoso en la entrada m(i)
end

% Se define el contador x, para graficar
x = 1:13;
% Grafica de x, m. Utilizo puntos rojo y lineas verticales azules
h = stem(x,m,'fill','--');
set(get(h,'BaseLine'),'LineStyle',':')
set(h,'MarkerFaceColor','red')

%Formato de la gráfica
xlabel('Etiqueta para el de sospechoso (número)');
ylabel('Correlación entre imagenes');
axis([0 14 0 1.1]);

% clear
% clc
%fin del script

Cómo hacer interfaces gráficas para usuario (GUI) con guide de Matlab

Imagen vía: smallbiz
Del el documento de CONATEC 2002 hemos visto varios ejemplos del uso de GUIDE para hacer GUI en Matlab, espero que puedan hacer TODOS los ejemplos.

Código Matlab para hacer un contador de franjas de interferencia




Resumen
Esta es una aplicación sencilla de Matlab para analizar imágenes. Se trata de cargar la imagen segmentada de un interferograma - sus franjas de interferencia deben ser verticales -. La imagen se transforma en matriz, se colapsa en vector, y se transforma en datos de ceros y unos. Al barrer la matriz se puede contar el numero de transiciones ,el cual es proporcional al número de franjas.


Muchos de los comandos que se emplean en este ejemplo los hemos explicado en anteriores entradas, y se mencionan sus funciones en el video.

Descarga el archivo: contador_de_franjas.rar que contiene el código, las imagenes originales, y las imágenes segmentedas para que puedas hacer los ejercicios propuestos.

Ejercicios
1) Optimice la velocidad de ejecución de este código. Comience eliminando las lineas de código que no se usan más adelante.
2) ¿Como se pueden eliminar los artefactos de ruido?, de modo que se mejore el desempeño del conteo de franjas
3) Transforme este guión en una función
4) Integre a video este código (esta tarea es avanzada)

Presentación de funciones de transferencia en Matlab

Estas son notas que hemos visto en clase. La idea es que practiquen sus habilidades para hacer código en Matlab.

Si ven un error en la presentación, dejen un comentario ;)

Ejercicio: Jugando al detective CSI con Matlab

He creado una pequeña base de datos de varias imágenes de garabatos. A una de ellas le he llamado asesino, el resto las he llamado sospechoso. El ejercicio consiste en escribir código Matlab para identificar de las imagenes de sospechosos al  patrón que más se parezca a la imagen que llame asesino.

Las imágenes contienen un poco de ruido gaussiano, por lo cual hay que filtrar ese ruido. Dependiendo de su desempeño, se puede hacer más interesante este ejercicio.

Por su puesto estos temas, en la vida real, son más complicados. Las bases de datos son más grandes, se deben de identificar varios puntos de coincidencia, el ruido es mucho, mucho mayor. Con todo, es un buen ejercicio. 

En caso de tener cualquier clase de duda, escriban un comentario en el blog.

Tres ejemplos de matemáticas discretas

Pueden consultar los post relacionados con los temas que vimos el día de hoy:



Por su puesto, revisen a detalle el excelente ejemplo de filtraje de electrocardiogramas. Finalmente, consulten el código para hacer la primera derivada. Uds. pueden hacer el código para hacer la primera integral de una función discreta.

¿Me falto mencionar algo? Dejen un comentario si necesitan más información u omití algo importante. 





Jugando con perfiles e histogramas en imágenes de Matlab

Entregar reporte de resultados, DE ESTA ENTRADA, antes del 19  de septiembre  2012

Las imágenes de prueba están en C:\MATLAB\toolbox\images\imdemos
Pruebe las siguientes funciones:
           
imagen bacteria, archivo
en escala de grises
X = imread('bacteria.jpg','JPG');     % probar al menos tres imágenes distintas
image(X);
colormap(map);
colormap(hot); colorbar;
pause
image(X);
liney=X(:,100);     % column profile (vert)
linex=X(60,:);       % row profile (horiz)
hold on; plot(linex);



Resultado de la primera rutina
1. Pruebe otros perfiles sin exceder las dimensiones de la imagen (recordar “size(X)”) e interprete dichos perfiles en función de la imagen

2.  Los valores de gris de los píxeles de una imagen son una población cuya distribución (frecuencia) permite caracterizar ciertas propiedades de la imagen, sin preservar información espacial (aunque depende de dónde se toman las muestras.   Pruebe las funciones de histograma de una señal, pero ahora en una imagen.   Implemente usted su propia función para calcular un histograma y grafiquelo en diferentes escalas.

Sugerencia (ejercicio: corregir índices definiendo por ejemplo H como subvector de otra matriz ):

% X se define como arriba:  una matriz que contiene la imagen.
H=zeros(256,1);    % iniciar vector de histograma a 0
[m,n] = size(X);    % obtener dimensiones
for i=1:m
  for j=1:n
     H(X(i,j)+1) = H(X(i,j)+1)+1;   % usar datos como direcciones para contra frecuencias
  end
end
plot(H);

3.  Calcule ahora su histograma en escala logarítmica, muestreando la imagen de manera uniforme; pruebe la función random.   Observe los detalles del histograma y pruebe otras escalas.  Comente sus observaciones.

4.  Si N es el total de pixeles, y se muestrean M. Calcule histograma de zonas de interés (un rectángulo que contenga las bacterias, por ejemplo).  Compare con histogramas del fondo en distintas áreas.  ¿Cómo se relacionan con el histograma global?   Repita 4. para una zona de interés (no del fondo).  

6. Compara la implementación de arriba con las funciones de histograma predefinidas en Matlab (úselas).

7.  Aumente el intervalo dinámico de los valores de gris (o sea el contraste) usando la información del histograma (recordar lo que se vio en clase), en uno global y en dos locales.  Para esto será necesario modificar los valores de gris de acuerdo al histograma.

8.   ¿Cómo definir y almacenar  su propia paleta de colores?  Diseñe una que vaya de café obscuro a color crema y de crema azul claro, de azul claro a verde.

Cómo transformar una figura de Matlab en una imagen portable.




Resumen
En esta ocasión se muestran las bases para que nuestras figuras en Matlab se exporten como archivos de imagen y se puedan incorporar en un procesador de textos.
Básicamente, existen cuatro caminos para exportar:

1) El copy-page; en la barra de menús de la imagen, damos clic en Edit y luego en Copy figure. Ya después podemos pegar nuestra información en otro programa, tal vez powerpoint.

2) Salvar como. Utilizando la interface gráfica de la figura Matlab, podemos cómodamente salvar nuestra figura en diversos formatos de imagen (png, pdf, jpg, etc.). Únicamente hay que seguir las instrucciones

3) Uso del comando print. Este comando es muy versátil y permite guarda las imágenes en varios formatos, controlar la calidad de pdi de la imagen e incluso automatizar el proceso de guardar-nombrar archivos. Además de ser el de mayor calidad. Mejor aún, utilizando previamente los comandos:

Set(gcf, ‘InvertHardcopy’, ‘off’)

Así, se preserva el color del fondo que nosotros escogimos previamente para la figura.

4) Impresión de pantalla. En el video omitimos esta opción para salvar las imágenes, pues no es propio de Matlab. El botón de ImprPant es muy general y depende de la resolución de tu monitor, suele mostrar elementos innecesarios que se deberían de corregir en un programa que manipule imágenes. Cuando se trabaja con muchas imágenes y se busca la mejor calidad, este camino se debe evitar

Contar con gráficas de alta calidad visual y de datos es vital para que nuestra publicación, tesis o trabajo escolar sea aprobado por los revisores; por ello no se debe descuidar la presentación de nuestras imágenes.

Preguntas para pensar
1) ¿Qué determina que la imagen sea de alta calidad?
2) ¿Por qué usar 300 dpi en esta clase de imágenes?, ¿Siempre es así?

Ejercicios
1) Introduzca en un ciclo for el comando print, de modo que obtenga 10 imágenes secuenciadas de una senoidal a la que se le varia la frecuencia o la amplitud.

Juntas, pero no revueltas: sub-gráficas en una misma figura de Matlab

Ejemplo del uso de subplot
El comando de Matlab subplot es lo suficientemente versátil para darle sendos ejes y características adicionales a las gráficas que coloquemos en una misma imagen.

Efectivamente, basta con indicar como se compondrá la matriz de la imagen (a,b) y que espacio p ocupará cada una de las gráficas; es decir, subplot (m, n, p) hace la división del espacio de la figura. Matlab asignara el espacio con en paneles regulares para cada gráfica. Este es un ejemplo simple de una rutina aplicada una figura compuesta de 2 gráficas.

Asignación simple de paneles
x= 1:0.1:2*pi;
subplot(2,1,1), plot(x)
subplot(2,1,2), plot(sin(x))

En general, el comando subplot brinda una figura de configuración simétrica de paneles, que son donde se colocan las gráficas. Y cada panel es independiente de los otros. Sin embargo, si el parámetro p es una matriz, entonces se puede ocupar más de un panel para una gráfica. Por tanto, en una misma figura se puede colocar una gráfica grande y otras más pequeñas. Por ejemplo usando el siguiente código:


Asignación asimétrica de paneles
x= 1:0.1:2*pi;
subplot(2,2,[1 2]); plot(sin(x))
subplot(2,2,3); plot(log(x))
subplot(2,2,4); plot(exp(x))

Finalmente, hay que destacar que se puede utilizar el subplot dentro de ciclos de programación, de forma que se pueden automatizar colecciones de imágenes que siguen una línea de historica. Por ejemplo:




Ejemplo del uso de  subplot
en un ciclo for
y = zeros(4,15); % se inicializa un vector, para ser más eficiente
for k = 1:4 % seran cuatro colecciones de datos
y(k,:) = rand(1,15); % se crea un vector de 15 elementos aleatorios
subplot(2, 2, k) % el índice se usa para dar orden a la secuencia de gráficas
plot(y(k,:)); % se hace la gráfica
end

Precauciones
Utilizando scripts, solamente se pueden crear estas gráficas cuando ya se cuenta con la matriz completa. En otro caso hay que utilizar comandos como drawnow, del que ya anteriormente hemos mostrado unos ejemplos.

Preguntas para pensar
1) Describa un ejemplo especifico donde los subplot en un ciclo for son aplicados


Ejercicios
1) Obtenga la siguiente imagen utilizando diferentes comandos de Matlab

Ejercicio de esta entrada

Dibujando gráficas como si fueran animaciones en Matlab

Manos dibujando
Matlab permite fácilmente crear gráficas; pero ¿qué pasa cuando queremos hacer una animación de esa gráfica? Por ejemplo, ir presentado cómo se produce la trayectoria de un cuerpo en movimiento. Con animaciones esta tipo de gráficas son espectaculares en cualquier presentación. En una entrada anterior trate un poco sobre este tema utilizando fotogramas.

Aquí, presentare ejemplos donde no se crea video.

Ingenuamente podemos usar un código simple, como el siguiente.

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
end

Efectivamente, aunque no aprovechamos la ventaja de la preasginación de memoria, la idea es que no es importante la velocidad del cálculo, sino que se cuente con la construcción dinámica de la curva; por ello, el comando plot tiene ir dentro del ciclo for.

Sin embargo, hasta este punto, el código es inútil. Pues la reserva de memoria de los cálculos es independiente y asíncrona de la memoria gráfica. Es decir la gráfica se producirá cuando se cuente con el vector completo.  La solución es insertar un comando que actualice todas las ventanas ese comando es drawnow.

Con todo, nuestro código se puede estar ejecutando muy rápido; por lo que hay que añadir dentro del código una pausa (comando pause) al que se le puede controlar el tiempo de ejecución. Digamos que esperamos .3 segundos por iteración. De tal modo que nos da bastante tiempo para ver con comodidad los resultados, pero esto es útil cuando los cálculos son pocos.

Mi ejemplo de código entonces es:

figure(1);
for i=1:1000
T(i)=cos(i);
plot(T);
drawnow;
pause(0.3)
end

El factor comet

El comando comet es otra opción para darle movimiento a la construcción de nuestras gráficas. Sin embargo, para pocos puntos su ejecución es demasiado rápida para apreciarse. Por lo cual se requieren muchos puntos para poder apreciar la construcción. Una alternativa es disminuir el paso entre punto y punto o aumentar el intervalo del vector a graficar. Lamentablemente, este comando no tiene una opción para controlar la velocidad, y aunque se puede alterar el código original para cambiar la velocidad, no es muy recomendable si estas iniciando el arte de hacer código para Matlab.

Pero si sientes que tu experiencia es suficiente para hacerlo, pues te recomiendo ir a los foros del mismo Matlab Central donde te puedes dar una idea de cómo hacer tal alteración: foro1, foro2


El siguiente video te muestra el código y los resultados que obtengo.



Preguntas para pensar 

1) Sin que se cree un video en que casos particulares es más útil esta opción que la de crear un video en Matlab. Revisa nuestra entrada anterior  sobre la  creación de animaciones.

Ejercicios

1)  Realiza una rutina donde se pueda visualizar al mismo tiempo varias gráfica en un una sola ventana, puedes usar el comando subplot

2) Aplica esta solución para ver la dinámica una gráfica de tres variables (X,Y,Z) que cambia con el tiempo.

Related Posts Plugin for WordPress, Blogger...