Python OpenCV实现视频低通滤波:去除60Hz噪声,保留20Hz正向波
Python OpenCV实现视频低通滤波:去除60Hz噪声,保留20Hz正向波
本文介绍如何使用Python的OpenCV库对视频进行低通滤波,去除60Hz及以上的噪声,同时保留20Hz的正向波。
代码示例pythonimport cv2import numpy as np
创建低通滤波器def create_lowpass_filter(height, width, cutoff_freq): lowpass_filter = np.zeros((height, width), dtype=np.float32) center_height = height // 2 center_width = width // 2 for i in range(height): for j in range(width): distance = np.sqrt((i - center_height) ** 2 + (j - center_width) ** 2) if distance <= cutoff_freq: lowpass_filter[i, j] = 1 return lowpass_filter
读取视频数据cap = cv2.VideoCapture('input_video.mp4')
获取视频帧率和尺寸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))
创建输出视频文件out = cv2.VideoWriter('output_video.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
低通滤波器参数cutoff_freq = 20
创建低通滤波器lowpass_filter = create_lowpass_filter(height, width, cutoff_freq)
while cap.isOpened(): ret, frame = cap.read() if not ret: break # 将图像转换为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 对图像进行傅里叶变换 dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) # 将低频部分与高频部分分离 dft_shift = np.fft.fftshift(dft) magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) # 应用低通滤波器 filtered_spectrum = dft_shift * lowpass_filter # 将频谱进行逆变换 filtered_shift = np.fft.ifftshift(filtered_spectrum) filtered_img = cv2.idft(filtered_shift) filtered_img = cv2.magnitude(filtered_img[:, :, 0], filtered_img[:, :, 1]) # 将图像转换为灰度图 filtered_img = cv2.normalize(filtered_img, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) # 写入输出视频文件 out.write(filtered_img) cv2.imshow('Original', gray) cv2.imshow('Filtered', filtered_img) if cv2.waitKey(1) & 0xFF == ord('q'): break
cap.release()out.release()cv2.destroyAllWindows()
代码说明
- 导入库: 导入
cv2(OpenCV) 和numpy库。2. 创建低通滤波器:create_lowpass_filter函数根据截止频率创建一个圆形低通滤波器。3. 读取视频: 使用cv2.VideoCapture读取视频文件'input_video.mp4'。4. 获取视频信息: 获取视频帧率、宽度和高度。5. 创建输出视频: 使用cv2.VideoWriter创建输出视频文件'output_video.mp4'。6. 设置截止频率:cutoff_freq变量定义低通滤波器的截止频率,设置为20以保留20Hz的正向波。7. 循环处理视频帧: - 读取视频帧,直到视频结束。 - 将帧转换为灰度图。 - 使用cv2.dft对图像进行傅里叶变换。 - 使用np.fft.fftshift将零频率分量移到频谱中心。 - 应用低通滤波器,过滤掉高频噪声。 - 使用np.fft.ifftshift将零频率分量移回原位。 - 使用cv2.idft进行逆傅里叶变换,得到滤波后的图像。 - 将滤波后的图像转换为8位灰度图。 - 将处理后的帧写入输出视频文件。 - 显示原始和滤波后的图像。 - 按下'q'键退出循环。8. 释放资源: 释放VideoCapture、VideoWriter对象,并关闭所有窗口。
参数说明
cutoff_freq: 低通滤波器的截止频率,单位为像素。该值决定了哪些频率的信号可以通过滤波器。较低的值对应于更严格的滤波,会去除更多的高频信息。
注意事项
- 请确保已安装OpenCV库 (
pip install opencv-python)。- 将您的视频文件命名为'input_video.mp4',或修改代码中相应的路径。- 您可以根据需要调整cutoff_freq参数的值,以获得最佳的滤波效果。
原文地址: https://www.cveoy.top/t/topic/fMpM 著作权归作者所有。请勿转载和采集!