titles optimized images for example and alternative image matlab image-processing matlab-guide

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!