1

だから、私はこのチュートリアルで自分のpythonを学んでいて、練習番号13で立ち往生しています:

画像を一様に縮小または拡大する関数を作成します。関数は、倍率とともに画像を取得する必要があります。画像を縮小するには、倍率を 0 から 1 の間にし、画像を拡大するには、倍率を 1 より大きくする必要があります。

これは PIL に関する質問ではなく、自分でコーディングできるようにどのアルゴリズムを使用するかを尋ねるためのものです。

このような同様の質問をいくつか見つけましたが、これを python に変換する方法がわかりません。

どんな助けでも大歓迎です。

私はこれに来ました:

import image

win = image.ImageWin()
img = image.Image("cy.png")

factor = 2

W = img.getWidth()
H = img.getHeight()

newW = int(W*factor)
newH = int(H*factor)

newImage = image.EmptyImage(newW, newH)

for col in range(newW):
    for row in range(newH):
        p = img.getPixel(col,row)
        newImage.setPixel(col*factor,row*factor,p)

newImage.draw(win)

win.exitonclick()

関数でこれを行う必要がありますが、これは今のところ問題ではありません。関数の引数は (image, factor) になります。ActiveCode の OP チュートリアルで試すことができます。空の列を持つ引き伸ばされた画像を作成します:。

4

3 に答える 3

2

示されているコードは、1 つの小さなバグを除いて、単純かつ効果的な最近傍サイズ変更として知られています。

    p = img.getPixel(col/factor,row/factor)
    newImage.setPixel(col,row,p)

編集:浮動小数点座標を送信しているgetPixelため、最近傍に限定されません-内部で必要な補間アルゴリズムを実装できます。最も簡単な方法は、が 1 より大きいint場合はピクセルを複製する座標を単純に切り捨て、が 1 より小さい場合はスキップすることです。factorfactor

于 2012-09-16T15:27:40.740 に答える
1

これは、Python Imaging Library を使用して行うことができます。

Image.resize()あなたがしたいことをするべきです。

http://effbot.org/imagingbook/image.htmを参照

編集

モジュールを使用せずにこれを自分でプログラムしたいので、追加のソリューションを追加しました。

次のアルゴリズムを使用する必要があります。

画像を読み込み、そのサイズを抽出します 目的のサイズ (高さ * 係数、幅 * 係数) を計算します 目的のサイズで新しい EmptyImage を作成します

画像内のピクセル (行ごと) のネストされたループを使用します。次に、(縮小するために)時々いくつかのピクセルを削除するか、(拡大するために)画像内のいくつかのピクセルを複製します。

派手にしたい場合は、隣接する RGB 値を平均化することで、追加または削除されたピクセルを滑らかにすることができます。

于 2012-09-16T14:22:43.300 に答える
1

マークは正しいアプローチをしています。よりスムーズな結果を得るには、次を置き換えます。

p = img.getPixel(col/factor,row/factor)

浮動小数点座標を取り、ソース画像のいくつかの隣接点から補間されたピクセルを返す関数を使用します。線形補間の場合は、最も近い 4 つの隣接要素が使用されます。高次の補間では、より多くの周囲のピクセルが必要になります。

たとえば、col/factor = 3.75 および row/factor = 1.9 の場合、線形補間は (3,1)、(3,2)、(4,1)、および (4,2) のソース ピクセルを取得し、 (4,2) のピクセルに最も大きく重み付けされた、これら 4 つの RGB 値の間の結果を返します。

于 2012-09-16T15:41:52.133 に答える