【问题标题】:When getting an ROI from a numpy array (opencv image) why does img[y0:y1, x0:x1] seem to use an inconsistent range of indicies?从 numpy 数组(opencv 图像)获取 ROI 时,为什么 img[y0:y1, x0:x1] 似乎使用不一致的索引范围?
【发布时间】:2015-09-22 23:59:31
【问题描述】:

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×n ndarray[a:b, c:d] 进行切片时,a 和 c 是预期的索引范围 0..n-1,但 b 和 d 是范围为 1 的索引..n.

【问题讨论】:

    标签: python opencv numpy


    【解决方案1】:

    在您发布的示例中,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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 2019-12-05
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 1970-01-01
      相关资源
      最近更新 更多