2009-02-22 12 views
12

Voglio leggere un'immagine in MATLAB, disegnare un rettangolo su di esso e quindi salvare l'immagine.Come posso salvare un'immagine modificata in MATLAB?

Inoltre, sto solo imparando MATLAB, per favore sii gentile. Sembra che dovrebbe essere semplice, ma non riesco a farlo.

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

Anche se posso vedere il rettangolo sull'immagine, l'immagine salvata non visualizza il rettangolo. Come posso salvare l'immagine e mostrare il rettangolo?

FWIW, ho già provato saveas(), ma questo mi dà un'immagine ENORME. C'è un modo per usare saveas() e rendere l'immagine salvata della dimensione corretta?

+0

per l'ultima parte, questo è probabilmente correlato: http://stackoverflow.com/questions/3600945/printing-a-matlab-plot-in-exact-dimensions-on-paper – Amro

risposta

10

In realtà c'è a bug at The MathWorks site su questo problema. Peccato che non diano una risposta reale (come, IMHO, tenere un righello sul monitor non è una soluzione reale).

Utilizzando il comando print, è necessario modificare manualmente il parametro -r fino a quando la dimensione dell'immagine salvata corrisponde alla dimensione dell'immagine di input. Il parametro -r specifica il DPI dell'immagine salvata. Poiché la maggior parte degli schermi ha DPI diversi, non esiste una soluzione adatta a tutti.

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

Utilizza il codice precedente, modificare il parametro -r fino a che non guarda a destra, e voilà!

+0

Sembra una buona soluzione; solo 2 piccoli problemi. Per prima cosa, dover provare un sacco di impostazioni per il parametro -r è un po 'fastidioso. Secondo, penso che l'immagine di output includa il bordo che appare attorno agli assi, il che in alcuni casi è indesiderabile. – gnovice

+1

Ho aggiornato la funzione imshow() con il parametro 'Border' come 'stretto' in modo che il bordo grigio intorno all'immagine non appaia. – jacobko

3

Se si desidera salvare im, è necessario prima modificarne il valore. non ho familiarità con la funzione di rettangolo, ma si può fare quanto segue (forza 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, il codice di cui sopra è l'immagine in scala di grigi per, se l'immagine è un'immagine RGB, sarà bisogno di fare quanto segue:

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

il motivo per il rettangolo non viene visualizzato nella immagine salvata è perché non si sta modificando la variabile im, che memorizza i dati di immagine. Il rettangolo è semplicemente un oggetto grafico visualizzato sopra l'immagine tracciata. Devi modificare i dati dell'immagine stessa.

In genere, le immagini lette in MATLAB vengono caricate come una matrice N-by-M-by-3 (vale a dire un'immagine pixel N-by-M con valori RGB (rosso-verde-blu) per ciascun pixel). Di solito, i dati di immagine è un tipo di dati uint8, in modo che i valori RGB vanno da 0 a 255. Se si voleva cambiare il valore RGB per un dato pixel, si dovrebbe effettuare le seguenti operazioni:

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 

ci sono diversi modi in cui è possibile modificare più di un pixel alla volta (ad esempio un'area rettangolare), che richiede la ricerca di come indicizzare in multidimensional arrays. Per ulteriori dettagli su come vengono letti i diversi tipi di immagini in MATLAB (ad esempio truecolor rispetto a indexed), vorrei verificare la documentazione per imread.

2

Potrebbe essere possibile utilizzare getframe per catturare l'immagine modificata dalla finestra della figura. Penso che potresti passare i campi cdata e colormap della struttura restituita da getframe a imwrite come immagine e la sua mappa di colori, rispettivamente.

+0

getframe è una soluzione semplice e veloce . Tuttavia, penso ci sia un avvertimento. Le dimensioni dell'immagine che creerà dipenderanno dalle dimensioni della figura. Se si traccia una grande immagine (ad esempio 1024-by-1024) in una piccola finestra (ad esempio 700-da-700), si perderà una certa risoluzione sull'immagine. – gnovice

7

seguito della risposta jacobko.Impostazione figure paperposition e paperunits proprietà e l'asse unità e posizione proprietà solito mi dà i risultati desiderati, senza dover modificare la risoluzione. Quindi,

>> 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') 

L'immagine di output, image2.tif, verrà ora 2.5cm da 2,5 centimetri a resoultion di 80dpi senza il bordo attorno all'asse.

+0

+1: direi che questa è la migliore risposta "a livello di figura" di quelle date. – 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

alla domanda nella parte superiore, c'è una soluzione molto semplice fornita da 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'); 

che ha lavorato molto per me quando ho anche disegnato un rettangolo su un'immagine e ho cercato di salvarlo . Se si vuole continuare a lavorare con lui, basta aggiungere

imread('image2.tif'); 

e continuare a lavorare con esso :)

Saluti, Laura

+1

salvare la cornice gca fa il trucco ma non salverà l'immagine nella sua risoluzione originale. – Luqman

+0

La dimensione dell'immagine di uscita è uguale alla dimensione dell'immagine in ingresso, quindi sembra che mantenga la risoluzione dell'immagine originale. Questa è stata la soluzione per me. Grazie molto! –

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

Qualsiasi nome che possiamo dare per salvare l'immagine

Automaticamente verrà salvato nella cartella e sarà possibile sfogliare qualsiasi immagine.