and - title graphics matlab
En MATLAB, ¿cómo trazo una imagen y guardo el resultado sin mostrarlo? (5)
Esta pregunta comienza cuando esta pregunta termina. MATLAB tiene un sistema de visualización de imágenes potente y flexible que le permite usar los comandos imshow y plot para visualizar imágenes complejas y luego guardar el resultado. Por ejemplo:
im = imread(''image.tif'');
f = figure, imshow(im, ''Border'', ''tight'');
rectangle(''Position'', [100, 100, 10, 10]);
print(f, ''-r80'', ''-dtiff'', ''image2.tif'');
Esto funciona genial
El problema es que si está procesando una gran cantidad de imágenes, comienza a ser un verdadero arrastre para mostrar cada imagen que crea, en su mayoría solo desea guardarlas. Sé que podría comenzar a escribir directamente en una imagen y luego guardar el resultado. Pero usar plot / rectangle / imshow es muy fácil, así que espero que haya un comando que me permita llamar plot, imshow, etc., no mostrar los resultados y luego guardar lo que se habría mostrado. ¿Alguien sabe alguna solución rápida para esto?
Alternativamente, una forma rápida de poner una spline en un mapa de bits podría funcionar ...
Aquí hay una respuesta completamente diferente:
Si desea un archivo de imagen, ¿por qué no solo guarda la imagen en lugar de la figura completa?
im = magic(10)
imwrite(im/max(im(:)),''magic.jpg'')
Entonces prueba que funcionó.
imshow(''magic.jpg'')
Esto se puede hacer para indexar y RGB también para diferentes formatos de salida.
Cuando crea la figura, establece la propiedad Visibile en Off .
f = figure(''visible'',''off'')
Que en tu caso sería
im = imread(''image.tif'');
f = figure(''visible'',''off''), imshow(im, ''Border'', ''tight'');
rectangle(''Position'', [100, 100, 10, 10]);
print(f, ''-r80'', ''-dtiff'', ''image2.tif'');
Y si quieres verlo de nuevo, puedes hacer
set(f,''visible'',''on'')
Estoy expandiendo la solución de Bessi aquí un poco. Descubrí que es muy útil saber cómo hacer que la imagen abarque toda la figura y poder controlar el tamaño de la imagen de salida.
% prevent the figure window from appearing at all
f = figure(''visible'',''off'');
% alternative way of hiding an existing figure
set(f, ''visible'',''off''); % can use the GCF function instead
% If you start getting odd error messages or blank images,
% add in a DRAWNOW call. Sometimes it helps fix rendering
% bugs, especially in long-running scripts on Linux.
%drawnow;
% optional: have the axes take up the whole figure
subplot(''position'', [0 0 1 1]);
% show the image and rectangle
im = imread(''peppers.png'');
imshow(im, ''border'',''tight'');
rectangle(''Position'', [100, 100, 10, 10]);
% Save the image, controlling exactly the output
% image size (in this case, making it equal to
% the input''s).
[H,W,D] = size(im);
dpi = 100;
set(f, ''paperposition'', [0 0 W/dpi H/dpi]);
set(f, ''papersize'', [W/dpi H/dpi]);
print(f, sprintf(''-r%d'',dpi), ''-dtiff'', ''image2.tif'');
Si desea representar la figura en una matriz, escriba "help @ avifile / addframe", luego extraiga la subfunción llamada "getFrameForFigure". Es una función suministrada por Mathworks que utiliza algunas formas (actualmente) indocumentadas de extraer datos de la figura.
Puede usar -noFigureWindows para deshabilitar todas las figuras.
Bessi y el Sr. Fooz dan la respuesta simple a su pregunta: configure el ajuste ''Visible'' para que la figura se ''apague''. Aunque es muy fácil usar comandos como IMSHOW y PRINT para generar figuras, IMSHOW por qué creo que no es necesariamente la mejor opción:
Como lo ilustra la respuesta del Sr. Fooz, hay muchos otros factores que entran en juego al tratar de guardar figuras como imágenes. El tipo de salida que obtenga dependerá de muchas configuraciones de figuras y ejes, lo que aumenta la probabilidad de que no obtenga la salida que desea. Esto podría ser especialmente problemático si tiene las cifras establecidas como invisibles, ya que no notará ninguna discrepancia que pueda ser causada por un cambio en una configuración predeterminada para la figura o los ejes. En resumen, su salida se vuelve altamente sensible a una serie de configuraciones que luego tendría que agregar a su código para controlar su salida, como lo muestra el ejemplo del Sr. Fooz.
Incluso si no está viendo las figuras tal como están hechas, probablemente aún hará que MATLAB haga más trabajo de lo que realmente es necesario. Los objetos gráficos aún se crean, incluso si no se representan. Si la velocidad es una preocupación, generar imágenes a partir de figuras no parece ser la solución ideal.
Mi sugerencia es modificar realmente los datos de la imagen directamente y guardarlos usando IMWRITE . Puede que no sea tan fácil como usar IMSHOW y otras soluciones de trazado, pero creo que es más eficiente y ofrece resultados más sólidos y consistentes que no son tan sensibles a las diversas configuraciones de trazado. Para el ejemplo que das, creo que el código alternativo para crear un rectángulo negro se vería así:
im = imread(''image.tif'');
[r,c,d] = size(im);
x0 = 100;
y0 = 100;
w = 10;
h = 10;
x = [x0:x0+w x0*ones(1,h+1) x0:x0+w (x0+w)*ones(1,h+1)];
y = [y0*ones(1,w+1) y0:y0+h (y0+h)*ones(1,w+1) y0:y0+h];
index = sub2ind([r c],y,x);
im(index) = 0;
im(index+r*c) = 0;
im(index+2*r*c) = 0;
imwrite(im,''image2.tif'');