Извлечение маски из 3D-изображения RGB с использованием одномерного логического массива - PullRequest
1 голос
/ 03 марта 2020

У меня есть 3D-изображение, которое представляет собой массив numpy формы (1314, 489, 3) и выглядит следующим образом:

RGB image

Теперь я хочу вычислить среднее значение цвета RGB маски (початок без черного фона). Вычислить значение RGB для всего изображения очень просто:

print(np.mean(colormaskcutted, axis=(0, 1)))
>>[186.18434633  88.89164511  46.32022921]

Но теперь я хочу, чтобы это среднее значение цвета RGB было только для початка. У меня есть 1D массив логических масок для маски с этой формой, где одно значение соответствует всем 3 значениям цветового канала: (1314, 489)

Я попытался нарезать массив изображений для маски следующим образом:

print(np.mean(colormaskcutted[boolean[:,:,0]], axis=(0, 1)))
>>124.57794089613752

Но это вернуло только одно значение вместо 3 значений для цвета RGB.

Как я могу отфильтровать 3D numpy изображение для логической маски 1D, чтобы среднее значение RGB расчет цвета можно выполнить?

1 Ответ

2 голосов
/ 03 марта 2020

Если ваш вопрос ограничен вычислением среднего значения, вам необязательно вводить подмножество изображения. Вы можете просто сделать, например,

np.sum(colormaskcutted*boolean[:,:,None], axis = (0,1))/np.sum(boolean)

PS Я поиграл с индексированием, вы можете изменить свой первоначальный подход следующим образом:

np.mean(colormaskcutted[boolean,:], axis = 0)

PPS Не могу устоять перед некоторым сравнительным тестированием. Итак, подход суммирования занимает 15.9s (1000 итераций, измерения, как в примере, старый компьютер); продвинутый подход индексации немного длиннее, на 17.7s. Однако суммирование может быть дополнительно оптимизировано. Использование count_nonzero согласно предложению Безумного Физика незначительно увеличивает время до 15.3s. Мы также можем использовать tensordot, чтобы пропустить создание временного массива:

np.tensordot(colormaskcutted, boolean, axes = [[0,1], [0,1]])/np.count_nonzero(msk)  

Это сократит время до 4.5s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...