为视频创建时间中值滤波器的更快方法 也检查

问题描述

我正在尝试为视频创建中值滤波器。目标是为每 5 帧创建一个图像,其像素值对应于 5 帧像素的中值。

我可以使用多个 for 循环来做到这一点,但我想要一种更快/更简单的方法来实现相同的结果。有什么帮助吗?

更新:

我尝试通过定义要应用中位数的轴来使用 np.median 函数。当我用较小的阵列测试它时,它工作得很好,但当我转换到图像时,它不起作用。

w = 5  # window
n = int(len(data)/w)  # new number of frames
fdata = np.zeros([n,len(data[0]),len(data[0][0])])

for i in range(0,n):
   it_data = data[ i*5 : 5*i+5 ]
   fdata[i] = np.median(it_data,axis=0)

我收到的错误在最后一行:

>>> ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

解决方法

这里有 :)、abc 是帧(比方说灰度),您必须将它们堆叠起来,就好像它们是 RGB 组件一样(尝试与5,它将起作用),然后将中位数应用于外轴(参见 questionthis other)。

import numpy as np
import random

a = np.array(
    [[ random.randint(0,10) for i in range(3) ],[ random.randint(0,10) for i in range(3) ]])

b = np.array(
    [[ random.randint(0,10) for i in range(3) ]])

c = np.array(
    [[ random.randint(0,10) for i in range(3) ]])

print(a)
print(b)
print(c)
print('\n')

# batch = a[...,np.newaxis]
batch = np.stack((a,b,c))

print(batch.shape)
print(batch)

print('\n')

batch = np.median(batch,axis=0)

print(batch.shape)
print(batch)

print('\n...Test...')

print(
    np.median(
        (a[0,0],b[0,c[0,0])
    )
)

也检查