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 = 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