如何通过广播切片对图像进行切片?错误:python中只能将整数标量数组转换为标量索引?

2024-04-26 12:15:26 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我可以在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]

这给了我一个错误:

^{2}$

为什么?切片都是整数(标量)的一维数组。这应该行得通。哪里错了,我该怎么做?在

关于这个错误的其他stackoverflow帖子似乎与切片或广播无关。在

编辑:要清楚点,点阵列将有数千个点。我想要一个由数千个5x5片组成的数组,每个点一个。从(10,20)开始的一个切片,从(30,40)开始的另一个切片,等等

编辑2:有人说你不能在二维阵列上广播。然而,这是同一个概念。为什么?在

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]

Tags: 图像importnumpyasnp切片数组array
2条回答

pts[:,0]的形状是(2,),因此它不是标量 试试这个,对你的情况会有帮助的。在

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

回答:这是做不到的。纽比就是不允许。在

相关问题 更多 >