如何通过播放切片来切片图像?错误:在python中'只能将整数标量数组转换为标量索引'?

问题描述:

我有一个简单的任务: 我有一个图像和点的阵列。对于每个点我想从图像中切出盒子。如何通过播放切片来切片图像?错误:在python中'只能将整数标量数组转换为标量索引'?

我可以在一个循环做到这一点,但对于千点是很慢的,所以我需要做没有循环。我试图将数组广播到切片值。下面是说明了这个问题的一些最少的代码:

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 

为什么?切片都是整数(标量)的一维数组。这应该工作。什么是错的,我该怎么做对吗?关于此错误的

其它计算器职位似乎什么都没有做切片或广播。

编辑:要清楚,点阵列将是千点。我想要一个数以千计的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] 
+0

的“整数标量数组”是像'阵列(3)' - 0维包含单个整数数组。它不是任意整数标量的数组。 – user2357112

+0

请参阅编辑2.为什么一个示例工作,另一个示例没有。 –

+0

您不能将阵列用作切片端点。 – user2357112

答:不能这样做。 Numpy只是不允许它。

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

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

我正在寻找一种不仅仅适合2点的解决方案。 如果我打印出来分[:,0],我获得一个标量的一维数组,看起来像这样: [10,30,价值,价值,价值..] 这应该符合广播标准。 –

+0

boradcast仅当您尝试在2路程序上进行计算时才有意义。你正在使用pts [:,0]作为索引。我不认为这是一个boradcast案件。 –

+0

请参阅edit2 –