2009-06-08 18 views
41

Esta pregunta comienza cuando termina this question. 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:En MATLAB, ¿cómo grafico en una imagen y guardo el resultado sin mostrarlo?

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á haciendo un montón de procesamiento de imágenes, comienza a ser un verdadero arrastre para mostrar cada imagen que crea; lo que más desea es 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?

Como alternativa, una forma rápida de poner un spline en un mapa de bits podría funcionar ...

Respuesta

41

Cuando se crea la figura se establece la Visibile propiedad a Off.

f = figure('visible','off') 

que en su 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 desea ver de nuevo que puede hacer

set(f,'visible','on') 
4

estoy ampliando 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 hacer que la figura de una matriz, tipo de "ayuda @ avifile/ADDFRAME", a continuación, extraer el sub-función llamada "getFrameForFigure". Es una función suministrada por Mathworks que utiliza algunas formas (actualmente) indocumentadas de extraer datos de la figura.

4

Aquí es una respuesta completamente diferente:

Si desea presentar una imagen hacia fuera, ¿por qué no guardar la imagen en lugar de toda la figura?

im = magic(10) 
imwrite(im/max(im(:)),'magic.jpg') 

Luego demuestre que funcionó.

imshow('magic.jpg') 

Esto se puede hacer para indexar y RGB también para diferentes formatos de salida.

20

La respuesta simple a su pregunta viene dada por Bessi y Mr Fooz: establezca el ajuste 'Visible' para la figura en 'apagado'. A pesar de que es muy fácil de usar comandos como IMSHOW y PRINT para generar figuras, voy a resumir por qué creo que no es necesariamente la mejor opción:

  • Como se ilustra en 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 haga 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 imagen directamente y guardarlo utilizando 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 la creación de un rectángulo negro sería algo como esto:

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'); 
Cuestiones relacionadas