2012-08-31 16 views
5

ho voluto provare alcune semplici operazioni su file e ho iniziato con aprire e salvare file (io uso Python)OpenCV - imread(), imwrite() aumenta la dimensione del png?

image = cv2.imread("image.png") 
cv2.imwrite("image_processed.png", image) 

Dopo questa operazione il mio originale image da 33kB trasforma nella sua stessa immagine 144KB cercando.

Ho provato a fare qualcosa di simile: http://opencv.itseez.com/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imwrite#imwrite

params = list() 
    params.append(cv.CV_IMWRITE_PNG_COMPRESSION) 
    params.append(8) 

    image = cv2.imread("image.png") 
    cv2.imwrite("image_processed.png",image,params) 

Ma questo non cambia molto (dimensioni diminuito a 132KB)

Questa è l'immagine che sto lavorando con:

enter image description here

+0

Ho avuto lo stesso problema con la compressione png. Passare a 'scikit-image' e usare il suo' imsave' ha funzionato a meraviglia. – letmaik

risposta

5

Alcuni scrittori di PNG come GIMP scrivono PNG compressi molto meglio di libpng standard, che viene utilizzato di opencv. Puoi anche aprire e salvare di nuovo l'immagine con Imagemagick e vedere che differenza fa (rispetto a OpenCV).

C'è persino un software specializzato che cerca di ricomprimere meglio i PNG, come pngcrush.

Potete fornire l'immagine in questione? Mi piacerebbe giocare con esso, per quanto riguarda l'ottimizzazione della dimensione del file.

+0

Ho aggiunto l'immagine con cui sto lavorando. Considerando la tua risposta - mi rendo conto che ci sono programmi che mi permetteranno di ridurre le dimensioni di png ma vorrei usare la funzionalità di OpenCVs. – Patryk

+1

Hai fornito un file JPEG al posto del PNG originale, quindi non posso davvero dare un'occhiata alla compressione. Ma a parte questo: non otterrai una migliore compressione tramite OpenCV. Un'ultima cosa potrebbe essere che si memorizzano immagini a 16 bit anziché a 8 bit. Questo succede se usi una matrice CV_16U. – ypnos

2

Come suggerito da ypnos, il file sorgente è jpg (anche se ha l'estensione png). Ecco perché, quando lo salvi in ​​formato png, userà più spazio, mentre cambi il formato (da jpg a png).

provare a sostituire l'ultima riga con:

cv2.imwrite("image_processed.jpg",image,params) 

E vedrete che la dimensione non cambia più di tanto.

In alternativa, mantenere il codice così com'è, ma usare un'immagine diversa, come ad esempio http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

0

Semi-correlati, ma ho avuto lo stesso problema con matplotlib.image.imsave - sarebbe salvare un'immagine in scala di grigi a 8 bit a 16 -bit, che ha gonfiato le dimensioni, anche dopo aver usato scipy.misc.bytescale per assicurarsi che fosse un array a 8 bit. Tuttavia, scipy.misc.imsave lo ha salvato correttamente come immagine a 8 bit.

Problemi correlati