当前位置: 首页 > news >正文

机器视觉之图像处理篇

图像平滑处理包含:

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()
  1. import cv2 - 导入 OpenCV 库,用于图像处理

  2. image = cv2.imread("zzd02.png",0) - 读取图像文件:

    • "zzd02.png" 是要读取的图像文件名
    • 第二个参数 0 表示以灰度模式读取图像(将彩色图像转为黑白)
  3. 接下来五行是不同类型的阈值处理:
    cv2.threshold()函数参数说明:

    • 第一个参数:输入图像(必须是灰度图)
    • 第二个参数:阈值(140)
    • 第三个参数:最大值(200)- 当像素值超过阈值时设置的值
    • 第四个参数:阈值处理类型

    五种阈值处理类型的区别:

    • cv2.THRESH_BINARY:超过阈值的像素设为最大值 (200),否则设为 0
    • cv2.THRESH_BINARY_INV:与上面相反,超过阈值的设为 0,否则设为最大值 (200)
    • cv2.THRESH_TRUNC:超过阈值的像素设为阈值 (140),低于阈值的保持不变
    • cv2.THRESH_TOZERO:超过阈值的像素保持不变,低于阈值的设为 0
    • cv2.THRESH_TOZERO_INV:与上面相反,超过阈值的设为 0,低于阈值的保持不变
  4. 显示处理结果:

    • cv2.imshow("binary",binary):显示处理后的图像,第一个参数是窗口名称
    • cv2.waitKey(0):等待用户按键,参数 0 表示无限等待
    • 每种阈值处理的结果都在单独的窗口中显示,按任意键会关闭当前窗口并显示下一个
  5. 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():方框滤波,可以选择是否归一化

代码功能总结

  1. 读取视频文件 "test.avi"
  2. 对视频的每一帧进行处理:
    • 显示原始帧
    • 给帧添加椒盐噪声并显示
    • 使用高斯滤波去除噪声并显示
    • 使用中值滤波去除噪声并显示
  3. 提供了退出机制(按 ESC 键)
  4. 包含了其他滤波方法的示例(已注释)

不同滤波方法的特点

  • 高斯滤波:对高斯噪声效果好,会使图像模糊
  • 中值滤波:对椒盐噪声效果显著,能较好保留边缘
  • 均值滤波:简单但容易使图像模糊
  • 方框滤波:可以选择是否归一化,灵活性高

运行这段代码时,会同时显示原始视频、带噪声视频以及两种去噪处理后的视频效果,便于直观比较不同去噪方法的效果。

http://www.lryc.cn/news/620981.html

相关文章:

  • c/c++ UNIX 域Socket和共享内存实现本机通信
  • 从概率填充到置信度校准:GPT-5如何从底层重构AI的“诚实”机制
  • 【网络安全测试】手机APP安全测试工具NowSecure 使用指导手册(有关必回)
  • PHP 开发全解析:从基础到实战的进阶之路
  • 【CV 目标检测】R-CNN①——Overfeat
  • GPT-5 提示词优化全攻略:用 Prompt Optimizer 快速迁移与提升,打造更稳更快的智能应用
  • RH134 管理基本存储知识点
  • 【车联网kafka】用钟表齿轮理解 Kafka 时间轮​(第七篇)
  • PlantSimulation知识点2025.8.14
  • pycharm远程连接服务器跑实验详细操作
  • 云计算-Docker Compose 实战:从OwnCloud、WordPress、SkyWalking、Redis ,Rabbitmq等服务配置实例轻松搞定
  • UML函数原型中stereotype的含义,有啥用?
  • UE5 C++ 删除文件
  • 4.Ansible部署文件到主机
  • 配置docker pull走http代理
  • 【网络】HTTP总结复盘
  • 河南萌新联赛2025第(五)场:信息工程大学补题
  • TensorFlow深度学习实战(32)——深度Q网络(Deep Q-Network,DQN)
  • Azure微软云内网接入问题
  • 老生常谈之引用计数:《More Effective C++》条款29
  • 位操作:底层编程利器
  • 通过网页调用身份证阅读器http websocket方法-华视电子————仙盟创梦IDE
  • Uniapp 中 uni.request 的二次封装
  • 22.Linux samba服务
  • 15、C语言预处理知识点总结
  • 18.14 全量微调实战手册:7大核心配置提升工业级模型训练效率
  • 并发编程原理与实战(二十三)StampedLock应用实战与其他锁性能对比分析
  • 深度学习ubuntu系统常用指令和技巧
  • VisDrone数据集,专为无人机视觉任务打造
  • Linux面试题及详细答案 120道(1-15)-- 基础概念