numpy で大股で頭を動かすのに苦労しています。マルチチャンネル画像の補間を行うコードを書いています。np.ndarray
画像を shape型の 3 次元配列として定義します[HEIGHT x WIDTH x CHANNELS]
。私が書いている C++ は、Matlab と Python の両方で動作する必要があります。シングル チャネル画像の場合、コードは正常に動作し、Matlab のマルチチャネル画像の場合、コードは正常に動作します。
画像を補間するために、配列を指定して、画像内で補間するサブピクセル座標[M x N x P]
のセットを提供できるX
方法を書いています。Y
これは scipy の の機能と同じですndimage.map_coordinates
。残念ながら、Matlab と Python の両方で同じ結果が得られる補間方法が必要なため、独自の補間コードを展開しています。
私の問題は、Matlab がチャネルを次々に連結してスタックすることにより、3 次元メモリを配置することです。これは、[10, 10, 2]
画像の場合、最初の100
要素が最初のチャネルになり、要素[100, 200]
要素が 2 番目のチャネルになることを意味します。したがって、Matlab 連続メモリにインデックスを付けるには、次のようにインデックスを付けます。
// i is the element of the indices array
// j is the current channel
// F is the image we are indexing
// F_MAX is M * N (the number of pixels per channel)
// N_ELEMS is the total number of elements in the indices array
// f_index is the index in the contiguous array equivalent to the x and y coordinate in the 2D image
for (size_t j = 0; j < N_CHANNELS; j++)
{
out[i + j * N_ELEMS] = F[f_index + j * F_MAX];
}
私の問題は、3 番目の軸に沿った 3 次元配列の numpy オーダーです。つまり、[10, 10, 2]
配列が与えられた場合、最初の 2 つの要素はインデックス[0, 0, 0]
と[0, 0, 1]
です。Matlab では、インデックス[0, 0, 0]
と[0, 1, 0]
.
numpy でストライドを使用することで問題を解決できると思います。しかし、私は適切なストライドパターンを考え出すことに完全に失敗しています. したがって、[10, 10, 2]
配列の私の例では、ストライドを次のように変更するにはどうすればよいですか (doubles を想定):
>>> np.ones([10,10,2], dtype=np.float64).strides
(160, 16, 8)
Matlab配列の場合と同じようにインデックスできるものに?
私は、Matlab と numpy の間の列メジャー/行メジャーの違いをそれぞれ認識していることに言及する必要があります。述べたように、私の方法は単一チャネルの画像では機能しますが、複数のチャネルではインデックスが間違っています。