python - 从 numpy 数组(opencv 图像)获取 ROI 时,为什么 img[y0 :y1, x0 :x1] seem to use an inconsistent range of indicies?

标签 python opencv numpy

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

enter image description here

为什么我只能通过 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/

相关文章:

python - 截取窗口屏幕截图并使用 OpenCV 显示它时出现问题

python - 列表和 numpy 数组什么时候调用 `__index__`?

python - Python 中的 Google Analytics API

python - 何时应将属性设为私有(private)并设为只读属性?

python - 过滤 Python 字典的非蛮力方法是什么?

python - 使用 Route53 通过 boto 更新 DNS。我应该使用名称还是 CNAME 以及要使用的 TTL

opencv - 从 YV12 图像缓冲区创建 Mat 对象

使用 OpenCV 进行 C++ 生物细胞计数

python - Sympy-numpy 集成存在 - 它记录在哪里?

python - 将 erf 函数拟合到数据