我在 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]
元素将是第二个通道。因此,为了索引到 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];
}
我的问题是 numpy 沿第三轴订购它的 3 维数组。也就是说,给定一个[10, 10, 2]
数组,前两个元素是索引[0, 0, 0]
和[0, 0, 1]
。在 Matlab 中,它们是索引[0, 0, 0]
和[0, 1, 0]
.
我想我可以通过在 numpy 中使用 stride 来纠正我的问题。但是,我完全没有想出合适的步幅模式。因此,对于我的[10, 10, 2]
数组示例,如何更改步幅,从(假设双打):
>>> np.ones([10,10,2], dtype=np.float64).strides
(160, 16, 8)
我可以像对 Matlab 数组一样索引的东西?
我应该提一下,我知道 Matlab 和 numpy 之间的列主要/行主要区别。如前所述,我的方法适用于单通道图像,但超过 1 个通道的索引错误。