2

ほとんどの補間アルゴリズム (Lanczos、Hermite、Bicubic) は、いくつかの値を計算する非常に単純な関数を使用します。しかし、これらの値は、いくつかの魔法を行う非常に複雑な関数を介して送信され、出来上がりの画像のサイズが変更されます。この魔法の関数 (ウィンドウ関数?) を理解したいのですが、Delphi、Pascal、PHP、または単純な C++ で見つけたほとんどのコードは、すでに最適化されているか、いくつかの巨大なライブラリの一部であり、大量のサブ関数、クラス、およびその他のものを使用しています。基本を理解したいだけです。

たとえば、Delphi の「最近傍」の関数は次のとおりです。

function BoxFilter(Value: Single): Single;
begin
  if (Value > -0.5) and (Value <= 0.5) then
    Result := 1.0
  else
    Result := 0.0;
end;

このような関数をピクセルの 2D 配列 (別名画像) に適用するにはどうすればよいですか?

4

1 に答える 1

5

最初にサイズ変更機能を実装する必要があります。基本的に、画像のサイズ変更は、新しい画像のピクセルに対応するデータの画像を繰り返しサンプリングします。たとえば、101x101 の画像を 160*67 にサイズ変更するとします。次に、ターゲット イメージの (0,0) のピクセルは、ソースからの (0.0,0.0) でのサンプリングに対応し、これは (0,0) のピクセルに等しくなります。しかし、たとえば (34,12) のピクセルは(34*100/159,12*100/66)==に対応します(21.38,18.18)サンプリングする必要があるソース内の位置。あなたが話す関数は、選択されたピクセルの値の一部を結果として返します。値は、サンプリングに要求されたものからこのピクセルの対応する座標を引いたものに等しくなります。たとえば、(4,3) のピクセルには 0 の部分が含まれます。これは、関数が値 (21.38-4) と (18.18-3) を使用してこのピクセルに乗算的に適用され、両方とも 0 が返されるためです。(21 のピクセル,18) は 1 つの部分をとります (その値の 100% が結果に追加されます)。これは、両方の呼び出しが-0.5 - 0.5間隔内の値で行われるためです。

不均一な座標で画像から色を正しくサンプリングするには、これらの関数を取得し、サンプリング値を丸めて中央のピクセルを検出し、関数をそのピクセルと周囲の 8 つのピクセルに適用して、9 つの参加値を受け取ります。次に、重みとして参加してピクセルの色を合計し、それらを 1 つのピクセル値に結合して、サンプリング結果として返します。

お役に立てれば。

于 2013-03-28T05:50:11.883 に答える