如何通过播放切片来切片图像?错误:在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]
答:不能这样做。 Numpy只是不允许它。
点的形状[:, 0](2),所以它不是一个标量 试试这个,它应该帮助你的情况。
imgfrag = img[pts[0,0]:pts[1,0], pts[0,1]:pts[1,1]]
我正在寻找一种不仅仅适合2点的解决方案。 如果我打印出来分[:,0],我获得一个标量的一维数组,看起来像这样: [10,30,价值,价值,价值..] 这应该符合广播标准。 –
boradcast仅当您尝试在2路程序上进行计算时才有意义。你正在使用pts [:,0]作为索引。我不认为这是一个boradcast案件。 –
请参阅edit2 –
的“整数标量数组”是像'阵列(3)' - 0维包含单个整数数组。它不是任意整数标量的数组。 – user2357112
请参阅编辑2.为什么一个示例工作,另一个示例没有。 –
您不能将阵列用作切片端点。 – user2357112