2009-02-22 27 views
12

Quiero leer una imagen en MATLAB, dibujar un rectángulo en ella y luego guardar la imagen.¿Cómo puedo guardar una imagen alterada en MATLAB?

Además, estoy aprendiendo MATLAB - por favor sea amable. Parece que debería ser simple, pero parece que no puedo hacerlo.

im = imread('image.tif'); 
imshow(im); 
rectangle('Position', [100, 100, 10, 10]); 
imwrite(im, 'image2.tif'); 

Aunque puedo ver el rectángulo en la imagen, la imagen guardada no muestra el rectángulo. ¿Cómo puedo guardar la imagen y hacer que aparezca el rectángulo?

FWIW, ya he intentado saveas(), pero eso me da una imagen ENORME. ¿Hay alguna manera de usar saveas() y hacer que la imagen guardada sea del tamaño correcto?

+0

para la última parte, esto posiblemente esté relacionado con: http://stackoverflow.com/questions/3600945/printing-a-matlab-plot-in-exact-dimensions-on-paper – Amro

Respuesta

10

Hay a bug at The MathWorks site en este momento. Lástima que no deletrean una respuesta real (como, en mi humilde opinión, la celebración de una regla a su monitor no es una solución real).

Con el comando print, debe cambiar manualmente el parámetro -r hasta que el tamaño de la imagen guardada coincida con el tamaño de la imagen de entrada. El parámetro -r especifica el DPI de la imagen guardada. Como la mayoría de las pantallas tienen diferentes DPI, no hay una solución única para todos.

im = imread('image.tif'); 
f = figure, imshow(im, 'Border', 'tight'); 
rectangle('Position', [100, 100, 10, 10]); 
print(f, '-r80', '-dtiff', 'image2.tif'); 

Usar el código anterior, ajustar el parámetro -r hasta que se vea bien, y voilà!

+0

Esto suena como una buena solución; solo 2 pequeños problemas. Primero, tener que probar varios ajustes para el parámetro -r es un poco molesto. En segundo lugar, creo que la imagen de salida incluiría el borde que aparece alrededor de los ejes, lo cual es indeseable en algunos casos. – gnovice

+1

Actualicé la función imshow() con el parámetro 'Borde' como 'ajustado' para que no aparezca el borde gris alrededor de la imagen. – jacobko

3

Si quiere guardar im, primero debe modificar su valor. No estoy familiarizado con la función rectángulo, pero se puede hacer lo siguiente (fuerza bruta):

im = imread('image.tif'); 
im(100:110,100)=0; 
im(100:110,110)=0; 
im(100,100:110)=0; 
im(110,100:110)=0; 
imshow(im); 
imwrite(im, 'image2.tif'); 

Nota, el código anterior es imagen en escala de grises para, si su imagen es una imagen RGB, se quiere tiene que hacer lo siguiente:

im(100:110,100,:)=0; 
.... 
18

la razón del rectángulo no aparece en la imagen guardada es porque no se está modificando la variable im, que almacena los datos de imagen. El rectángulo es simplemente un objeto de trazado que se muestra sobre la imagen graficada. Tienes que modificar los datos de la imagen en sí.

Normalmente, las imágenes leídas en MATLAB se cargan como una matriz N-por-M-por-3 (es decir, una imagen de píxel N-por-M con valores RGB (rojo-verde-azul) para cada píxel). Por lo general, los datos de imagen es un tipo de datos uint8, por lo que los valores RGB van de 0 a 255. Si usted quiere cambiar el valor RGB de un píxel dado, que haría lo siguiente:

im = imread('test.jpg'); % Load a jpeg image 
im(1,1,1) = 255; % Change the red value for the first pixel 
im(1,1,2) = 0; % Change the green value for the first pixel 
im(1,1,3) = 0; % Change the blue value for the first pixel 
imwrite(im,'new.jpeg'); % Save modified image 

Hay diferentes formas en que puede modificar más de un píxel a la vez (es decir, un área rectangular), lo que requerirá que investigue cómo indexar en multidimensional arrays. Para obtener más detalles sobre cómo se leen los diferentes tipos de imágenes en MATLAB (es decir, truecolor frente a indexed), verificaría la documentación para imread.

