实现欧拉视频放大时scipy巴特沃斯带通滤波器报ValueError错误
错误原因
scipy.signal.butter返回的滤波器系数b、a本身应为一维数组,你当前获取的b、a形状为(1,11)存在多余的维度,不符合scipy.signal.lfilter对输入系数的一维要求。- 你为了解决类型错误给
b、a套方括号的操作,会进一步将系数转为三维数组,触发"depth too small"报错。 - 原类型错误的核心原因是输入的视频帧数据为
uint8整数类型,和浮点型的滤波器系数无法匹配运算类型。
修复方案
修改butter_bandpass_filter函数,先压缩系数的多余维度,同时将输入数据转为浮点型再做滤波,修改后代码如下:
import numpy as np import scipy.signal def butter_bandpass_filter(data, lowcut, highcut, fs, order=5): b, a = butter_bandpass(lowcut, highcut, fs, order=order) # 压缩多余维度,确保b、a为一维数组 b = b.squeeze() a = a.squeeze() # 输入数据转float32避免类型不匹配报错,沿时间轴(第0轴)滤波 y = scipy.signal.lfilter(b, a, data.astype(np.float32), axis=0) return y def butter_bandpass(lowcut, highcut, fs, order=5): nyq = 0.5 * fs low = lowcut / nyq high = highcut / nyq b, a = scipy.signal.butter(order, [low, high], btype='band') return b, a
如果后续需要把滤波后的结果和原视频叠加,记得把数值裁剪到0-255区间再转回uint8类型即可。
内容的提问来源于stack exchange,提问作者Nick Lai
相关产品推荐
相关产品推荐

