OpenCV对椒盐处理后的视频进行均值滤波处理
代码实现:
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]=0else:result[x,y]= 255return result
if not sp.isOpened():print('无法打开视频文件')exit()
while True:ret,frame = sp.read() # ret 布尔值 判断是否读到视频帧 frame是读到的帧if not ret:breakframe = 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
,需为奇数)。
输出结果: