OpenCV对椒盐处理后的视频进行均值滤波处理

发布于:2025-08-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

代码实现:

import cv2
import numpy as np
sp = cv2.VideoCapture('test.avi')
def add_peppersalt_noise(frame,n=10000):
    result = frame.copy()
    h,w= frame.shape[:2]
    for i in range(n):
        x=np.random.randint(1,h)
        y=np.random.randint(1,w)
        if np.random.randint(0,2) == 0:
            result[x,y]=0
        else:
            result[x,y]= 255
    return result
if not sp.isOpened():
    print('无法打开视频文件')
    exit()
while True:
    ret,frame = sp.read() # ret 布尔值 判断是否读到视频帧 frame是读到的帧
    if not ret:
        break
    frame = cv2.resize(frame, (540, 380))
    cv2.imshow('video',frame)
    noise = add_peppersalt_noise(frame)
    medianB = cv2.medianBlur(noise, 3)
    cv2.imshow('noise',noise)
    cv2.imshow('medianBlur',medianB)
    if cv2.waitKey(1) == 27:
        break
sp.release()
cv2.destroyAllWindows()

代码解释:

这段代码实现了对视频添加椒盐噪声椒盐噪声(salt-and-pepper noise)并使用中值滤波进行去噪处理的功能,主要分为视频读取、噪声添加、去噪处理和结果显示四个部分。以下是详细解释:

1. 导入库

import cv2  # OpenCV库,用于视频处理和图像处理
import numpy as np  # NumPy库,用于生成随机数和数组操作

2. 打开视频文件

sp = cv2.VideoCapture('test.avi')  # 创建视频捕获对象,读取本地视频文件'test.avi'

cv2.VideoCapture 用于打开视频文件或摄像头,这里传入视频路径表示读取本地文件。

3. 定义添加椒盐噪声的函数

def add_peppersalt_noise(frame, n=10000):
    result = frame.copy()  # 复制原始帧,避免修改原图
    h, w = frame.shape[:2]  # 获取图像的高度(h)和宽度(w)
    for i in range(n):  # 循环n次,添加n个噪声点
        x = np.random.randint(1, h)  # 随机生成x坐标(1到h-1之间)
        y = np.random.randint(1, w)  # 随机生成y坐标(1到w-1之间)
        if np.random.randint(0, 2) == 0:  # 50%概率生成"椒噪声"(黑色点)
            result[x, y] = 0  # 像素值设为0(黑色)
        else:  # 50%概率生成"盐噪声"(白色点)
            result[x, y] = 255  # 像素值设为255(白色)
    return result  # 返回添加噪声后的图像

​​​​​​​椒盐噪声:图像中随机出现的黑色点(椒噪声,值为 0)和白色点(盐噪声,值为 255),模拟图像传感器干扰或传输错误。

参数 n 控制噪声数量(默认 10000 个),值越大噪声越密集。

4. 检查视频是否打开成功

if not sp.isOpened():
    print('无法打开视频文件')
    exit()  # 打开失败则退出程序

​​​​​​​isOpened() 用于判断视频是否成功打开(路径错误、文件损坏等会导致失败)。

5. 循环处理视频帧

while True:
    ret, frame = sp.read()  # 读取一帧视频
    # ret:布尔值,True表示读取成功;frame:当前帧的图像数组(numpy数组)
    if not ret:
        break  # 读取失败或视频结束,退出循环

    # 调整帧大小(可选,便于显示)
    frame = cv2.resize(frame, (540, 380))  # 缩放到宽540、高380像素

    # 显示原始视频帧
    cv2.imshow('video', frame)

    # 对当前帧添加椒盐噪声
    noise = add_peppersalt_noise(frame)
    cv2.imshow('noise', noise)  # 显示带噪声的帧

    # 对噪声帧进行中值滤波去噪
    medianB = cv2.medianBlur(noise, 3)  # 3×3卷积核的中值滤波
    cv2.imshow('medianBlur', medianB)  # 显示去噪后的帧

    # 按ESC键(ASCII码27)退出循环
    if cv2.waitKey(1) == 27:
        break

中值滤波cv2.medianBlur):对椒盐噪声去噪效果极佳,原理是用邻域内像素的中值替换中心像素,能有效去除极端值(黑白噪声点)。

cv2.waitKey(1):等待 1 毫秒,同时检测按键,确保窗口刷新和交互。

6. 释放资源

sp.release()  # 释放视频捕获对象
cv2.destroyAllWindows()  # 关闭所有显示窗口

必须在程序结束时释放资源,避免内存泄漏。

整体效果

运行后会显示三个窗口:

video:原始视频帧

noise:添加椒盐噪声后的视频帧(可见大量黑白斑点)

medianBlur:中值滤波处理后的视频帧(噪声明显减少,图像较清晰)

通过对比可以直观看到中值滤波对椒盐噪声的去除效果。如果噪声更严重,可增大 add_peppersalt_noise 中的 n 值,或调整 medianBlur 的卷积核大小(如 5,需为奇数)。

输出结果:

​​​​​​​


网站公告

今日签到

点亮在社区的每一天
去签到