Categorías
Programación

Crear Archivos GIF en Octave y Matlab

En la actualidad, en cualquier trabajo técnico de cierto nivel, es habitual la programación y simulación de códigos en simuladores matemáticos como Matlab, o su «equivalente» gratuito Octave. Típicamente los resultados de esas simulaciones pueden formar parte de documentos, presentaciones y reuniones. En muchas ocasiones nos podríamos beneficiar de gráficos en movimiento para visualizar, explicar y transmitir mejor nuestras conclusiones. Es ahí donde el saber crear archivos GIF en Octave y Matlab puede jugar un papel importante.

1. Archivos GIF

Resumiendo, un archivo GIF se puede considerar un conjunto de archivos de imagen que se reproducen en bucle. Si dichas imágenes se seleccionan para que tengan un efecto de continuidad, un archivo GIF puede ser tan eficaz como un vídeo para transmitir la evolución o movimiento de, por ejemplo, una gráfica o función. Sin embargo, ya sea por simplicidad, por comodidad, o por desconocimiento, no se suelen ver este tipo de efectos en presentaciones técnicas.

Esta entrada pretende servir para que los lectores puedan incorporar el «movimiento» y la «evolución» en sus simulaciones de forma rápida y eficaz. Para ello se muestra un código simple que permite concatenar figuras y plots de resultados en un mismo archivo GIF.

2. Crear Archivos GIF en Octave

2.1 Código para crear archivos GIF en Octave

A continuación se muestra, comenta y explica, el código para generar un GIF compuesto de varios plots en Octave. En este ejemplo concreto se concatena la función x^n para varios valores de n en el intervalo de x de 0 a 1.

% Código para generar un GIF compuesto de varios plots en Octave
% En este ejemplo concatenamos la función x^n para varios valores de n.
% En el intervalo de x de 0 a 1.
x = 0:0.01:1;

% Propiedades del archivo .GIF que se va a generar
% Nombre
filename = 'electroagenda.gif';
% Tiempo en segundos que dura cada plot en el GIF
DelayTime = 0.5; 

% Crear figura vacía y asignarle número
figure(1)

% Bucle de actualización de función y archivo GIF
for n = 1:0.5:5
      
      % Generar la funcion (x^n) y hacer el plot
      y = x.^n;
      plot(x,y)
      title( 'www.electroagenda.com' , "fontsize", 16)
      drawnow
      
      % Procesado de Imagen
      % Asignar el plot a una trama
      frame = getframe(1);
      % Convertir la trama en una imagen RGB (3 dimensiones) 
      im = frame2im(frame);
      % Transformar muestras de RGB a 1 dimensión con un mapa de color "cm" 
      [imind,cm] = rgb2ind(im); 
      if n == 1;
          % Crear el archivo GIF
          imwrite(imind,cm,filename,'gif','DelayTime', 0.5, 'Compression' , 'lzw');
      else
          % Añadir al GIF cada nuevo plot
          imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime', 0.5 , 'Compression' , 'lzw');
      end
end

Es importante resaltar que las etiquetas ‘Compression‘ y ‘lzw‘ en las líneas 33 y 36 son necesarias para que el archivo resultante esté comprimido y ocupe menos espacio.

2.2 Resultados

En línea con el apartado anterior, el código mostrado se ejecutó en Octave versión 5.2.0 obteniendo el siguiente resultado en el archivo «electroagenda.gif«:

Crear archivos GIF en Octave y Matlab

De este modo queda patente que el código propuesto permite crear archivos GIF en Octave, concatenando los plots o figuras deseadas.

3. Crear Archivos GIF en Matlab

3.1 Código para crear archivos GIF en Matlab

A continuación se muestra el código equivalente en Matlab, que no igual, para el mismo ejemplo realizado en Octave en el apartado anterior.

% Código para generar un GIF compuesto de varios plots en Matlab
% En este ejemplo concatenamos la función x^n para varios valores de n.
% En el intervalo de x de 0 a 1.
x = 0:0.01:1;

% Propiedades del archivo .GIF que se va a generar
% Nombre
filename = 'electroagenda.gif';
% Tiempo en segundos que dura cada plot en el GIF
DelayTime = 0.5; 

% Crear figura vacía y asignarle número
figure(1)

% Bucle de actualización de función y archivo GIF
for n = 1:0.5:5
      
      % Generar la funcion (x^n) y hacer el plot
      y = x.^n;
      plot(x,y)
      title( 'www.electroagenda.com' , 'fontsize' , 16)
      drawnow
      
      % Procesado de Imagen
      % Asignar el plot a una trama
      frame = getframe(1);
      % Convertir la trama en una imagen RGB (3 dimensiones) 
      im = frame2im(frame);
      % Transformar muestras de RGB a 1 dimensión con un mapa de color "cm" 
      [imind,cm] = rgb2ind(im , 256); 
      if n == 1;
          % Crear el archivo GIF
          imwrite(imind,cm,filename,'gif','DelayTime', 0.5 , 'LoopCount' , Inf  );
      else
          % Añadir al GIF cada nuevo plot
          imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime', 0.5 );
      end
end

Las diferencias con el código de Octave son las siguientes:

  • En la línea 21 la etiqueta ‘fontsize’ no puede ir con comillas.
  • La función rgb2ind en Matlab (línea 30) requiere otro argumento para especificar el mapa de color. En este caso se ha añadido un argumento adicional con el número 256.
  • A diferencia de Octave, es necesario incluir la directiva ‘LoopCount‘ igual a ‘Inf‘ en la línea 33 para asegurar que el bucle se repite constantemente.
  • En las líneas 33 y 36, han desaparecido las referencias a la compresión. Ello se debe a que la función imwrite ya realiza esa función en Matlab sin requerir etiquetas adicionales.

3.2 Resultados

En línea con el apartado anterior, el código mostrado se ejecutó en Matlab versión 7.9 (R2009b) obteniendo el siguiente resultado en el archivo «electroagenda.gif«:

Crear archivos GIF en Matlab y Octave

De este modo queda patente que el código propuesto permite crear archivos GIF en Matlab, concatenando los plots o figuras deseadas.

4. Conclusiones

Este artículo muestra cómo crear archivos GIF en Octave y Matlab concatenando varias gráficas simuladas con dichas herramientas. Esto permite añadir efectos de movimiento y evolución en nuestros análisis. De este modo se facilita la comprensión de resultados y se pueden mejorar las presentaciones realizadas a otros colegas o clientes.

Por otra parte queda patente que la compatibilidad entre el código de Octave y Matlab, aunque elevada, no es absoluta. En funciones complejas y con mucha casuística, como las empleadas en este artículo, se observan pequeños matices que requieren modificar ligeramente el código para obtener resultados equivalentes.

Además habría que añadir la casuística debida a las diferentes versiones de Octave y Matlab. En este caso el código se ha probado únicamente en una versión para cada herramienta. Animamos a los lectores a que indiquen la compatibilidad del código propuesto en otras versiones de Octave y Matlab y lo indiquen en este enlace (pendiente de añadir).


Suscripción
Si te ha gustado esta contribución no dudes en suscribirte a nuestro boletín: