miércoles, 27 de abril de 2016

Leer imagenes en formato .img en Matlab

Es muy común que datos científicos como imágenes medicas o astronómicas se encuentren con la extensión .img. Al menos hasta la versión de 2016, Matlab no tiene una función para extraerlas pero en esta entrada veremos como hacerlo leyendo directamente los datos binarios con fopen(). Para este ejemplo usaremos los datos topográficos del altímetro láser de la sonda espacial Mars global Surveyor que pueden ser descargados aquí. Es muy importante saber de antemano lo siguiente::
  • Dimensiones de la imagen 
  • Formato y precisión de los datos
Esta información es necesaria para poder redimensionar y obtener correctamente el array de datos leídos con la función fread(). En este caso usaremos el mapa topográfico de la superficie de Marte a una resolución de 4 pixeles por grado (archivo megt90n000cb.img). Estos datos tienen un archivo de documentación asociado llamado megt90n000cb.lbl donde podemos leer que la imagen tiene dimensiones de 1440 por 720 px con datos en formato big-endian int16. Sabiendo esto escribimos el siguiente programa:

%Abrir archivo .img
fid = fopen('megt90n000cb.img','rb');
dim = [1440 720];
img = fread(fid,dim,'int16','ieee-be');
img = img';

%Gráfica 2D

figure(1)
imagesc(img)
xticklabels = 0:30:360;
xticks = linspace(1, size(img, 2), numel(xticklabels));
set(gca, 'XTick', xticks, 'XTickLabel', xticklabels)
yticklabels = -90:30:90;
yticks = linspace(1, size(img, 1), numel(yticklabels));
set(gca, 'YTick', yticks, 'YTickLabel', flipud(yticklabels(:)))
colormap(hot), grid('on'), title('Mars Orbiter Laser Altimeter Data')
xlabel('Longitud(E)'),ylabel('Latitud')

%Gráfica 3D (Valle Marineris)
figure(2)
marineris = img(325:478,1079:1322);
surf(marineris,'EdgeColor','none')
xlim([0 200]), ylim([0 150])
title('Valles Marineris')


Plots:


No hay comentarios: