Я пытаюсь применить вычисление из 2D альфа-изображения к 3-канальному RGB-изображению.Мне нужно обновить интенсивность пикселей в каждом канале, основываясь на соответствующем значении пикселей в 2D альфа-изображении.Ниже приведен один MWE, который я создал для иллюстрации концепции.
MWE:
# test alpha 2D image
test_a1 = np.array([
[0, 0, 50],
[0, 0, 150],
[0, 0, 225]
])
# test 3 channel RGB image
test_ir1 = np.ones((3,3,3))
# getting indices of alpha where cond is satisfied
idx = np.unravel_index(np.where(test_a1.ravel()>0),test_a1.shape)
test_output = np.zeros_like(test_ir1)
n_idx = len(idx[0][0])
# applying computation on 3 channel RGB image only where cond is satisfied.
for i in range(n_idx):
# multiply only where test_a1 > 0
r_idx, c_idx = idx[0][0][i], idx[1][0][i]
test_output[r_idx,c_idx,0] = test_a1[r_idx, c_idx] * test_ir1[r_idx, c_idx, 0]
test_output[r_idx,c_idx,1] = test_a1[r_idx, c_idx] * test_ir1[r_idx, c_idx, 1]
test_output[r_idx,c_idx,2] = test_a1[r_idx, c_idx] * test_ir1[r_idx, c_idx, 2]
test_output = test_output.astype('uint8')
plt.imshow(test_output, vmin=0, vmax=3)
выход:
Iв основном пытался найти индексы в 2D альфа-изображении, где выполняется условие, и пытался применить эти индексы ко всем каналам изображения.
Есть ли способ оптимизировать вышеуказанную операцию (не для зацикливания каналов)?Я специально стараюсь избегать цикла for в коде, делая numpy для каждого индекса.Это очень медленно для обычных изображений.