画像とそのサイズ変更されたバージョンとの間のピクセル位置のマッピングを取得するために使用できる特定の式を探しています。たとえば、式を使用してサイズ変更されたバージョンの元の画像の現在のピクセルを知りたいです。つまり、列 j_m、J_n、.... の i 個のピクセルのみがサイズ変更されたバージョンに存在し、残りは削除されます。縦横比の保持やウィンドウの平均化を行わずにスケーリングするだけのサイズ変更について話しています。
ありがとう
画像とそのサイズ変更されたバージョンとの間のピクセル位置のマッピングを取得するために使用できる特定の式を探しています。たとえば、式を使用してサイズ変更されたバージョンの元の画像の現在のピクセルを知りたいです。つまり、列 j_m、J_n、.... の i 個のピクセルのみがサイズ変更されたバージョンに存在し、残りは削除されます。縦横比の保持やウィンドウの平均化を行わずにスケーリングするだけのサイズ変更について話しています。
ありがとう
すべてのコメントを読んだ後、私はあなたが達成したいことを正確に理解していないので、この回答で私の素朴さを許したいと思うかもしれません.
基本: 画像 (信号、関数、その他すべて) をスケーリングするには、標準のスケーリング マトリックスを適用します。このサイトでは適切な LaTeX のインライン展開が許可されていないため、次の表現を理解するように努力してください。2D 画像のスケーリング行列は、次の式で与えられます。0sy]。回転と平行移動を同時に実行することには関心がないため、この表現を同次座標に移動してもあまり意味がありません。マトリックスは単純です、非常に単純です。したがって、たとえば、x を 6 倍、y を 4 倍にスケーリングするには、S = [6 0; 0 4]。このマトリックスをすべてのポイントに適用すると、スケーリングされた画像が得られます。以下は、このアプリケーションの直接的な例です。元の画像は 6x、4y で拡大縮小されています。
ご覧のとおり、アップスケールされた星には空白のポイントがたくさんあります。そのため、実際には逆スケーリング マトリックスを介してアップスケーリングが実行されます。上記の行列の逆行列は自明に得られ、S-1 = [1/sx 0; に対応します。0 1/sy]。これを行う利点は、基本的に、補間が逆変換を実行するための必須のステップであることです。つまり、離散ドメインがあり、実際の位置を取得して、ある種の補間を実行することを処理します。以下は、最も単純な補間です。実数値を整数に切り捨てることによる最近傍。スケーリング係数は、6x と 4y ですが、逆の形式で行われます。
スケーリング プロセスは補間ステップで自由に実行できるため、スケーリングされた画像を正確に復元できないことは明らかです (スケーリング係数がわかっている場合でも)。ただし、スケーリングされた画像に逆の係数を使用してスケーリングを直接適用するだけで、スケーリングされていない画像の近似値を取得できます。この例では、元の画像とまったく同じである次の画像を取得します。
お役に立てれば、ここで説明した内容を例示する非常に単純な Python コードを示します。
import sys
from PIL import Image
img = Image.open(sys.argv[1]) # Assumed to be grayscale.
width, height = img.size
scale_x, scale_y = (6, 4)
imo = img.load()
# Upscale directly.
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white')
im = full_img.load()
for x in xrange(width):
for y in xrange(height):
im[x * scale_x, y * scale_y] = imo[x, y]
full_img.save(sys.argv[2])
# Upscale by inverse transform.
full_img = Image.new('L', (width * scale_x, height * scale_y), 'white')
im = full_img.load()
for x in xrange(width * scale_x):
for y in xrange(height * scale_y):
im[x, y] = imo[int(x / float(scale_x)), int(y /
float(scale_y))]
full_img.save(sys.argv[3])
# Downscale the previous upscaled image.
downscaled = Image.new('L', (width, height), 'white')
im2 = downscaled.load()
for x in xrange(width * scale_x):
for y in xrange(height * scale_y):
im2[x/scale_x, y/scale_y] = im[x, y]
downscaled.save(sys.argv[4])