2012-12-05 12 views
72

Dire che ho un'immagine di dimensione 3841 x 7195 pixel. Vorrei salvare il contenuto della figura su disco, ottenendo un'immagine della dimensione esatta Specifico in pixel.Specificare e salvare una figura con le dimensioni esatte in pixel

Nessun asse, nessun titolo. Solo l'immagine Non mi interessa personalmente DPI, in quanto voglio solo specificare la dimensione dell'immagine acquisita sullo schermo nel disco in pixel.

Ho letto otherthreads e tutti sembrano convertire le conversioni in pollici e quindi specificare le dimensioni della figura in pollici e regolare i dpi in qualche modo. Vorrei evitare di affrontare la potenziale perdita di precisione che potrebbe derivare dalle conversioni da pixel a pollici.

ho provato con:

w = 7195 
h = 3841 
fig = plt.figure(frameon=False) 
fig.set_size_inches(w,h) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 
ax.imshow(im_np, aspect='normal') 
fig.savefig(some_path, dpi=1) 

senza fortuna (? Python si lamenta che la larghezza e l'altezza deve ogni essere inferiore a 32768())

Da tutto quello che ho visto, matplotlib richiede la dimensione cifra da specificare in inches e dpi, ma sono interessato solo a i pixel la figura occupa il disco. Come posso fare questo?

Per chiarire: sto cercando un modo per farlo con matplotlib e non con altre librerie di salvataggio delle immagini.

+0

Con matplotlib, non è possibile impostare la dimensione della figura direttamente in pollici. – tiago

+0

Intendevo in pixel ... – tiago

risposta

83

Matplotlib non funziona direttamente con i pixel, ma con dimensioni fisiche e DPI. Se si desidera visualizzare una figura con una certa dimensione di pixel, è necessario conoscere il DPI del monitor. Ad esempio, this link lo rileverà per te.

Se si dispone di un'immagine di 3841x7195 pixel è improbabile che il monitor sia così grande, quindi non sarà possibile mostrare una figura di quella dimensione (matplotlib richiede che la figura si adatti allo schermo, se si chiedere una taglia troppo grande si ridurrà alle dimensioni dello schermo). Immaginiamo che tu voglia un'immagine di 800x800 pixel solo per un esempio. Ecco come mostrare un'immagine 800x800 pixel mio monitor (my_dpi=96):

plt.figure(figsize=(800/my_dpi, 800/my_dpi), dpi=my_dpi) 

Quindi è fondamentalmente solo dividere le dimensioni in pollici dal vostro DPI.

Se si desidera salvare una figura di una dimensione specifica, è un'altra questione. I DPI dello schermo non sono più così importanti (a meno che non chiedi una figura che non si adatta allo schermo). Utilizzando lo stesso esempio della cifra di 800x800 pixel, possiamo salvarlo in diverse risoluzioni usando la parola chiave dpi di savefig. Per salvarlo nella stessa risoluzione dello schermo basta usare lo stesso dpi:

plt.savefig('my_fig.png', dpi=my_dpi) 

Per per salvare come immagine 8000x8000 pixel, utilizzare un dpi 10 volte più grande:

plt.savefig('my_fig.png', dpi=my_dpi * 10) 

Si noti che la l'impostazione del DPI non è supportata da tutti i backend. Qui, viene utilizzato il backend PNG, ma i backend pdf e ps implementeranno le dimensioni in modo diverso. Inoltre, la modifica del DPI e delle dimensioni influenzerà anche cose come il carattere. Un DPI più grande manterrà le stesse dimensioni relative di caratteri ed elementi, ma se si desidera caratteri più piccoli per una figura più grande è necessario aumentare le dimensioni fisiche anziché il DPI.

Tornando al tuo esempio, se si desidera salvare un'immagine con 3841 x 7195 pixel, è possibile effettuare le seguenti operazioni:

plt.figure(figsize=(3.841, 7.195), dpi=100) 
(your code ...) 
plt.savefig('myfig.png', dpi=1000) 

Nota che ho usato la figura dpi di 100 per adattarsi maggior parte delle schermate , ma salvato con dpi=1000 per ottenere la risoluzione richiesta. Nel mio sistema questo produce un png con 3840x7190 pixel - sembra che il DPI salvato sia sempre 0,02 pixel/pollice più piccolo del valore selezionato, che avrà un (piccolo) effetto su immagini di grandi dimensioni. Qualche altra discussione su questo here.

+2

È utile ricordare che le dimensioni del monitor (e quindi le dimensioni standard del browser e dell'interfaccia utente) sono normalmente in termini di 96 dpi - multipli di 96. Improvvisamente numeri come 1440 pixel sono significativi (15 pollici) quando si pensa in questo modo. –

+0

Impossibile far funzionare questo passaggio passando 'figsize' a' plt.figure'. La soluzione era di fare come suggeriscono le altre risposte e dopo averlo chiamato _without_ 'figsize', quindi chiama' fig.set_size_inches (w, h) ' – Trinidad

+0

Documenti per [' figure'] (https://matplotlib.org/api/ pyplot_api.html # matplotlib.pyplot.figure) e ['savefig'] (https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.savefig). – handle

10

questo ha funzionato per me, in base al codice, generando un 93MB png immagini con rumore del colore e le dimensioni desiderate:

import matplotlib.pyplot as plt 
import numpy 

w = 7195 
h = 3841 

im_np = numpy.random.rand(h, w) 

fig = plt.figure(frameon=False) 
fig.set_size_inches(w,h) 
ax = plt.Axes(fig, [0., 0., 1., 1.]) 
ax.set_axis_off() 
fig.add_axes(ax) 
ax.imshow(im_np, aspect='normal') 
fig.savefig('figure.png', dpi=1) 

Sto usando le ultime versioni PIP delle librerie Python 2.7 in Linux Mint 13

Spero che questo aiuti!

+2

L'impostazione di una risoluzione molto bassa significherà che i caratteri saranno difficilmente visibili, a meno che non si utilizzino caratteri di dimensioni molto grandi in modo esplicito. – tiago

+1

Probabilmente è meglio impostare un dpi più alto e dividere la dimensione in pollici (che è comunque arbitraria) di quel dpi. Oltre a questo, la tua configurazione produce un pixel esatto per la riproduzione dei pixel, grazie! – FrenchKheldar

+0

Sto provando a usarlo prima di salvare le immagini con gli elementi della trama (cerchi, linee, ...). Questo disturba l'ampiezza della linea, in modo che gli elementi siano appena visibili. – Gauthier

Problemi correlati