1 波形处理
针对实验视频v1.mp4。图像分辨率568*320像素,帧率为30帧/秒,颜色空间为RGB,拍摄1分30秒,共2700帧左右。为了对应心率为30次/分-120次/分,我们选用通带频率为0.5-2hz这一频率区间。
经过滤波器处理、滑动平均滤波、插值处理之后,效果如下图所示。
使用傅立叶变换可以观察到初步处理之后噪声已消除。初步处理前后效果如下图所示。
初步处理前
初步处理后
取出各峰值点,并标为红色,在初步处理的波形上绘制峰值点及峰值走势,并每隔一秒用黄线划分图像,效果如下图所示。从中,我们大致可以看出一定的趋势。
因为上图的波形中有些峰值过于突出,所以需要去除一些异常峰值,采用的方法是:取峰值数组的均值,去除小于峰值均值4/5的点以及大于峰值均值6/5的点。代码如下。
window = interpolated_hues
peaks, _ = find_peaks(window)
if len(peaks) > 3:
distances = np.empty((len(peaks)-1,))
for j in range(len(peaks)-1):
distances[j] = peaks[j+1] - peaks[j]
med = np.median(distances)
length = len(distances)
for j in range(length):
if (distances[length-1-j] > (1.2 * med)) or (distances[length-1-j] < (0.8 * med)):
distances = np.delete(distances, (length-1-j))
去除之后效果如下图所示。
广义的检波通常称为解调,是调制的逆过程,即从已调波提取调制信号的过程。狭义的检波是指从调幅波的包络提取调制信号的过程,这种检波方法也被称为包络检波。Python语言中,希尔伯特变换可以用作包络检波,代码如下。
from scipy import fftpack
hilbert=fftpack.hilbert(interpolated_hues)
envelop=np.sqrt(interpolated_hues**2 + hilbert**2)
发现包络检波可以消除一些干扰,并且实现类似于绘制出峰值的效果,如下图所示。