2017-10-20 2 views
0

간단한 작업이 있습니다. 이미지와 점 배열이 있습니다. 각 포인트에 대해 이미지에서 상자를 잘라내고 싶습니다.슬라이스를 브로드 캐스팅하여 이미지를 분할하는 방법은 무엇입니까? 오류 : 파이썬에서 '정수형 스칼라 배열 만 스칼라 인덱스로 변환 할 수 있습니까?'

for 루프에서이 작업을 수행 할 수 있지만 수천 개의 점 때문에 매우 느리므로 루프없이이 작업을 수행해야합니다. 배열을 슬라이스 값에 브로드 캐스팅하려고합니다.

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

이유 : 나에게 오류를 제공

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] 

: 여기에 문제를 보여 최소한의 코드는? 슬라이스는 모두 1 차원 정수 배열 (스칼라)입니다. 이것은 효과가있다. 무엇이 잘못되었으며, 어떻게해야합니까?

이 오류에 대한 다른 stackoverflow 게시물은 슬라이싱 또는 방송과 아무런 관련이없는 것 같습니다.

편집 : 명확하게 말하면 포인트 배열은 수천 포인트입니다. 각 5x5 슬라이스의 수천 배열을 원한다. 따라서 (10,20)에서 시작하는 슬라이스, (30,40)에서 시작하는 다른 슬라이스 등

Edit2 : 사람들은 2D 배열에서 방송 할 수없는 것처럼 말합니다. 그러나 은 동일한 개념입니다. 왜?

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

"정수형 스칼라 배열"은 하나의 정수를 포함하는 0 차원 배열 인'array (3)'과 같습니다. 정수 스칼라의 임의의 배열이 아닙니다. – user2357112

+0

편집 2를 참조하십시오. 왜 한 예가 효과가 있고 다른 예는 효과가 없습니다. –

+0

배열을 슬라이스 끝점으로 사용할 수 없습니다. – user2357112

답변

0

답변 : 할 수 없습니다. Numpy는 단지 그것을 허용하지 않습니다.

0

이 이것을 시도 스칼라되지 않도록 [:, 0], (2)입니다 점의 모양, 귀하의 경우에 도움이 될 것입니다.

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

저는 2 점 이상에 맞는 솔루션을 찾고 있습니다. pts [:, 0]을 출력하면 다음과 같은 스칼라 배열을 얻을 수 있습니다. [10,30, 값, 값, 값 ..] 브로드 캐스트 기준을 충족해야합니다. –

+0

boradcast는 2 ndarrays에서 계산을 시도 할 때만 의미가 있습니다. pts [:, 0]을 색인으로 사용하고 있습니다. 나는 이것이 보랏 캐스트 사건이라고 생각하지 않는다. –

+0

edit2 참조하십시오 –