Pillow(PIL)

【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)にしました。

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

Pillow JPEG画像の品質を指定して保存 Pillow JPEG画像の品質を指定して保存
Mandrill.bmp
256×256画素24bitカラー
196,662バイト(非圧縮)
ImagingSolution.bmp
256×256画素8bitグレースケール
66,614バイト(非圧縮)

ファイルサイズの比較

quality 画像 サイズ(バイト)
10 Pillow JPEG画像の品質を指定して保存 4,465
50 Pillow JPEG画像の品質を指定して保存 13,189
75 Pillow JPEG画像の品質を指定して保存 19,908
95 Pillow JPEG画像の品質を指定して保存 47,073
10 Pillow JPEG画像の品質を指定して保存 3,594
50 Pillow JPEG画像の品質を指定して保存 6,629
75 Pillow JPEG画像の品質を指定して保存 8,487
95 Pillow JPEG画像の品質を指定して保存 15,452

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

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

ノイズの比較

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

Pillow JPEG画像の品質を指定して保存

quality = 10

Pillow JPEG画像の品質を指定して保存

quality = 50

Pillow JPEG画像の品質を指定して保存

quality = 75

Pillow JPEG画像の品質を指定して保存

quality = 95

Pillow JPEG画像の品質を指定して保存

quality = 10

Pillow JPEG画像の品質を指定して保存

quality = 50

Pillow JPEG画像の品質を指定して保存

quality = 75

Pillow JPEG画像の品質を指定して保存quality = 95

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

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

 

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

参考

Image Module
The Image module provides a class with the same name which is used to represent a PIL image. The module also provides a number of factory functions, including f...
Image file formats
The Python Imaging Library supports a wide variety of raster file formats. Over 30 different file formats can be identified and read by the library. Write suppo...

コメント

タイトルとURLをコピーしました