机器视觉之图像处理篇
图像平滑处理包含:
1 均值滤波 2 方框滤波 3 高斯滤波 4 中值滤波 5 双边滤波
均值滤波(Mean filtering):是指用当前像素点周围nxn个像素值的均值来代替当前像素值。边界点的处理可以扩展当前图像的周围像素点padding
方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。
高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。
[0,48,56,95,128,130,212,215,250]
import cv2
image = cv2.imread("zzd02.png",0)
ret ,binary = cv2.threshold(image,140,200,cv2.THRESH_BINARY)
ret1 ,binary1 = cv2.threshold(image,140,200,cv2.THRESH_BINARY_INV)
ret2 ,binary2 = cv2.threshold(image,140,200,cv2.THRESH_TRUNC)
ret3 ,binary3 = cv2.threshold(image,140,200,cv2.THRESH_TOZERO)
ret4 ,binary4 = cv2.threshold(image,140,200,cv2.THRESH_TOZERO_INV)cv2.imshow("binary",binary)
cv2.waitKey(0)
cv2.imshow("binary1",binary1)
cv2.waitKey(0)
cv2.imshow("binary2",binary2)
cv2.waitKey(0)
cv2.imshow("binary3",binary3)
cv2.waitKey(0)
cv2.imshow("binary4",binary4)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
- 导入 OpenCV 库,用于图像处理image = cv2.imread("zzd02.png",0)
- 读取图像文件:- "zzd02.png" 是要读取的图像文件名
- 第二个参数 0 表示以灰度模式读取图像(将彩色图像转为黑白)
接下来五行是不同类型的阈值处理:
cv2.threshold()
函数参数说明:- 第一个参数:输入图像(必须是灰度图)
- 第二个参数:阈值(140)
- 第三个参数:最大值(200)- 当像素值超过阈值时设置的值
- 第四个参数:阈值处理类型
五种阈值处理类型的区别:
cv2.THRESH_BINARY
:超过阈值的像素设为最大值 (200),否则设为 0cv2.THRESH_BINARY_INV
:与上面相反,超过阈值的设为 0,否则设为最大值 (200)cv2.THRESH_TRUNC
:超过阈值的像素设为阈值 (140),低于阈值的保持不变cv2.THRESH_TOZERO
:超过阈值的像素保持不变,低于阈值的设为 0cv2.THRESH_TOZERO_INV
:与上面相反,超过阈值的设为 0,低于阈值的保持不变
显示处理结果:
cv2.imshow("binary",binary)
:显示处理后的图像,第一个参数是窗口名称cv2.waitKey(0)
:等待用户按键,参数 0 表示无限等待- 每种阈值处理的结果都在单独的窗口中显示,按任意键会关闭当前窗口并显示下一个
cv2.destroyAllWindows()
:关闭所有打开的图像窗口
这段代码的作用是展示同一幅图像在不同阈值处理方法下的效果,帮助理解各种阈值处理的差异。运行时,会依次显示 5 个处理结果窗口,每个窗口需要按一次键才能切换到下一个。
import cv2
import numpy as npdef add_peppersalt_noise(image,n=10000):result = image.copy()h,w = image.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 resulta = cv2.VideoCapture('test.avi')
if not a.isOpened():print("视频损坏,无法读取 ")exit()while True:ref,fream=a.read()if not ref:break# fream = cv2.cvtColor(fream,cv2.COLOR_BGR2RGB)cv2.imshow("fream", fream)noise = add_peppersalt_noise(fream)cv2.imshow("noise", noise)GaussianB = cv2.GaussianBlur(noise, (3, 3), 1) # 高斯滤波cv2.imshow('GaussianBlur', GaussianB)medianB =cv2.medianBlur(noise,3)cv2.imshow( 'medianBlur',medianB) # 4、中值滤波if cv2.waitKey(6)==27:breaka.release()
cv2.destroyAllWindows()# blur1 = cv2.blur(noise,(3,3))
# cv2.imshow( 'blur1',blur1)
# cv2.waitKey(0)
# blur2=cv2.blur(noise,(63,63))
# cv2.imshow('blur2',blur2)
# cv2.waitKey(0)
# boxFilter1 = cv2.boxFilter(noise,-1,(3,3),normalize = True)
# cv2.imshow('boxFilter1',boxFilter1)
# cv2.waitKey(0)
# boxFilter2 =cv2.boxFilter(noise,-1,(3,3),normalize = False)
# cv2.imshow('boxFilter 2',boxFilter2)
# cv2.waitKey(0)
导入库
python
运行
import cv2 # 导入OpenCV库,用于视频处理和图像处理
import numpy as np # 导入NumPy库,用于生成随机数等操作
定义添加椒盐噪声的函数
python
运行
def add_peppersalt_noise(image, n=10000):result = image.copy() # 复制原图,避免修改原图h, w = image.shape[:2] # 获取图像的高度和宽度# 循环添加n个噪声点for i in range(n):# 随机生成噪声点的坐标x = np.random.randint(1, h)y = np.random.randint(1, w)# 50%概率添加黑色噪声(椒噪声),50%概率添加白色噪声(盐噪声)if np.random.randint(0, 2) == 0:result[x, y] = 0 # 黑色噪声else:result[x, y] = 255 # 白色噪声return result # 返回添加噪声后的图像
3. 视频读取与处理主逻辑
python
运行
a = cv2.VideoCapture('test.avi') # 打开视频文件# 检查视频是否成功打开
if not a.isOpened():print("视频损坏,无法读取 ")exit()# 循环读取视频帧
while True:ref, fream = a.read() # 读取一帧,ref表示是否成功,fream是帧数据if not ref: # 如果没有读取到帧(视频结束),退出循环break# 显示原始帧cv2.imshow("fream", fream)# 对当前帧添加椒盐噪声noise = add_peppersalt_noise(fream)cv2.imshow("noise", noise) # 显示带噪声的帧# 高斯滤波去噪GaussianB = cv2.GaussianBlur(noise, (3, 3), 1)cv2.imshow('GaussianBlur', GaussianB)# 中值滤波去噪medianB = cv2.medianBlur(noise, 3)cv2.imshow('medianBlur', medianB)# 等待6毫秒,若按下ESC键(ASCII码27)则退出if cv2.waitKey(6) == 27:break# 释放资源
a.release() # 释放视频捕获对象
cv2.destroyAllWindows() # 关闭所有显示窗口
4. 注释掉的其他滤波方法
代码末尾注释了几种其他的滤波方法,包括:
cv2.blur()
:均值滤波,使用不同大小的卷积核cv2.boxFilter()
:方框滤波,可以选择是否归一化
代码功能总结
- 读取视频文件 "test.avi"
- 对视频的每一帧进行处理:
- 显示原始帧
- 给帧添加椒盐噪声并显示
- 使用高斯滤波去除噪声并显示
- 使用中值滤波去除噪声并显示
- 提供了退出机制(按 ESC 键)
- 包含了其他滤波方法的示例(已注释)
不同滤波方法的特点
- 高斯滤波:对高斯噪声效果好,会使图像模糊
- 中值滤波:对椒盐噪声效果显著,能较好保留边缘
- 均值滤波:简单但容易使图像模糊
- 方框滤波:可以选择是否归一化,灵活性高
运行这段代码时,会同时显示原始视频、带噪声视频以及两种去噪处理后的视频效果,便于直观比较不同去噪方法的效果。