web-dev-qa-db-ja.com

OpenCV-imread()、imwrite()はpngのサイズを増やしますか?

ファイルに対していくつかの簡単な操作を試してみたかったので、ファイルを開いて保存することから始めました(Pythonを使用しています)

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

この操作の後、33kBの元のimageは同じ外観の144kB画像に変換されます。

私はこのようなことをしようとしました: 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)

しかし、これはあまり変わりません(サイズは132kBに減少しました)

これは私が使用している画像です:

enter image description here

13
Patryk

GIMPのような一部のpngライターは、opencvで使用される標準のlibpngよりもはるかに優れた圧縮PNGを記述します。 Imagemagickを使用して画像を再度開いて保存し、(OpenCVと比較して)どのような違いがあるかを確認することもできます。

Pngcrushのように、PNGをより適切に再圧縮しようとする特殊なソフトウェアもあります。

問題の画像を提供できますか?ファイルサイズの最適化に関して、それで遊んでみたいと思います。

6
ypnos

Ypnosで示唆されているように、ソースファイルはjpgです(拡張子がpngの場合でも)。そのため、png形式で保存すると、形式(jpgからpng)を変更するため、より多くのスペースが使用されます。

最後の行を次のように置き換えてみてください。

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

そして、サイズはそれほど変わらないことがわかります。

または、コードをそのままにして、 http://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png などの別の画像を使用します。

4
Jose Gómez

半関連ですが、matplotlib.image.imsaveで同じ問題が発生しました。scipy.misc.bytescaleを使用してサイズが膨らんだ後でも、8ビットのグレースケール画像が16ビットとして保存されます。 8ビット配列。ただし、scipy.misc.imsaveは8ビット画像として正しく保存しました。

1
Brian Burns

サードパーティのコマンドラインツールoptipngを使用して、何も失うことなくpngファイルサイズを再圧縮および縮小できます。

参照:

http://optipng.sourceforge.net/pngtech/optipng.html

https://github.com/johnpaulada/optipng

0
Eric