python: вычисление статистики по подмножеству изображения

У меня есть изображение RGB, которое представлено в виде массива numpy размера (500, 500, 3). У меня также есть массив размера (500, 500), где каждый пиксель имеет целочисленное значение от 0 до 99 включительно. Это в основном делит изображение на множество субрегионов. Пиксели, принадлежащие подмассиву, имеют один и тот же целочисленный индекс.

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

# image is of size (500, 500, 3) ->RGB values
# label is of size (500, 500) -> contains integers        
import numpy as np

mean = np.zeros((100, 3))
for i in range(0, 100):
    count = 0
    for x in range(0,500):
        for y in range(0,500):
            if label[x, y] == i:
                mean[i, :] += image[x, y,:]
                count = count + 1

    # Compute the mean
    if count > 0:
        mean[i,:] /= count

То, как я это делаю, включает в себя множество циклов, и это кажется совершенно не питоническим, и мне было интересно, есть ли лучший (в смысле скорости) способ сделать это.


person Luca    schedule 03.11.2014    source источник


Ответы (2)


Используйте логическое индексирование и маски:

image[label==i,:].mean(0)
person Daniel    schedule 03.11.2014
comment
Спасибо! Сейчас мне стыдно писать этот сегмент кода. Можете ли вы объяснить, что делает параметр (0) для средней функции? Кажется, что вычисляется среднее значение по каждой оси (это то, что я хочу!), но мне это не ясно из документации. - person Luca; 03.11.2014
comment
Вы получаете двумерный массив, потому что первые два измерения были сглажены маской, а среднее значение вычисляется по первому измерению, поэтому вы получаете вектор с 3 элементами. - person Daniel; 03.11.2014

вы можете сделать его намного более «питоновским», но что касается цикла, вы можете потерять первый цикл, извлекая фактическое текущее значение intenger из label, используя координаты: i=label[x:y] вместо того, чтобы перебирать все возможные значения.

person yurib    schedule 03.11.2014