Вот пример способа поместить 3 изображения игрушек в массив (высота) x (ширина) x (количество изображений), а затем вызвать numpy.median
вдоль оси (количества изображений) (которая будет осью времени если изображения расположены вдоль него во временном порядке).
In [1]: img1 = np.array([[1, 2], [3, 4]])
In [2]: img2 = np.array([[10, 6], [1, 0]])
In [3]: img3 = np.array([[8, 1], [0, 4]])
In [4]: images = np.zeros(shape=img1.shape + (3,))
In [5]: images[:,:,0] = img1
In [6]: images[:,:,1] = img2
In [7]: images[:,:,2] = img3
In [8]: images
Out[8]:
array([[[ 1., 10., 8.],
[ 2., 6., 1.]],
[[ 3., 1., 0.],
[ 4., 0., 4.]]])
In [9]: images[:,:,0]
Out[9]:
array([[ 1., 2.],
[ 3., 4.]])
In [10]: np.median(images, axis=2)
Out[10]:
array([[ 8., 2.],
[ 1., 4.]])
Линия 4-7 удобно позаботиться о функции numpy.dstack
. Это было бы эквивалентно:
images = np.dstack((img1, img2, img3))
и обычным способом 2D изображения считываются в виде списка или читать последовательно из файлов будут добавлены, чтобы вырастить структуру данных постепенно. Хотя зачастую часто более целесообразно предварительно распределять плиту нулей и вставлять данные последовательно при загрузке.
Временное медианное изображение * определено * как пиксельно-медианное по временной последовательности изображений. Вы не можете вычислить его на каком-то уровне, вычисляя пиксельные медианы (если вы не используете какой-то метод приближения, но с чем-то столь же дешевым, чтобы вычислить как медианы набора упорядоченных последовательностей, трудно себе представить, d хотите). Если у вас есть код, который показывает * как * этот расчет организован, мы могли бы дать несколько советов о том, можно ли его организовать более эффективно, даже если будут присутствовать одни и те же основные базовые операции. – ely
@ MrFI думал о том, чтобы превратить каждое изображение в 1D-массив, и два цикла 'for' захватывают каждое значение в этой позиции, помещают их в новый 1D-массив для вычисления медианы и помещают результат в другой 1D-массив, который будет срединным изображением и переформатирует его обратно в 2D с помощью 'np.reshape()'. Любые мысли о лучшем способе сделать это? –
'numpy' позволяет использовать векторизованные вычисления, поэтому, если вы настроите 3D-массив, подобный (высота) x (ширина) x (время), вы можете указать' numpy' принимать медианную по третьей оси, и это будет автоматически интерпретировать это как среднюю по пикселям. Вы не должны выражать это с помощью любых for-loops, и для этого должен использоваться только один вызов «медиана». Из-за низкоуровневых оптимизаций, которые реализует 'numpy', это будет быстрее, чем практически любая попытка использования вручную. – ely