2

私は PIL を使用して、幅 600 ピクセルから幅 2400 ピクセル、幅約 200 ピクセルまでの範囲の画像をスケーリングしています。私はすでに組み込み、可能な限り最高品質の画像を取得するようにImage.ANTIALIAS設定しました。quality=95

ただし、縮小された画像は、元の画像に比べてかなり品質が低下しています。

私が使用しているコードは次のとおりです。

# Open the original image
fp = urllib.urlopen(image_path)
img = cStringIO.StringIO(fp.read())
im = Image.open(img)
im = im.convert('RGB')

# Resize the image
resized_image = ImageOps.fit(im, size, Image.ANTIALIAS) 

# Save the image
resized_image_object = cStringIO.StringIO()
resized_image.save(resized_image_object, image_type, quality=95)

できるだけ多くの画質を維持しながら、これらの比率に沿って画像をスケーリングする最良の方法は何ですか?

私の主な目標は、可能な限り最高の品質の画像を取得することです。プロセスが時間的にどれほど効率的であるかについては、あまり関心がありません。

4

2 に答える 2

2

PIL のネイティブ サイズ変更オプションで結果が得られない場合は、独自のサイズ変更関数を使用してサイズ変更ピクセル値を手動で計算できます。画像のサイズを変更するための (私が知っている) 主なアルゴリズムは 3 つあります。

  • 最近傍
  • バイリニア補間
  • バイキュービック補間

最後のものは、最長の計算時間で最高品質の画像を生成します。これを行うには、小さい画像のピクセル レイアウトを想像してから、大きい画像に合わせて拡大し、新しいピクセル位置が古いものの上にある場所を考えます。次に、新しいピクセルごとに、最も近い 16 個のピクセル (周囲の 4x4 半径) の平均値を取得し、それを新しい値として使用します。

小さな画像の各ピクセルの結果の値は、大きな画像のサイズ変更されたバージョンの滑らかで鮮明なものになります。

詳細については、こちらを参照してください: Wikipedia - バイキュービック補間

于 2013-07-24T18:51:33.933 に答える
1

別のアプローチを試してください。これが役立つかどうかはわかりませんが、しばらく前に似たようなことをしました: https://stackoverflow.com/a/13211834/1339024

そもそも、urlpath の元の画像の品質がそれほど高くない可能性があります。しかし、必要に応じて、私のスクリプトを試してください。特定のディレクトリ内の画像を縮小するために作成しましたが、この部分が役立つ可能性があります。

parentDir = "Some\\Path"
width = 200
height = 200
cdpi = 75
cquality = 95
a = Image.open(parentDir+'\\'+imgfile) # Change this to your url type
iw,ih = a.size
if iw > width or ih > height:
    pcw = width/float(iw)
    pch = height/float(ih)
    if pcw <= pch:
        LPC = pcw
    else:
        LPC = pch
    if 'gif' in imgfile:
        a = a.convert("RGB")#,dither=Image.NONE)
        a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS)
        a = a.convert("P", dither=Image.NONE, palette=Image.ADAPTIVE)
        a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality)
    else:
        a = a.resize((int(iw*LPC),int(ih*LPC)),Image.ANTIALIAS)
        a.save(outputDir+"\\"+imgfile,dpi=(cdpi,cdpi), quality=cquality)
于 2013-07-24T19:03:41.073 に答える