2010-12-04 5 views
13

私はPythonでPILライブラリを使いこなしています。私は与えられたJPG画像の品質をどうやって判断するのでしょうか?私はJPGイメージを開いて何かをして元の品質でもう一度保存しようとします。 Image.save私は希望の品質を決定させてください:PythonでJPGの品質を調べる(PIL)

im.save(name, quality = x) 

私は元のものを抽出する方法が表示されません。今のところ私はちょうど推測して、 '品質'パラメータでバイナリ検索を行うことによって入力と同じサイズの出力ファイルを持っていますが、これは長期的な解決策ではありません:)
私も使ってみました:Image.infoしかし、私の画像の中には何の情報もありません(例: 'adobe'、 'icc_profile'、 'exif'、 'adobe_transform')
ヘルプ!

+1

関連情報:http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083それは正確に回復することはできません一般的に – unutbu

+0

保存された情報を減らすさまざまな方法があり、品質値がエンコーダのガイドラインに過ぎないため、JPEGファイルを圧縮するために使用される高品質の値ですが、@unutbuが指摘するように、いくつかのソフトウェアは英雄的な推測を行うことができます。 – andrewmu

+1

JPEGは損失の多いフォーマットなので、画像を開いて保存すると、「品質」オプションが同じ値に設定されていても画質が低下します。 –

答えて

22

PIL(とほとんどの場合、libjpegを使用するすべてのソフトウェア/ライブラリ)では、品質設定は、量子化テーブル(ref.)の作成に使用されます。 libjpegでは、品質番号はサンプルテーブルの値を「スケール」します(JPEG仕様のセクションK.1から)。他のライブラリーでは、異なる表に異なる品質(例:Photoshop、デジタルカメラ)が割り当てられています。

他の点で言えば、品質は量子化テーブルと等しいので、それは単なる数値です。

変更イメージを同じ「品質」で保存する場合は、同じ量子化テーブルを使用する必要があります。幸い、各JPEGには量子化テーブルが埋め込まれています。残念ながら、PILに保存する際には、量子化テーブルを指定することはできません。 libjpegに付属のコマンドラインユーティリティであるcjpegはこれを行うことができます。あなたはorginal JPEGからの量子化テーブルを抽出する方法を見つける必要があります

from subprocess import Popen, PIPE 
from PIL import Image, ImageFilter 

proc = Popen('%s -sample 1x1 -optimize -progressive -qtables %s -outfile %s' % ('path/to/cjpeg', '/path/ta/qtable', 'out.jpg'), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) 
P = '6' 
if im.mode == 'L': 
    P = '5' 
stdout, stderr = proc.communicate('P%s\n%s %s\n255\n%s' % (P, im.size[0], im.size[1], im.tostring())) 

は、ここで指定された量子化テーブルとJPEGを保存するいくつかの大まかなコードです。あなたが見つけ、サンプリングを設定することも必要になります

djpeg -verbose -verbose image.jpg > /dev/null 

djpegは、その(のlibjpegの一部)を行うことができます。そのチェックの詳細についてはhereを参照してください。あなたはまた、test_subsampling

UPDATE

で見ることができ、私はJPEGを保存するときにサブサンプリングや量子化テーブルを指定するか、またはその両方する機能を追加するために、PILフォークをしました。保存するときにquality='keep'を指定することもできます。画像は元のJPEGと同じ量子化テーブルとサブサンプリングで保存されます(オリジナルはJPEGにする必要があります)。保存するときに品質に渡すことができるプリセット(Photoshopベース)もあります。 My fork.

UPDATE 2

私のコードは今Pillow 2.0の一部です。だから行います

pip install Pillow 
+2

量子化テーブルは 'PIL.JpegImagePlugin.JpegImageFile'(' Image.open' JPEGファイルのときに得られるタイプです)の 'quantization'属性でも利用できます。 – adw

+0

これは知っておきたいことです。したがって、PILに欠けているのは、保存時に量子化テーブルを指定(パス)する方法だけです。 – Etienne

+0

甘い、特にそれは3.3で動作します。私はこの古い質問を思い出してうれしいです:) –

-3

私が理解している限り、これは不可能です。 JPEG形式は、カラーデータの75%を削除するか、色を単純化することによって圧縮されます。色の質を高くする方法はありません。

+0

JPEGは、「カラーデータの75%を削除したり、色を単純化して圧縮しません」。より効率的な色空間(YCbCr)への色空間変換を行いますが、これは最初のステップに過ぎません。 – kidjan

+0

FYI:JPEGは、通常、カラーデータの75%(4:2:0サブサンプリング)を削除することで圧縮します。 – Arel

4

品質は、JPEGに格納されているデータを生成するために使用されるものです。この番号はJPEGには格納されません。

品質を判断できる方法の1つは、編集する前に画像の8x8ピクセルのセルを取り込み、それに元の画像に近づくようにJPEG圧縮式を実行することです。その結果からオリジナル(ピクセルの差)までの距離関数を開発する必要があります。

あなたはまだ品質でバイナリ検索を行いますが、作業量ははるかに少ないです。ここで

は、JPEG圧縮はここでは、C#から変換する必要が

MSよくある質問から

http://support.microsoft.com/kb/324790

別の方法があります

http://www.dspguide.com/ch27/6.htm

をどのように動作するかについての情報です。

関連する問題