Tambahkan array numpy yang dipilih indeks ke array numpy lain dengan indeks yang tumpang tindih

Nov 27 2020

Saya memiliki dua array numpy imagedan warped_imagedan indeks array ix,iy. Saya perlu menambahkan imageke warped_imagesehingga image[i,j]ditambahkan ke warped_image[iy[i,j],ix[i,j]]. Kode di bawah ini berfungsi jika pasangan (iy[i,j], ix[i,j])unik untuk semua i,j. Tetapi ketika mereka tidak unik yaitu ketika 2 elemen dari imageperlu ditambahkan ke elemen yang sama di warped_image, hanya satu dari mereka yang ditambahkan. Bagaimana cara menambahkan kedua elemen dari imageke elemen yang sama warped_image?

Perhatikan bahwa, saya tidak ingin menggunakan forloop apa pun . Saya ingin mempertahankan vektor ini. Saya berencana untuk mengonversi kode ke TensorFlow atau PyTorch di masa mendatang untuk menggunakan kemampuan GPU untuk ini. Itu karena, saya memiliki ratusan gambar seperti itu dan setiap gambar memiliki resolusi full 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.]])
   

Untuk kasus di atas, indeks bersifat unik dan karenanya keluarannya sesuai harapan.

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.]])
   

Output yang Diharapkan:

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

Dalam hal ini, ada 3 pasang indeks yang tumpang tindih dan oleh karena itu gagal. Misalnya image[0,1]dan image[1,1]harus gt ditambahkan ke warped_image[0,2]memberikan nilai 51. Namun hanya satu dari mereka ( image[1,1]) yang ditambahkan untuk memberikan nilai 1.

Konteks :
Saya mencoba melakukan warp gambar dari view1 ke view2. Saya telah menghitung piksel mana yang harus pergi ke mana. Jika ada piksel yang tumpang tindih, saya perlu mengambil rata-rata tertimbang dari mereka. Jadi, saya perlu mencapai hal di atas. Lebih lengkapnya di sini

Jawaban

1 DaniMesejo Nov 27 2020 at 21:12

Gunakan 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)

Keluaran

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