인덱스가 겹치는 다른 numpy 배열에 선택한 numpy 배열을 추가하십시오.

Nov 27 2020

나는이 개 NumPy와 배열이 imagewarped_image와 인덱스 배열을 ix,iy. 에 추가 image되는 warped_image것을 image[i,j]추가해야 warped_image[iy[i,j],ix[i,j]]합니다. 아래 코드는 쌍이 (iy[i,j], ix[i,j])모든 i,j. 그러나 그들이 고유하지 않은 경우, 즉의 2 개의 요소 image를에서 동일한 요소에 추가해야하는 warped_image경우 그중 하나만 추가됩니다. image에서 같은 요소에 두 요소를 어떻게 추가 할 수 warped_image있습니까?

for루프 를 사용하고 싶지 않습니다 . 이 벡터화를 유지하고 싶습니다. 앞으로 GPU 기능을 사용하기 위해 코드를 TensorFlow 또는 PyTorch로 변환 할 계획입니다. 그 이유는 이러한 이미지가 수백 개 있고 각 이미지가 풀 HD 해상도이기 때문입니다.

import numpy
image = numpy.array([[246,  50, 101], [116,   1, 113], [187, 110,  64]])
iy = numpy.array([[1, 0, 2], [1, 1, 0], [2, 0, 2]])
ix = numpy.array([[0, 2, 1], [1, 2, 0], [0, 1, 2]])
warped_image = numpy.zeros(shape=image.shape)
warped_image[iy, ix] += image

>> warped_image
Out[31]: 
array([[  113., 110.,  50.],
       [246., 116.,   1.],
       [187., 101.,  64.]])
   

위의 경우 인덱스는 고유하므로 출력이 예상대로입니다.

import numpy
image = numpy.array([[246,  50, 101], [116,   1, 113], [187, 110,  64]])
iy = numpy.array([[1, 0, 2], [1, 0, 2], [2, 2, 2]])
ix = numpy.array([[0, 2, 1], [1, 2, 0], [0, 1, 2]])
warped_image = numpy.zeros(shape=image.shape)
warped_image[iy, ix] += image

>> warped_image
Out[32]: 
array([[  0.,   0.,   1.],
       [246., 116.,   0.],
       [187., 110.,  64.]])
   

예상 출력 :

array([[  0.,   0.,   51.],
       [246., 116.,   0.],
       [300., 211.,  64.]])
       

이 경우 겹치는 인덱스 쌍이 3 개이므로 실패합니다. 예 image[0,1]image[1,1]첨가 하였다해야 warped_image[0,2]하지만 단지 그 중 하나는 (a 값 51 줄 image[1,1])에 값 1을 수득를 더해진다.

컨텍스트 :
view1에서 view2로 이미지를 왜곡하려고합니다. 어느 픽셀이 어디로 가야하는지 계산했습니다. 겹치는 픽셀의 경우 가중치 평균을 취해야합니다. 그래서 위의 목표를 달성해야합니다. 자세한 내용은 여기

답변

1 DaniMesejo Nov 27 2020 at 21:12

numpy.add.at 사용 :

import numpy
image = numpy.array([[246,  50, 101], [116,   1, 113], [187, 110,  64]])
iy = numpy.array([[1, 0, 2], [1, 0, 2], [2, 2, 2]])
ix = numpy.array([[0, 2, 1], [1, 2, 0], [0, 1, 2]])
warped_image = numpy.zeros(shape=image.shape)

np.add.at(warped_image, (iy, ix), image)

print(warped_image)

산출

[[  0.   0.  51.]
 [246. 116.   0.]
 [300. 211.  64.]]