¿Cómo puedo guardar una imagen alterada en MATLAB?

Quiero leer una imagen en MATLAB, dibujar un rectángulo sobre ella y luego guardar la imagen.

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 probado saveas() , pero eso me da una imagen ENORME. ¿Hay alguna manera de usar saveas() y hacer que la imagen guardada tenga el tamaño correcto?

El motivo por el que el rectángulo no aparece en la imagen guardada se debe a que no está modificando la variable im , que almacena los datos de la 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í.

Típicamente, las imágenes leídas en MATLAB se cargan como una matriz N por M3 (es decir, una imagen de píxeles N por M con valores RGB (rojo-verde-azul) para cada píxel). Por lo general, los datos de imagen son un tipo de datos uint8, por lo que los valores RGB van de 0 a 255. Si quisiera cambiar el valor RGB para un píxel determinado, 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 de modificar más de un píxel a la vez (es decir, un área rectangular), lo que requerirá que analice cómo indexar en matrices multidimensionales . Para obtener más detalles sobre cómo se leen los diferentes tipos de imágenes en MATLAB (es decir, color verdadero vs. indexado ), verificaría la documentación de imread .

a la pregunta en la parte superior, hay una solución bastante simple 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'); 

eso funcionó muy bien para mí cuando también dibujé un rectángulo en una imagen y traté de guardarlo. Si quieres seguir trabajando con él, solo agrega

 imread('image2.tif'); 

y sigue trabajando con eso 🙂

Saludos, Laura

De hecho, hay un error en el sitio The MathWorks sobre este problema. 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).

Usando el comando de 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'); 

Usa el código de arriba, modifica el parámetro -r hasta que se vea bien y ¡voilà!

siguiendo a jacobko respuesta. Establecer las figuras en las propiedades de posición del papel y unidad de papel y las unidades del eje y las propiedades de posición generalmente me da los resultados deseados sin tener que modificar la resolución. Asi que,

 >> 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, ahora será de 2.5cm por 2.5cm a una resolución de 80dpi sin el borde alrededor del eje.

Si quiere guardar im, primero debe modificar su valor. No estoy familiarizado con la función de rectángulo, pero 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'); 

Tenga en cuenta que el código anterior corresponde a la imagen en escala de grises, si su imagen es una imagen RGB, deberá hacer lo siguiente:

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

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

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

Cualquier nombre que podamos dar para guardar la imagen

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

 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 cr] ); % 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);