2009-12-04 13 views
9

Me gustaría mostrar una imagen y trazar algo en ella y luego guardarla como una imagen del mismo tamaño que la original. Mi código MATLAB es:¿Cómo guardo una imagen graficada y mantengo el tamaño de la imagen original en MATLAB?

figH = figure('visible','off'); 
imshow(I); 
hold on; 
% plot something 
saveas(figH,'1','jpg'); 
close(figH); 

Pero la imagen "1.jpg" resultante ha salvado áreas sin imagen en la trama, así como la imagen. ¿Como puedó resolver esté problema?

+0

¿Cuánto más? Un orden de magnitud? Un pequeño porcentaje? – Doresoom

+0

Lo siento, me refiero a no guardar el área sin imagen en la trama. – Tim

Respuesta

14

La razón de su nueva imagen es más grande que el original se debe a que la función SAVEAS ahorra toda la ventana de la figura, no sólo los contenidos de los ejes (que es donde se muestra la imagen).

Su pregunta es muy similar a otro SO question, así que primero voy a señalar las dos opciones principales abarcados por esas respuestas:

  • modificar los datos de imágenes en bruto: sus datos de imagen se almacena en variable I, por lo que puede modificar directamente los valores de píxeles de la imagen en I y luego guardar los datos de imagen modificados usando IMWRITE. Las formas en que puede hacer esto se describen en my answer y LiorH's answer. Esta opción funcionará mejor para modificaciones simples de la imagen (como agregar un rectángulo, como se refería a esa pregunta).

  • Modificar cómo se guarda la figura: También puede modificar la forma de guardar la figura para que coincida mejor con las dimensiones de la imagen original. Las formas en que puede hacerlo (utilizando las funciones PRINT y GETFRAME en lugar de SAVEAS) se describen en las respuestas de Azim, jacobko y SCFrench. Esta opción es lo que desearía hacer si estuviera superponiendo la imagen con etiquetas de texto, flechas u otros objetos de trazado más complicados.

Usar la segunda opción guardando toda la figura puede ser complicado. Específicamente, puede perder la resolución de la imagen si estuviera dibujando una imagen grande (digamos 1024 por 1024 píxeles) en una ventana pequeña (digamos 700 por 700 píxeles). Tendría que establecer la figura y las propiedades de los ejes para acomodar. Aquí está un ejemplo de solución:

I = imread('peppers.png');  %# Load a sample image 
imshow(I);      %# Display it 
[r,c,d] = size(I);    %# Get the image size 
set(gca,'Units','normalized','Position',[0 0 1 1]); %# Modify axes size 
set(gcf,'Units','pixels','Position',[200 200 c r]); %# Modify figure size 
hold on; 
plot(100,100,'r*');    %# Plot something over the image 
f = getframe(gcf);    %# Capture the current window 
imwrite(f.cdata,'image2.jpg'); %# Save the frame data 

La imagen image2.jpg de salida debe tener un asterisco rojo en él y debe tener las mismas dimensiones de la imagen de entrada como.

+0

Gracias, gnovice, probé el método de Azim. El área sin imágenes se ha ido, pero la imagen guardada tiene una resolución diferente a la de la imagen original. ¿Puede esto ser resuelto? ¡Saludos! – Tim

+0

@Tim: básicamente combiné las sugerencias de Azim y SCFrench y agregué una nueva solución a mi respuesta anterior. Con suerte, eso se encargará de las cosas por ti. – gnovice

Cuestiones relacionadas