2015-02-23 2 views
1

Есть ли другой способ вычисления медиана изображения нескольких изображений, кроме вычисления медианы для каждого отдельного пикселя с использованием np.median(array)?Временное медианное изображение нескольких изображений

Я знаю, что уже есть question about this, но это от 3 лет назад, возможно, что-нибудь пришло.

+0

Временное медианное изображение * определено * как пиксельно-медианное по временной последовательности изображений. Вы не можете вычислить его на каком-то уровне, вычисляя пиксельные медианы (если вы не используете какой-то метод приближения, но с чем-то столь же дешевым, чтобы вычислить как медианы набора упорядоченных последовательностей, трудно себе представить, d хотите). Если у вас есть код, который показывает * как * этот расчет организован, мы могли бы дать несколько советов о том, можно ли его организовать более эффективно, даже если будут присутствовать одни и те же основные базовые операции. – ely

+0

@ MrFI думал о том, чтобы превратить каждое изображение в 1D-массив, и два цикла 'for' захватывают каждое значение в этой позиции, помещают их в новый 1D-массив для вычисления медианы и помещают результат в другой 1D-массив, который будет срединным изображением и переформатирует его обратно в 2D с помощью 'np.reshape()'. Любые мысли о лучшем способе сделать это? –

+1

'numpy' позволяет использовать векторизованные вычисления, поэтому, если вы настроите 3D-массив, подобный (высота) x (ширина) x (время), вы можете указать' numpy' принимать медианную по третьей оси, и это будет автоматически интерпретировать это как среднюю по пикселям. Вы не должны выражать это с помощью любых for-loops, и для этого должен использоваться только один вызов «медиана». Из-за низкоуровневых оптимизаций, которые реализует 'numpy', это будет быстрее, чем практически любая попытка использования вручную. – ely

ответ

2

Вот пример способа поместить 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 изображения считываются в виде списка или читать последовательно из файлов будут добавлены, чтобы вырастить структуру данных постепенно. Хотя зачастую часто более целесообразно предварительно распределять плиту нулей и вставлять данные последовательно при загрузке.

+1

Благодарим вас за помощь в оптимизации моего кода. Когда вы говорили о векторизованном вычислении с использованием оси в 'np.mean()', я немного поиграл с ней и в итоге придумал 'np.median ([img1, img2, img3], axis = 0)', аналогично ваш подход с помощью 'np.median (np.dstack ((img1, img2, img3)), ось = 2)' –

Смежные вопросы