OpenCV使用numpy数组来存储图像数据。在this问题和接受的答案中,我被告知要访问图像中感兴趣的子区域,我可以使用roi = img[y0:y1, x0:x1]
形式。
我很困惑,因为当我在终端中创建一个numpy数组并进行测试时,我似乎没有得到这种行为。下面我想要了解[[6,7], [11,12]]
,其中y0 = index 1, y1 = index 2
和x0 = index 0, x1 = index 1
。
为什么我只能使用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。
答案 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不包括在内)。