如何通过广播切片切片图像?错误:'只有整数标量数组可以在python中转换为标量索引'?

时间:2017-10-20 01:23:27

标签: python slice numpy-broadcasting

我有一个简单的任务: 我有一个图像和一系列点。对于每个点,我想从图像中切出方框。

我可以在for循环中执行此操作,但是对于数千个点来说它非常慢,所以我需要在没有循环的情况下执行此操作。我正在尝试将数组广播到切片值。这是一些说明问题的最小代码:

import numpy as np
frame = cv2.imread("input.png")
pts = np.array([[10,20],
                [30,40],
                [50,60]])  #and thousands more
x1s = pts[:, 0]
y1s = pts[:, 1]
x2s = x1s + 5
y2s = y1s + 5
cutouts = frame[x1s:x2s,y1s:y2s]

给了我错误:

TypeError: only integer scalar arrays can be converted to a scalar index

为什么呢?切片都是1d整数数组(标量)。这应该工作。有什么问题,我该怎么做?

有关此错误的其他stackoverflow帖子似乎与切片或广播无关。

编辑:要清楚,点数组将是数千个点。我想要一个包含数千个5x5切片的数组,每个切片一个。所以切片从(10,20)开始,另一个切片从(30,40)开始,等等。

Edit2:人们说你不能在二维阵列上播放。然而这个有效,这是相同的概念。为什么呢?

import numpy as np
import cv2
frame = np.arange(50).reshape(5,10)
pts1 = np.array([1,2,3])
pts2 = np.array([4,5,6])
cutouts = frame[pts1,pts2]
print cutouts
#outputs [14 25 36]

2 个答案:

答案 0 :(得分:0)

pts [:,0]的形状是(2,),所以它不是标量 试试这个,它应该对你的情况有帮助。

imgfrag = img[pts[0,0]:pts[1,0], pts[0,1]:pts[1,1]]

答案 1 :(得分:0)

答案:无法完成。 Numpy只是不允许它。