Python OpenCV 视频低通滤波:去除 60Hz 以上噪声
以下是使用 Python 和 OpenCV 库实现读取视频数据并进行低通滤波的代码示例,该代码可以去除 60Hz 及以上频率的噪声,保留 20Hz 的正向波:
import cv2
import numpy as np
def apply_low_pass_filter(frame, cutoff_freq):
# 执行傅里叶变换
f = np.fft.fft2(frame)
fshift = np.fft.fftshift(f)
# 创建掩码以过滤掉高频
rows, cols = frame.shape
crow, ccol = rows//2, cols//2
mask = np.zeros((rows, cols), np.uint8)
mask[crow-cutoff_freq:crow+cutoff_freq, ccol-cutoff_freq:ccol+cutoff_freq] = 1
# 将掩码应用于傅里叶变换
fshift_filtered = fshift * mask
# 执行逆傅里叶变换
f_ishift = np.fft.ifftshift(fshift_filtered)
frame_filtered = np.fft.ifft2(f_ishift)
frame_filtered = np.abs(frame_filtered)
return frame_filtered
# 读取视频文件
cap = cv2.VideoCapture('input_video.mp4')
# 检查视频文件是否成功打开
if not cap.isOpened():
print("Error opening video file")
# 获取视频属性
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建 VideoWriter 对象以保存滤波后的视频
out = cv2.VideoWriter('filtered_video.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height), isColor=False)
# 定义低通滤波器的截止频率
cutoff_freq = 60
# 处理视频的每一帧
while cap.isOpened():
ret, frame = cap.read()
if ret:
# 将帧转换为灰度
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 应用低通滤波器
filtered_frame = apply_low_pass_filter(gray_frame, cutoff_freq)
# 将滤波后的帧转换回 BGR 颜色空间
filtered_frame = cv2.cvtColor(filtered_frame, cv2.COLOR_GRAY2BGR)
# 显示滤波后的帧
cv2.imshow('Filtered Video', filtered_frame)
# 将滤波后的帧保存到视频文件
out.write(filtered_frame)
# 按 'q' 退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
# 释放视频捕获和写入器对象
cap.release()
out.release()
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()
请确保已安装 OpenCV 库,并将输入视频文件命名为input_video.mp4。代码将读取视频文件并在窗口中显示滤波后的视频,同时将滤波后的视频保存为filtered_video.mp4。你可以根据需要调整滤波器的截止频率cutoff_freq。
原文地址: https://www.cveoy.top/t/topic/fMpS 著作权归作者所有。请勿转载和采集!