image - optimized - ¿Cómo poner estas imágenes juntas?
seo images (1)
Variables dinámicas
Tenga en cuenta que si bien esto es posible , se considera una mala programación (consulte, por ejemplo, here , o este blog de Loren e incluso Mathworks en su documentation dice que no haga esto). Sería mucho mejor cargar sus imágenes directamente en una matriz 3D o en una estructura de celda, evitando nombres de variables dinámicas. Acabo de publicar esto para completar; Si alguna vez tiene que usar esta solución, debe cambiar a una matriz (cell) inmediatamente.
La esencia de los artículos vinculados sobre por qué
eval
es una mala idea, es que MATLAB ya no puede predecir cuál será el resultado de la operación.
Por ejemplo, MATLAB reconoce
A=3*(2:4)
para generar una matriz doble.
Si
eval
cosas, MATLAB ya no puede hacer esto.
MATLAB es un lenguaje interpretado, es decir, cada línea de código se lee y luego se ejecuta, sin compilar el código completo de antemano.
Esto significa que cada vez que MATLAB se encuentra con
eval
, tiene que detenerse, evaluar la expresión, luego verificar la salida, almacenarla y continuar.
La mayoría de los motores de velocidad empleados por MATLAB (JIT / MAGMA, etc.) no pueden funcionar sin predecir el resultado de las declaraciones y, por lo tanto, se apagarán durante la
eval
evaluación, lo que hace que su código sea muy lento.
También hay un aspecto de seguridad en el uso de
eval
.
Considera lo siguiente:
var1=1;
var2=2;
var3=3;
varnames={''var1'',''var2; disp(''''GOTCHA''''); %'', ''var3''};
accumvar=[];
for k=1:numel(varnames)
vname=varnames{k};
disp([''Reading from variable named '' vname]); eval([''accumvar(end+1)='' vname '';'']);
end
Ahora
accumvar
contendrá los nombres de las variables deseadas.
Pero si no configura el
accumvar
como salida, es mejor que no use un
disp
, sino, por ejemplo,
eval(''rm -rf ~/*'')
que formatearía todo su disco sin siquiera decirle que lo está haciendo.
Enfoque de bucle
for ii = 200:-1:1
str = sprintf(''Image_%d'',ii);
A(:,:,ii) = eval(str);
end
Esto crea tu matriz.
Tenga en cuenta que dejo que el bucle
for
ejecute hacia atrás, para inicializar
A
en su tamaño más grande.
Enfoque semi-vectorizado
str=strsplit(sprintf(''image_%d '',1:200),'' ''); % Create all your names
str(end)=[]; % Delete the last entry (empty)
%Problem: eval cannot handle cells, loop anyway:
for ii = 200:-1:1
A(:,:,ii)=eval(str{ii});
end
eval
no admite matrices, por lo que no puede conectar directamente el cellarray
str
.
Nombres de archivos dinámicos
A pesar de tener un título similar al anterior, esto implica tener estructurados los
nombres de los archivos
, por lo tanto, en el navegador de archivos, y no en MATLAB.
Estoy asumiendo archivos .jpg aquí, pero puede agregar todas las extensiones de imagen compatibles.
Además, asegúrese de tener
todas las
imágenes en una sola carpeta y ninguna imagen adicional con esa extensión, o debe modificar la llamada
dir()
para incluir solo las imágenes deseadas.
filenames = dir(''*.jpg'');
for ii = length(filenames):-1:1
A(:,:,:,ii) = imread(filenames{ii});
end
Las imágenes generalmente se leen como archivos
m*n*3
, donde
m*n
es el tamaño de la imagen en píxeles y los
3
derivan del hecho de que se leen como RGB por
imread
.
Por lo tanto,
A
ahora es una matriz 4D, estructurada como
m*n*3*T
, donde el último índice corresponde al tiempo de la imagen, y los tres primeros son su imagen en formato RGB.
Como no especifica cómo obtiene su doble
40*40
, he dejado la matriz 4D.
Podría ser que los lea y luego cambie a usar una interpretación
uint16
de RGB, que es un número único, lo que daría como resultado una variable
m*n*1*T
, que puede reducir a una variable 3D llamando a
A = squeeze(A(:,:,1,:));
Tengo
200
puntos de tiempo.
Para cada punto de tiempo, hay una imagen, cuyo tamaño es
40*40 double
, corresponde a este punto de tiempo.
Por ejemplo, la
image 1
corresponde al
time point 1
;
image k
corresponde al
time point k
(
k = 1,2,...,200
).
Los puntos de tiempo son
T = 1:200
, con las imágenes nombradas como
Image_T
, por lo tanto
Image_1
,
Image_2
etc.
Quiero juntar todas estas
200
imágenes.
El tamaño final es
40*40*200
doble.
La imagen final se parece a la imagen fMRI (
fmri_szX = 40
,
fmri_szY = 40
y
fmri_szT = 200
).
¿Cómo lograr eso?
¡Gracias!