【Python/Pillow(PIL)】JPEG画像の品質を指定して保存する

JPEG画像の保存では、品質を指定することで、画像のファイルサイズが変わります。

品質を良くすると、画像はキレイになりますが、ファイルサイズが大きくなります。

逆に品質を下げると、画像にノイズが乗りますが、ファイルサイズが小さくなります。

JPEG画像の品質を下げたときに乗る代表的なノイズとして、ブロックノイズモスキートノイズというものがあります。

品質を指定してJPEGファイルを保存するときの構文は以下の通りです。

Image.save(jpegfilename, quality = 75)

となります。

品質の値(quality)は初期値が75で指定可能なのは、0(低品質)~95(高品質)です。

サンプル

from PIL import Image

# 画像を開く
img = Image.open("Mandrill.bmp")

# JPEGで品質を指定して画像を保存する
img.save("Mandrill_q10.jpg", quality = 10)
img.save("Mandrill_q50.jpg", quality = 50)
img.save("Mandrill_q75.jpg", quality = 75)
img.save("Mandrill_q95.jpg", quality = 95)

# 画像を開く
img = Image.open("ImagingSolution.bmp")

# JPEGで品質を指定して画像を保存する
img.save("ImagingSolution_q10.jpg", quality = 10)
img.save("ImagingSolution_q50.jpg", quality = 50)
img.save("ImagingSolution_q75.jpg", quality = 75)
img.save("ImagingSolution_q95.jpg", quality = 95)

入力画像

評価用に読み込む画像は非圧縮のビットマップファイル(*.bmp)にしました。

一つは一般的な画像としてマンドリルの画像と、もう一つはモノクロでエッジの強い文字の画像にしました。

Mandrill.bmp
256×256画素24bitカラー
196,662バイト(非圧縮)
ImagingSolution.bmp
256×256画素8bitグレースケール
66,614バイト(非圧縮)

ファイルサイズの比較

quality 画像 サイズ(バイト)
10 4,465
50 13,189
75 19,908
95 47,073
10 3,594
50 6,629
75 8,487
95 15,452

等倍の画像で見ると qualityが50以上であれば、見た目に差はさほど感じられないでしょうか?

qualityが75と95とで比較すると、特に文字の画像を見ると、ほんの少しだけエッジがくっきり見えますが、ファイルサイズが倍近く異なります。

ノイズの比較

画像の中心付近を拡大して、ノイズを確認してみます。

quality = 10

quality = 50

quality = 75

quality = 95

quality = 10

quality = 50

quality = 75

quality = 95

マンドリルの画像ではquality = 50ぐらいまでが、四角いマス状のノイズ(ブロックノイズ)が確認できます。

文字の画像は、明暗の差が大きく、エッジが強い画像の代表例として用いたのですが、黒い周りにゴミのように見えるモスキートノイズが確認できます。

 

ノイズの出方やファイルサイズの両方を考えると、qualityの初期値である 75 ぐらいがバランスが良さそうです。

参考

https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.save

https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください