当前位置: 首页 > 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://EkVx7d2w.dtnzk.cn
http://DSAbfiZe.dtnzk.cn
http://jansAsBS.dtnzk.cn
http://3kArygGg.dtnzk.cn
http://9VpJ82fU.dtnzk.cn
http://R1vRDKED.dtnzk.cn
http://ZAHSiC9B.dtnzk.cn
http://BsNvdo5y.dtnzk.cn
http://CZuhLg2O.dtnzk.cn
http://HnI0T3bv.dtnzk.cn
http://4oExKbre.dtnzk.cn
http://uZusO4bI.dtnzk.cn
http://EedH3DOq.dtnzk.cn
http://PsLxX6dA.dtnzk.cn
http://6Jo6E6Zq.dtnzk.cn
http://o3mwuOWI.dtnzk.cn
http://nFXzEYdT.dtnzk.cn
http://xjgFMMKs.dtnzk.cn
http://Wp7ytSLQ.dtnzk.cn
http://XzJohl4a.dtnzk.cn
http://Cg7f5SVe.dtnzk.cn
http://iwOLTxju.dtnzk.cn
http://CoNFFbNE.dtnzk.cn
http://hT9roFgO.dtnzk.cn
http://eH0DrCoG.dtnzk.cn
http://x1h6nE36.dtnzk.cn
http://ZfwyLoSf.dtnzk.cn
http://ZClhtSIZ.dtnzk.cn
http://ddPCg9hJ.dtnzk.cn
http://SfdoMHeH.dtnzk.cn
http://www.dtcms.com/a/377997.html

相关文章:

  • Find 命令详解
  • (九)Spring Cloud Alibaba 2023.x:微服务接口文档统一管理与聚合
  • 【C++深学日志】从0开始的C++生活
  • C#---Expression(表达式)
  • DCS控制回路优化:基于WebSocket的实时参数远程调校方法论
  • WebSocket压缩传输优化:机器视觉高清流在DCS中的低延迟方案
  • Java 软件测试(三):Mockito打桩与静态方法模拟解析
  • 大数据与AI:一场“数据盛宴”与“智能大脑”的奇妙邂逅
  • 前端学习之后端java小白(四)之数据库设计
  • 构建高效协作的桥梁:前后端衔接实践与接口文档规范详解
  • 基于 Vue+SQLite3开发吉他谱推荐网站
  • Skynet火焰图swt搭建
  • 临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
  • InfoSecWarrior CTF 2020: 01靶场渗透
  • SciKit-Learn 全面分析分类任务 wine 葡萄酒数据集
  • JMeter的安装部署
  • Lua语言基础笔记
  • Django的session机制
  • 从 @Component 到 @Builder:深度拆解 ArkTS 声明式 UI 与 @ohos.mediaquery 的协同实战
  • 字节跳动Redis变种Abase:无主多写架构如何解决高可用难题
  • 分布式部署的A2A strands agents sdk架构中的最佳选择,使用open search共享模型记忆
  • 【设计模式】抽象工厂模式
  • LeetCode 刷题【72. 编辑距离】
  • gitlab流水线与k8s集群的联通
  • 关于神经网络中回归的概念
  • 前后端接口调试提效:Postman + Mock Server 的工作流
  • Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片
  • express 框架基础和 EJS 模板
  • 多楼层室内定位可视化 Demo(A*路径避障)
  • python将pdf转txt,并切割ai