问题描述
我正在尝试为视频创建中值滤波器。目标是为每 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()
解决方法
这里有 :)、a
、b
和 c
是帧(比方说灰度),您必须将它们堆叠起来,就好像它们是 RGB 组件一样(尝试与5,它将起作用),然后将中位数应用于外轴(参见 question 和 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) ]])
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])
)
)
也检查
- numpy.median
- numpy.newaxis ---> 这个我真的不知道如何在新维度中添加更多数组
- 你也可以试试this
cv2
solution,我目前没有视频可以测试