Как получить среднее значение тепловой карты внутри области ограничивающей рамки

#python #numpy

#питон #numpy #python

Вопрос:

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

введите описание изображения здесь

Я добавил минимальный рабочий пример, который повторяет то, чего я пытаюсь достичь:

 import numpy as np
mask = np.zeros((10,10))
mask[3:-3, 3:-3] = 1 # white square in black background
im = mask   np.random.randn(10,10) # random image
masked = np.ma.masked_where(mask == 0, mask)
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(im, 'BuGn')
plt.imshow(masked, 'jet',  alpha=0.9)
plt.show()
  

где я хотел бы вычислить среднее значение im внутри синего квадрата ( masked ).

введите описание изображения здесь

У кого-нибудь есть какие-нибудь предложения?

Комментарии:

1. Вы пробовали какой-либо из методов из statistics модуля?

2. Я думаю, что что-то вроде этого сделает работу: mean = statistics.mean([statistics.mean([row for row in im])) .

3. @accdias Спасибо за ваше предложение, но я ищу, чтобы найти среднее значение im внутри masked

4. Добро пожаловать, @Sam Comber.

Ответ №1:

Я думаю, вы ищете это:

 #!/usr/bin/env python3

import numpy as np

# Make mask of first 4 diagonal elements
h, w = 6, 10
mask = np.zeros((h,w),dtype=np.uint8)
mask[0][0] = 1
mask[1][1] = 1
mask[2][2] = 1
mask[3][3] = 1

# Make image of random small numbers under 10 that Mark is capable of adding up
# Go for predictable randomness because Mark is not a physicist
np.random.seed(42)
im = np.random.randint(1,10,(h,w),dtype=np.uint8)

# Calculate mean of numbers where mask>0
mean = im[mask>0].mean()
  

Вот как выглядит маска:

 array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)
  

Вот как выглядит изображение:

введите описание изображения здесь

Вот среднее:

 In [33]: mean                                                                                       
Out[33]: 5.75
  

Проверьте:

 (7   5   3   8) /4 = 23/4 = 5.75