ओवरलैपिंग सूचकांकों के साथ एक और सुव्यवस्थित सरणी के लिए एक इंडेक्स चयनित संख्यात्मक खांचे को जोड़ें

Nov 27 2020

मैं दो NumPy सरणी है imageऔर warped_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 में बदलने की योजना बना रहा हूं। ऐसा इसलिए है, क्योंकि मेरे पास ऐसी सैकड़ों छवियां हैं और प्रत्येक छवि पूर्ण एचडी रिज़ॉल्यूशन की है।

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 जोड़े हैं जो ओवरलैप करते हैं और इसलिए यह विफल हो जाता है। मान देने के लिए Eg image[0,1]और image[1,1]gt gt को जोड़ा जाना चाहिए warped_image[0,2]। हालाँकि, उनमें से केवल एक ( 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.]]