Как оптимизировать цифровую операцию, применяя условие 2D к 3-канальному RGB-изображению? - PullRequest
0 голосов
/ 07 марта 2019

Я пытаюсь применить вычисление из 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)

выход:
enter image description here

Iв основном пытался найти индексы в 2D альфа-изображении, где выполняется условие, и пытался применить эти индексы ко всем каналам изображения.

Есть ли способ оптимизировать вышеуказанную операцию (не для зацикливания каналов)?Я специально стараюсь избегать цикла for в коде, делая numpy для каждого индекса.Это очень медленно для обычных изображений.

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете заметить, что:
test_output = np.einsum('ij,ijk->ijk', test_a1, test_ir1)
Не уверен, поможет ли это переформулировать немного другое MWE, если это не совсем то, что вы намереваетесь

=== отредактировано ===

Я бы по-прежнему использовал einsum, поскольку он позволяет вам много контролировать векторизованную многомерную линейную алгебру.

При условии, что вы можете сократить свои операции до некоторого математического описания, например:

Если test_a1 больше нуля, удвойте интенсивность пикселей, измеренную по каждому каналу.

Затем вы делаете это следующим образом:

mask = test_a1 > 0
output = np.einsum('ij,ijk->ijk', mask, test_ir1) + test_ir1
...