10

編集:ポールはこれを以下で解決しました。ありがとう!

3x3行列を5x5にリサンプリング(アップスケール)しようとしています。中間点にinterpolate.interp2dまたはinterpolate.RectBivariateSpline(または機能するもの)を入力します。

これを行うための単純な既存の関数があれば、それを使用したいのですが、まだ見つけていません。たとえば、次のように機能する関数:

# upscale 2x2 to 4x4
matrixSmall = ([[-1,8],[3,5]])
matrixBig = matrixSmall.resample(4,4,cubic)

したがって、3x3の行列/配列から始める場合:

0,-2,0
-2,11,-2
0,-2,0

新しい5x5行列(「I」は補間値を意味します)を計算したい:

0, I[1,0], -2, I[3,0], 0
I[0,1], I[1,1], I[2,1], I[3,1], I[4,1]
-2, I[1,2], 11, I[3,2], -2
I[0,3], I[1,3], I[2,3], I[3,3], I[4,3]
0, I[1,4], -2, I[3,4], 0

私はさまざまなテストコードを検索して読み、試してきましたが、自分がやろうとしていることの正しい構文を完全に理解していません。また、特定の行でmeshgrid、mgrid、またはlinspaceを使用する必要があるかどうかもわかりません。

編集: Paulのおかげで修正されて動作しています

import numpy, scipy
from scipy import interpolate

kernelIn = numpy.array([[0,-2,0],
             [-2,11,-2],
             [0,-2,0]])

inKSize = len(kernelIn)
outKSize = 5

kernelOut = numpy.zeros((outKSize,outKSize),numpy.uint8)

x = numpy.array([0,1,2])
y = numpy.array([0,1,2])

z = kernelIn

xx = numpy.linspace(x.min(),x.max(),outKSize)
yy = numpy.linspace(y.min(),y.max(),outKSize)

newKernel = interpolate.RectBivariateSpline(x,y,z, kx=2,ky=2)

kernelOut = newKernel(xx,yy)

print kernelOut
4

2 に答える 2

9

たった2つの小さな問題:

1)あなたのxx、yyはx、yの範囲外です(外挿することはできますが、あなたはそうしたくないと思います)。

2)サンプルサイズが小さすぎて、kxとkyを3(デフォルト)にできません。2に下げて、3次ではなく2次フィットを取得します。

import numpy, scipy
from scipy import interpolate

kernelIn = numpy.array([
    [0,-2,0],
    [-2,11,-2],
    [0,-2,0]])

inKSize = len(kernelIn)
outKSize = 5

kernelOut = numpy.zeros((outKSize),numpy.uint8)

x = numpy.array([0,1,2])
y = numpy.array([0,1,2])

z = kernelIn

xx = numpy.linspace(x.min(),x.max(),outKSize)
yy = numpy.linspace(y.min(),y.max(),outKSize)

newKernel = interpolate.RectBivariateSpline(x,y,z, kx=2,ky=2)

kernelOut = newKernel(xx,yy)

print kernelOut
##[[  0.      -1.5     -2.      -1.5      0.    ]
## [ -1.5      5.4375   7.75     5.4375  -1.5   ]
## [ -2.       7.75    11.       7.75    -2.    ]
## [ -1.5      5.4375   7.75     5.4375  -1.5   ]
## [  0.      -1.5     -2.      -1.5      0.    ]]
于 2011-04-07T20:01:38.663 に答える
9

すでにscipyを使用している場合は、scipy.ndimage.interpolate.zoom必要なことを実行できると思います。

import numpy
import scipy.ndimage

a = numpy.array([[0.,-2.,0.], [-2.,11.,-2.], [0.,-2.,0.]])
out = numpy.round(scipy.ndimage.interpolation.zoom(input=a, zoom=(5./3), order = 2),1)

print out
#[[  0.   -1.   -2.   -1.    0. ]
# [ -1.    1.8   4.5   1.8  -1. ]
# [ -2.    4.5  11.    4.5  -2. ]
# [ -1.    1.8   4.5   1.8  -1. ]
# [  0.   -1.   -2.   -1.    0. ]]

ここでの「ズーム係数」は5./3、3x3アレイから5x5アレイに移行するためです。ドキュメントを読むと、2つの軸に対して個別にズーム率を指定することもできると書かれています。つまり、非正方行列もアップスケールできます。デフォルトでは、3次スプライン補間を使用しますが、これが最適かどうかはわかりません。

私はいくつかの画像でそれを試しました、そしてそれはうまくいきます。

于 2011-04-07T20:39:09.990 に答える