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

Faster way to create a temporal median filter for a video

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

我可以使用多个 for 循环来做到这一点,但我想要一种 faster/simpler 方法来完成相同的结果。有帮助吗?

更新:

我尝试通过定义我希望应用中位数的轴来使用 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 相同,它会起作用)然后将中值应用于外轴(参见 and this 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) ],
     [ random.randint(0,10) for i in range(3) ]])

c = np.array(
    [[ random.randint(0,10) for i in range(3) ],
     [ 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,0],c[0,0])
    )
)

也检查

  • numpy.median
  • numpy.newaxis ---> 这个我真的不知道如何在新的维度中添加更多的数组
  • 你也可以试试this cv2 solution,暂时没有视频可以测试