以下是使用 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

Python OpenCV 视频低通滤波:去除 60Hz 以上噪声

原文地址: https://www.cveoy.top/t/topic/fMpS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录