当从numpy数组(opencv图像)获得ROI时,为什么img [y0:y1,x0:x1]似乎使用不一致的指标范围?

时间:2015-07-05 22:38:02

标签: python opencv numpy

OpenCV使用numpy数组来存储图像数据。在this问题和接受的答案中,我被告知要访问图像中感兴趣的子区域,我可以使用roi = img[y0:y1, x0:x1]形式。

我很困惑,因为当我在终端中创建一个numpy数组并进行测试时,我似乎没有得到这种行为。下面我想要了解[[6,7], [11,12]],其中y0 = index 1, y1 = index 2x0 = index 0, x1 = index 1

enter image description here

为什么我只能使用arr[1:3, 0:2]获得我想要的内容?我期望通过arr[1:2, 0:1]获得它。

似乎当我切割n-by-n ndarray [a:b,c:d]时,a和c是预期的指标范围0..n-1,但b和d是指数范围1 ...... N。

1 个答案:

答案 0 :(得分:8)

在您发布的示例中,numpy和cv2正在按预期工作。 Indexing or Slicing in numpy,就像在python中一样,基于0和[a, b)形式,即不包括b

重新创建您的示例:

>>> import numpy as np
>>> arr = np.arange(1,26).reshape(5,5)
>>> arr
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20],
       [21, 22, 23, 24, 25]])

所以语句arr[1:2, 0:1]表示获取row=1(第1行但不包括2)和column=0(我们期望6)的值:

>>> arr[1:2, 0:1]
array([[6]])

对于arr[1:3, 0:2],我们期望行1,2和列0,1:

>>> arr[1:3, 0:2]
array([[ 6,  7],
       [11, 12]])

因此,如果您想要的区域[[a, b], [c, d]]包含b和d,那么您真正需要的是:

[[a, b+1], [c, d+1]]

进一步的例子:

假设您需要所有列,只需要行0和1:

>>> arr[:2, :]
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

此处arr[:2, :]表示最多但不包括2的所有行,后跟所有列:

假设您希望每个其他列,从列索引0(和所有行)开始:

>>> arr[:, ::2]
array([[ 1,  3,  5],
       [ 6,  8, 10],
       [11, 13, 15],
       [16, 18, 20],
       [21, 23, 25]])

其中::2遵循start:stop:step表示法(其中stop不包括在内)。