OpenCV 使用 numpy 数组来存储图像数据。在 this问题和接受的答案 有人告诉我,要访问图像中感兴趣的子区域,我可以使用 roi = img[y0:y1, x0:x1]
的形式。
我很困惑,因为当我在终端中创建一个 numpy 数组并进行测试时,我似乎没有得到这种行为。下面我想得到 roi [[6,7], [11,12]]
,其中 y0 = index 1, y1 = index 2
,和 x0 = 索引 0,x1 = 索引 1
。
为什么我只能通过 arr[1:3, 0:2]
得到我想要的?我希望通过 arr[1:2, 0:1]
获得它。
似乎当我切片 n×n ndarray[a:b, c:d] 时,a 和 c 是指数 0..n-1 的预期范围,但 b 和 d 是指数范围 1 ..n.
最佳答案
在您发布的示例中,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]])
因此,如果您想要的是包含 b 和 d 的区域 [[a, b], [c, 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
符号(其中不包含停止)。
关于python - 从 numpy 数组(opencv 图像)获取 ROI 时,为什么 img[y0 :y1, x0 :x1] seem to use an inconsistent range of indicies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31235679/