【问题标题】:Faster way to create a temporal median filter for a video为视频创建时间中值滤波器的更快方法
【发布时间】:2021-07-15 20:22:02
【问题描述】:

我正在尝试为视频创建中值过滤器。目标是每 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()

【问题讨论】:

  • 我会检查 numpy 是否可以做类似的事情,目前我在 MatLab 中找到了它,看看这个 questionthis other,但不是在 Python 中

标签: python image video filter median


【解决方案1】:

这里有 :)、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) ],
     [ 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])
    )
)

也检查一下

【讨论】:

  • 谢谢!我会试试这个,我会给你反馈!
  • 不客气,也可以尝试 cv2 解决方案,但我认为在内置方法内部会发生类似于我给出的解决方案的情况。
  • 我尝试应用 numpy.median 但是,尽管适用于小示例,但它不适用于我的特定数据集。检查更新的帖子。
  • 您尝试过 cv2 解决方案吗?我将通过视频尝试此解决方案,并让您知道
  • 我设法使它与 np.median 一起工作。我的问题是数据格式。我有一个 np.arrays 列表,而不是 3d-np.array。谢谢大家的帮助!
猜你喜欢
  • 2016-01-26
  • 2021-09-08
  • 2017-08-13
  • 2010-12-17
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多