4

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 の間の列メジャー/行メジャーの違いをそれぞれ認識していることに言及する必要があります。述べたように、私の方法は単一チャネルの画像では機能しますが、複数のチャネルではインデックスが間違っています。

4

2 に答える 2

3

配列を作成するときに Fortran の順序を指定できます。

>>> a = np.ones((10,10,2),dtype=np.float64)
>>> a.strides
(160, 16, 8)
>>> b = np.ones((10,10,2),dtype=np.float64,order='f')
>>> b.strides
(8, 80, 800)
于 2013-08-05T20:58:32.290 に答える