Frage OpenCV - imread (), imwrite () erhöht die Größe von png?


Ich wollte einige einfache Operationen an Dateien ausprobieren und begann mit dem Öffnen und Speichern von Dateien (ich benutze Python)

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

Nach dieser Operation mein Original image von 33kB verwandelt sich in das gleiche aussehende 144kB Bild.

Ich habe versucht, so etwas zu tun: 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)

Aber das ändert sich nicht viel (Größe auf 132kB verringert)

Das ist das Bild, mit dem ich arbeite:

enter image description here


8
2017-08-31 13:27


Ursprung


Antworten:


Einige PNG-Writer wie GIMP schreiben viel bessere komprimierte PNGs als Standard libpng, die von opencv verwendet wird. Sie können das Bild auch mit Imagemagick öffnen und speichern und sehen, welchen Unterschied dies macht (im Vergleich zu OpenCV).

Es gibt sogar spezialisierte Software, die versucht, PNGs, wie PNGcrush, besser zu komprimieren.

Können Sie das fragliche Bild bereitstellen? Ich möchte damit spielen, was die Optimierung der Dateigröße betrifft.


6
2017-08-31 13:57



Wie von ypnos angedeutet, ist Ihre Quelldatei jpg (auch wenn sie die Erweiterung png hat). Aus diesem Grund wird beim Speichern im png-Format mehr Platz benötigt, da Sie das Format (jpg to png) ändern.

Ersetzen Sie die letzte Zeile durch:

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

Und Sie werden sehen, dass sich die Größe nicht so sehr ändert.

Alternativ behalten Sie den Code so, wie er ist, aber verwenden Sie ein anderes Bild, z http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png


4
2018-05-26 09:42



Semi-verwandt, aber ich hatte das gleiche Problem mit matplotlib.image.imsave - Es würde ein 8-Bit-Graustufenbild als 16-Bit speichern, das die Größe sogar nach der Verwendung aufgebläht hat scipy.misc.bytescale um sicherzustellen, dass es sich um ein 8-Bit-Array handelt. Jedoch, scipy.misc.imsave speicherte es korrekt als ein 8-Bit-Bild.


1
2017-08-06 04:35