2

Es posible que pueda usar getframe para tomar la imagen modificada de la ventana de la figura. Creo que podría pasar los campos cdata y colormap de la estructura devuelta por getframe a imwrite como la imagen y su mapa de colores, respectivamente.

+0

getframe es una solución agradable y rápida . Sin embargo, creo que hay una advertencia. Las dimensiones de la imagen que crea dependerán del tamaño de la figura. Si trazó una imagen grande (digamos 1024 por 1024) en una ventana pequeña (digamos 700 por 700), perderá algo de resolución en su imagen. – gnovice

7

siguiendo hasta jacobko answer.Ajuste de las figuras paperposition y paperunits propiedades y el eje unidades y posición propiedades generalmente me da los resultados deseados sin tener que ajustar la resolución. Así,

>> im = imread('image.tif'); 
>> f = figure, imshow(im); 
>> r=rectangle('Position',[100, 100,10,10]); 
>> set(r,'edgecolor','b') % change the color of the rectangle to blue 
>> set(f,'units','centimeters','position',[1 1 2.5 2.5]) % set the screen size and position 
>> set(f,'paperunits','centimeters','paperposition',[1 1 2.5 2.5]) % set size and position for printing 
>> set(gca,'units','normalized','position',[0 0 1 1]) % make sure axis fills entire figure 
>> print(f, '-r80','-dtiff','image2.tif') 

La imagen de salida, image2.tif, será ahora 2.5CM por 2,5 cm en una resoultion de 80dpi sin el borde alrededor del eje.

+0

+1: Yo diría que esta es la mejor respuesta de "nivel de figura" de las que se dan. – gnovice

1
close all; clear; clc; 

r = 240 ; c = 320; 

fig = figure('Visible', 'off'); 
imshow(zeros(r,c)); 
hold on; 
plot([c-fix(c/2),c-fix(c/2)],[r-fix(r/2),r-fix(r/2)],'r*', 'MarkerSize', 10); 

% Sets position and size of figure on the screen 
set(fig, 'Units', 'pixels', 'position', [100 100 c r]); 

% Sets axes to fill the figure space 
set(gca, 'Units', 'pixels', 'position', [0 0 c+1 r+1 ]); 

% Sets print properties; Looks like 1 pixel = (3/4)th of a point 
set(fig, 'paperunits', 'points', 'papersize', [fix((c-1)*(3/4))+1 fix((r-1)*(3/4))+1]); 
set(fig, 'paperunits', 'normalized', 'paperposition', [0 0 1 1]); 

print(fig, sprintf('-r%d', ceil(72*(4/3))), '-dpng', 'image.png'); 


im = imread('image.png'); 
figure; imshow(im); 
12

a la pregunta en la parte superior, no es una solución bastante sencilla proporcionada por MATLAB:

% you so far 

im = imread('image.tif'); 
imshow(im); 
rectangle('Position', [100, 100, 10, 10]); 

% now you use "getframe" and "frame2im" 

f = getframe(gca); 
im = frame2im(f); 

imwrite(im,'image2.tif'); 

que funcionó muy bien para mí cuando yo también dibujé un rectángulo en una imagen y trató de salvarlo . Si desea seguir trabajando con él, sólo tiene que añadir

imread('image2.tif'); 

y seguir trabajando con él :)

Saludos, Laura

+1

guardando el marco gca hace el truco pero no guardará la imagen en su resolución original. – Luqman

+0

El tamaño de la imagen de salida es el mismo que el tamaño de la imagen de entrada, por lo que parece que conserva la resolución de la imagen original. Esta fue la solución para mí. ¡Muchas gracias! –

2
[f,p] = uigetfile('*.*'); 
I = imread([p,f]); 
imwrite(I,'img12.tif');% 

Cualquier nombre que podemos dar para guardar la imagen

Automáticamente se guardará en su carpeta y puede navegar por cualquier imagen.

Cuestiones relacionadas