5

PNG画像の画像操作を行っています。次の問題があります。imwrite() 関数で画像を保存すると、画像のサイズが大きくなります。たとえば、以前の画像は 847KB で、保存すると 1.20 MB になります。ここにコードがあります。画像を読み込んで保存しただけですが、サイズが大きくなります。圧縮パラメーターを設定しようとしましたが、役に立ちません。

Mat image;
image = imread("5.png", -1); 

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);
compression_params.push_back(0);

imwrite("output.png",image,compression_params);

何が問題になる可能性がありますか?助けてください。ありがとう。

4

2 に答える 2

5

PNG には、圧縮に影響を与えるいくつかのオプションがあります: deflate 圧縮レベル (0-9)、deflate 戦略 (HUFFMAN/FILTERED)、および内部予測エラー フィルター (AVERAGE、PAETH...) の選択 (または動的選択の戦略)。 . OpenCV では最初のものしか変更できないようで、2 番目のデフォルト値は適切ではありません。だから、あなたはそれと一緒に生きなければならないようです。

更新:ソースを調べると、(苦情の後) 圧縮戦略の設定が追加されたようですが、文書化されていません。そのソースが公開されているのだろうか。オプション CV_IMWRITE_PNG_STRATEGY を Z_FILTERED で設定してみて、何が起こるかを確認してください。

パラメータの詳細については、リンクされたソース コードを参照してください。

于 2012-12-04T14:44:34.397 に答える
1

@Karmar、最後の編集から何年も経ちました。

私は 2021 年 6 月にあなたと同様の混乱を経験しました。

PNG ファイルにはmodeと呼ばれるものがあるようです。RGBここでは、 、P、の 3 つのモードだけに注目しましょうL。画像のモードをすばやく確認するには、Python を使用できます。

from PIL import Image
print(Image.open("5.png").mode)

基本的に、 を使用PLているときに属性8 bits/pixelRGB使用しているときに を使用します3*8 bits/pixel。より詳細な説明については、この素晴らしいスタックオーバーフローの投稿を参照できます: What is the difference between images in 'P' and 'L' mode in PIL?

ここで、OpenCV を使用して PNG ファイルを開くと、ファイルが保存されたモードに関係なく、3 つのチャネルの配列が得られます。データ型 の 3 つのチャネルuint8。つまり、imwriteこの配列をファイルに保存すると、どんなに圧縮しても、PまたはLモードで保存された元のファイルに勝るものはありません。

@Karmar は、この問題をすでに解決していた可能性があると思います。今後の読者のために、独自のモードを確認してください5.png

于 2021-06-10T02:12:12.647 に答える