[Matlab] imshow(I,[])
Ciao a tutti, sto lavorando su un programma in Matlab, e dato che sono più o meno agli inizi ho ancora qualche difficoltà, quindi mi scuso subito se la domanda che sto per fare può essere stupida.
Allora, ho un'immagine che se visualizzo con:
viene completamente diversa se invece utilizzo:
Ho appena capito che la parentesi quadra vuota significa che presa la mia immagine in scala di grigio, il valore minimo in I assume il colore nero, e il valore massimo assume il colore bianco, "stirando" quindi il range a [0,255]; ma ora il mio problema diventa: come faccio a salvare un'immagine uguale a quella che viene visualizzata con imshow(I,[])?
Utilizzando
salvo l'immagine che viene visualizzata con la prima istruzione che ho scritto, ma non è quella che voglio.
Qualche idea?
Allora, ho un'immagine che se visualizzo con:
imshow(I);
viene completamente diversa se invece utilizzo:
imshow(I,[]);
Ho appena capito che la parentesi quadra vuota significa che presa la mia immagine in scala di grigio, il valore minimo in I assume il colore nero, e il valore massimo assume il colore bianco, "stirando" quindi il range a [0,255]; ma ora il mio problema diventa: come faccio a salvare un'immagine uguale a quella che viene visualizzata con imshow(I,[])?
Utilizzando
imwrite(I, 'img.jpg', 'jpg');
salvo l'immagine che viene visualizzata con la prima istruzione che ho scritto, ma non è quella che voglio.
Qualche idea?
Risposte
Prova con questo
Non ho Matlab sottomano, ma stando alla documentazione sembra quello che ti serve.
imwrite(I, [], 'img.jpg', 'jpg');
Non ho Matlab sottomano, ma stando alla documentazione sembra quello che ti serve.
imwrite(A,filename,fmt) writes the image A to the file specified by filename in the format specified by fmt.
[…]
imwrite(X,map,filename,fmt) writes the indexed image in X and its associated colormap map to filename in the format specified by fmt.
Purtroppo mi dà questi errori, che non penso di aver capito:
L'immagine che sto usando ha come valore <720x480 double>, nel caso potesse servire...
Error using imwrite>parse_inputs (line 529) The colormap should have three columns. Error in imwrite (line 419) [data, map, filename, format, paramPairs] = parse_inputs(varargin{:});
L'immagine che sto usando ha come valore <720x480 double>, nel caso potesse servire...
Pensavo che le due funzioni supportassero gli stessi parametri, invece no:
Questo non c'è nella documentazione di imwrite.
Mi viene il dubbio che il formato JPEG non supporti immagini in grayscale, quindi si aspetti sempre come input un'immagine a colori. Potresti provare ad usare il formato PNG, qualcosa di simile:
Oppure aspetta qualcuno che conosca queste funzioni (io purtroppo no
)
imshow(I,[low high]) displays the grayscale image I, specifying the display range as a two-element vector,
[low high].
Questo non c'è nella documentazione di imwrite.
Mi viene il dubbio che il formato JPEG non supporti immagini in grayscale, quindi si aspetti sempre come input un'immagine a colori. Potresti provare ad usare il formato PNG, qualcosa di simile:
imwrite(I,'img.png', 'png', 'bitdepth', '8');
Oppure aspetta qualcuno che conosca queste funzioni (io purtroppo no

Cosa ti impedisce di crearti semplicemente una matrice con i valori scalati come desideri? Probabilmente esiste una opzione per farlo, ma scalare i valori in modo che il minimo sia uguale a 0 e il massimo a 1 (oppure tra 0 e 255 a seconda di quello che stai cercando di fare) mi sembra abbastanza semplice.
La cosa che mi bloccava era il fatto che all'immagine che volevo salvare avevo applicato un algoritmo già esistente, che mi serve per poter poi fare delle valutazioni sull'immagine di risultato, e il problema era appunto che terminava con l'istruzione imshow(I,[]); quindi speravo che esistesse un modo semplice per poter salvare l'immagine in pochi passi, ad esempio magari inserendo un altro parametro in imwrite, o comunque evitando di fare modifiche all'algoritmo.
Il metodo che mi dici tu della matrice non l'ho provato perchè mi devo un attimo informare su come farlo e perderci un po' di tempo, dato che non so o non ricordo come va fatto. Nel frattempo ho cercato altro materiale su quell'algoritmo e ho trovato un'altra versione che ha risolto il mio problema, riporto il codice:
Vi ringrazio comunque per l'aiuto
Anche se sono riuscita a trovare la soluzione, scrivendo qui mi aiutate a ragionare e capire meglio su cosa sto lavorando
Il metodo che mi dici tu della matrice non l'ho provato perchè mi devo un attimo informare su come farlo e perderci un po' di tempo, dato che non so o non ricordo come va fatto. Nel frattempo ho cercato altro materiale su quell'algoritmo e ho trovato un'altra versione che ha risolto il mio problema, riporto il codice:
imshow(img,[]); img2 = (img-min(img(:)))/(max(img(:))-min(img(:))); imwrite(img2, 'out.jpg');
Vi ringrazio comunque per l'aiuto


img2 = (img-min(img(:)))/(max(img(:))-min(img(:))); imwrite(img2, 'out.jpg');
... che è esattamente quello che ti avevo consigliato quando ti ho detto di scalare manualmente l'immagine.. Infatti, la prima delle due righe sottrae il valore minimo ad ogni pixel dell'immagine e poi lo divide per la differenza tra il valore massimo e quello minimo dell'immagine. Fa insomma in modo che tutti i pixel dell'immagine abbiano un valore compreso tra 0 e 1..
Non ci sarei mai arrivata, pensavo a chissà quali calcoli. Devo fare più pratica, comunque grazie ancora

Le funzioni max e min calcolano il massimo e minimo di un vettore. img(:) trasforma invece tutta la matrice in un singolo vettore (se non ricordo male colonna) al quale puoi applicare max e min direttamente.