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

2024-03-28 16:28:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

enter image description here

那为什么我只需要arr[1:3, 0:2]就能得到我想要的?我本来想用arr[1:2, 0:1]得到的。

当我把一个n乘n序列[a:b,c:d]切片时,a和c是0..n-1的预期范围,而b和d是1..n的预期范围


Tags: 数据图像numpy区域index数组thisopencv
1条回答
网友
1楼 · 发布于 2024-03-28 16:28:33

在您发布的示例中,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行,但不包括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不包括在内)。

相关问题 更多 >