《机器学习》—— OpenCV 对图片的各种操作(均值、方框、高斯、中值滤波处理)

news/2024/9/18 1:23:23/ 标签: opencv, 机器学习, 计算机视觉

文章目录

  • 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理
  • 2、给图像边缘增加边框
  • 3、对图片进行阈值化操作

1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理

  • 均值滤波

    • cv2.blur是 OpenCV 库中的一个函数,用于对图像进行均值模糊处理。这个函数通过计算图像中每个像素点周围邻域内像素值的平均值,来替换该像素点的值,从而实现模糊效果。这种模糊处理对于去除图像中的噪声或进行图像预处理很有用。
    • 参数说明:
    • dst = cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)
      • src: 输入图像,可以是任意数量的单通道或多通道图像。
      • ksize(重要参数): 模糊核的大小,格式为 (宽度, 高度)。宽度和高度都应该是正数和奇数。
      • dst: 输出图像,与输入图像具有相同的类型和大小。这个参数是可选的。
      • anchor: 锚点;它表示核中心点的位置。默认值是 (-1, -1),表示核的中心位于其几何中心。
      • borderType: 边界像素的外推方法。默认是 cv2.BORDER_DEFAULT。
  • 方框滤波

    • cv2.boxFilter 是 OpenCV 库中的一个函数,用于对图像进行盒式滤波(Box Filtering)。盒式滤波实际上是一种特殊的均值滤波,其中滤波核中的每个元素都相等(通常是1),并且在应用滤波时会进行归一化(即除以核内元素的总数),以确保输出图像的亮度保持不变。然而,在某些实现中,特别是在 OpenCV 的 cv2.boxFilter() 函数中,你可以选择是否进行归一化。
    • 参数说明:
    • dst = cv2.boxFilter(src, ddepth, ksize, normalize=None, anchor=None, borderType=None)
      • src: 输入图像。
      • ddepth(重要参数): 输出图像的所需深度。如果为 -1,则输出图像将与输入图像具有相同的深度,但请注意归一化行为的差异(尽管 normalize 参数已被废弃)。对于大多数用途,你可能希望将 ddepth 设置为 cv2.CV_8U、cv2.CV_16U、cv2.CV_16S、cv2.CV_32F 或 cv2.CV_64F 之一,以明确指定输出图像的位数。
      • ksize(重要参数): 滤波核的大小,格式为 (宽度, 高度)。宽度和高度都应该是正数和奇数。
      • normalize(已废弃): 布尔值,指示是否对结果进行归一化。在 OpenCV 4.x 及更高版本中,此参数已被废弃,因为归一化行为现在通过 ddepth 参数隐式控制。但是,由于它已被废弃,因此在使用新版本时应忽略此参数。
      • anchor: 锚点;它表示核中心点的位置。默认值是 (-1, -1),表示核的中心位于其几何中心。
      • borderType: 边界像素的外推方法。
  • 高斯滤波

    • cv2.GaussianBlur 是 OpenCV 库中用于对图像进行高斯模糊的函数。高斯模糊是一种广泛使用的图像模糊技术,它通过为图像中的每个像素点计算其周围像素点的加权平均值来工作,其中权重由高斯函数给出。这种模糊方法在处理图像时能够有效地减少图像噪声和细节层次,同时保持边缘相对清晰。
    • 参数说明:
    • dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY=0, dst=None, borderType=None)
      • src: 输入图像。
      • ksize(重要参数): 高斯核的大小,(宽度, 高度)。宽度和高度都应为正数和奇数,或者可以是从零传递的 (sigmaX, sigmaY)。然后从这些 sigma 值中导出窗口大小。如果 sigma 为零,则它们从 ksize.width 和 ksize.height 中计算得出;否则,ksize.width 和 ksize.height 被忽略。
      • sigmaX: X 方向上的高斯核标准偏差。
      • sigmaY: Y 方向上的高斯核标准偏差;如果 sigmaY 为零,则与 sigmaX 相同;如果两者都为零,则分别从 ksize.width 和 ksize.height 中计算得出。对于大多数用途,可以将 sigmaX 和 sigmaY 设置为相同的值。
      • dst: 输出图像;这个参数是可选的。
      • borderType: 像素外推法的标志;默认值是 cv2.BORDER_DEFAULT。
  • 中值滤波

    • cv2.medianBlur 是 OpenCV 库中用于对图像进行中值模糊的函数。中值模糊是一种非线性的滤波技术,它用图像中每个像素点周围邻域内像素值的中位数来替换该像素点的值。这种方法对于去除椒盐噪声(salt-and-pepper noise)特别有效,因为它基于排序操作而不是平均值计算,因此能够更好地保持边缘信息。
    • 参数说明:
    • dst = cv2.medianBlur(src, ksize)
      • src: 输入图像,必须是单通道图像(灰度图)或每个通道分别处理的多通道图像。
      • ksize(重要参数): 中值滤波核的大小,必须是大于1的奇数。
    # 创建制造椒盐噪声的函数
    def add_peppersalt_noise(ManBa, n=10000):result = ManBa.copy()w, h = ManBa.shape[:2]  # 获取图片的高和宽for i in range(n):  # 生成n个椒盐噪声x = np.random.randint(1, w)y = np.random.randint(1, h)if np.random.randint(0, 2) == 0:result[x, y] = 0else:result[x, y] = 255return resultMB = cv2.imread('kobe.jpg')  # 获取原图
    ManBa = cv2.resize(MB, dsize=None, fx=0.4, fy=0.4)  # 设置图片大小
    cv2.imshow('sro', ManBa)
    cv2.waitKey(0)noise = add_peppersalt_noise(ManBa)  # 生成椒盐噪声图片
    cv2.imshow('noise', noise)
    cv2.waitKey(0)"""均值滤波   blur """
    blur_1 = cv2.blur(noise, (3, 3))  # 卷积核为3,3
    cv2.imshow('blur_1', blur_1)
    cv2.waitKey(0)"""方框滤波  boxFilter """
    boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True) # 深度为-1, 滤波核为3*3
    cv2.imshow('boxFilter_1', boxFilter_1)
    cv2.waitKey(0)"""高斯滤波  GaussianBlur """
    GaussianBlur_1 = cv2.GaussianBlur(noise, (3, 3), 1)# 高斯核大小为3*3,高斯核标准偏差为1
    cv2.imshow('GaussianBlur_1', GaussianBlur_1)
    cv2.waitKey(0)"""中值滤波  medianBlur """
    medianBlur_1 = cv2.medianBlur(noise, 3)  # 滤波核为3*3
    cv2.imshow('medianBlur_1', medianBlur_1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图椒盐噪声图
    在这里插入图片描述

  • 均值滤波方框滤波处理后的图
    在这里插入图片描述

  • 高斯滤波中值滤波处理后的图
    在这里插入图片描述

  • 由结果可以看出中值滤波对有椒盐噪声的图片处理的效果最好

2、给图像边缘增加边框

  • cv2.copyMakeBorder是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)

  • 它有以下几个参数:

  • cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value=None)

    • src:要扩充边界的原始图像
    • top, bottom, left, right:相应方向上的边框宽度(以像素为单位)
    • borderType:定义要添加边框的类型,它可以是以下的一种:
      • cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要再额外给定一个参数 value -> 指定边框的颜色值)
      • cv2.BORDER_REFLECT:添加的边界框像素将是边界元素的镜面反射,类似于-hgfedcba|abcdefgh|hgfedcba (交界处也复制了)
      • cv2.BORDER_REFLECT101 或 cv2.BORDER_DEFAULT:和上面类似,但是有一些细微的不同,类似于hgfedcb|abcdefgh|gfedcba (交界处删除了)
      • cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaaa|abcdefgh|hhhhhhh
      • cv2.BORDER_WRAP:上下两边替换,左右两边替换
    • value(可选):当 borderType 为 cv2.BORDER_CONSTANT 时,需要指定边框的颜色,默认为黑色。这是一个与源图像具有相同通道数的数组。
    import cv2
    MB = cv2.imread('kobe.jpg')  # 读取原始图片
    ManBa = cv2.resize(MB, dsize=None, fx=0.5, fy=0.5)  # 调整一下图片大小(可选,根据原始图片大小决定)
    top, bottom, left, right = 50, 50, 50, 50 # 设置各方向上的边框宽度constant = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=255)
    reflect = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
    reflect101 = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
    replicate = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
    wrap = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_WRAP)cv2.imshow('yuantu', ManBa)
    cv2.waitKey(0)
    cv2.imshow('constant', constant)
    cv2.waitKey(0)
    cv2.imshow('reflect', reflect)
    cv2.waitKey(0)
    cv2.imshow('reflect101', reflect101)
    cv2.waitKey(0)
    cv2.imshow('replicate', replicate)
    cv2.waitKey(0)
    cv2.imshow('wrap', wrap)
    cv2.waitKey(0)
    

    在这里插入图片描述

3、对图片进行阈值化操作

  • cv2.threshold 是 OpenCV 中用于进行阈值化操作的一个非常基础的函数。阈值化是一种简单的图像分割技术,它将图像转换成黑白图像(或二值图像),或者将图像划分为几个区域。这种技术通常用于预处理图像,以便进行进一步的分析,如边缘检测、图像分割等

  • 它有以下几个参数:

  • cv2.threshold(src, thresh, maxval, type, dst=None)

    • src:要进行阈值处理的源图像,应该是灰度图。
    • thresh:阈值的具体值。
    • maxval:当像素值超过(或有时是小于,取决于阈值类型)阈值时应该被赋予的新值。
    • type:阈值化操作的类型。这个参数决定了函数的行为。常用的值有:
      • cv2.THRESH_BINARY
      • cv2.THRESH_BINARY_INV
      • cv2.THRESH_TRUNC
      • cv2.THRESH_TOZERO
      • cv2.THRESH_TOZERO_INV
      • cv2.THRESH_OTSU 和 cv2.THRESH_TRIANGLE 用于自动计算最佳阈值(此时thresh参数被忽略,仅作为占位符)。
    • dst:这个参数是可选的,用于存储函数的输出图像。
    MB = cv2.imread('kobe.jpg', cv2.IMREAD_GRAYSCALE)  # 读取图片,并转换为灰度图
    ManBa = cv2.resize(MB, dsize=None, fx=0.4, fy=0.4)   # 设置图片大小ret, binary = cv2.threshold(ManBa, 155, 255, cv2.THRESH_BINARY)
    ret1, binaryinv = cv2.threshold(ManBa, 155, 255, cv2.THRESH_BINARY_INV)
    ret2, trunc = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TRUNC)
    ret3, tozero = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TOZERO)
    ret4, tozeroinv = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TOZERO_INV)cv2.imshow('yuantu', ManBa)
    cv2.waitKey(0)
    cv2.imshow('binary', binary)
    cv2.waitKey(0)
    cv2.imshow('binaryinv', binaryinv)
    cv2.waitKey(0)
    cv2.imshow('trunc', trunc)
    cv2.waitKey(0)
    cv2.imshow('tozero', tozero)
    cv2.waitKey(0)
    cv2.imshow('tozeroinv', tozeroinv)
    cv2.waitKey(0)
    

在这里插入图片描述


http://www.ppmy.cn/news/1517072.html

相关文章

幂等性简介

幂等性(Idempotence)是计算机科学中的一个重要概念,特别是在分布式系统和网络服务中。幂等性操作的特点是,无论执行多少次,结果都是相同的。换句话说,幂等性操作在多次执行后,对系统的状态不会产…

pycharm中opencv-python和opencv-contrib安装

1.去到https://pypi.org/中查找opencv-python 和opencv-contrib-python 2.分别下载。 3.下载完后,打开pycharm,然后新建一个项目,设置项目配置环境为当前python环境, 4.打开pycharm提供的控制台,使用pip install 安装文…

Datawhale第五期夏令营-CV竞赛

CV竞赛 0.赛事报名租用4090 1.开始运行下载文件提交结果 2.内容解释赛题背景赛题目标社会价值评分规则baseline精读代码什么是YOLO 主要代码内容精读使用Ultraalytics运行代码 0.赛事报名 赛事官网:https://www.marsbigdata.com/competition/details?id3839107548872 租用40…

密码强度验证——js基础积累

//密码强度等级 getPwdLevel:function (pwd,minLength8) {var level 0;if (pwd.length < minLength) return level;if (/\d/.test(pwd)) level; //数字if (/[a-z]/.test(pwd)) level; //小写if (/[A-Z]/.test(pwd)) level; //大写if (/\W/.test(pwd)) level; //特殊字符ret…

第四章:照相机模型与增强现实

目录 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 2 照相机标定 3 以平面和标记物进行姿态估计 4 增强现实 4.1 PyGame和PyOpenGL 4.2 从照相机矩阵到OpenGL格式 4.3 在图像中放置物体 1 针孔照相机模型 针孔照相机…

MYSQL集群技术

---------------第一部分---------------------- 一.mysql源码部署 环境&#xff1a;rhel7.9 1.1.下载安装包 官网&#xff1a;http://www.mysql.com 1.2.在linux下部署mysql 1.创建登录用户和数据目录&#xff0c;并给数据目录赋权&#xff0c;因为配置文件读取需要权限&…

WPF中如何根据数据类型使用不同的数据模板

我们在将一个数据集合绑定到列表控件时&#xff0c;有时候想根据不同的数据类型&#xff0c;显示为不同的效果。 例如将一个文件夹集合绑定到ListBox时&#xff0c;系统文件夹和普通文件夹分别显示为不同的效果&#xff0c;就可以使用模板选择器功能。 WPF提供了一个模板选择…

机器学习-训练集、验证集、测试集(附:分割方法+交叉验证)【随记】

训练集、验证集、测试集&#xff08;附&#xff1a;分割方法交叉验证&#xff09; 1. 训练集&#xff08;Training Set&#xff09; 2. 验证集&#xff08;Validation Set&#xff09; 3. 测试集&#xff08;Test Set&#xff09; 4. 数据集的分割方法 5. 交叉验证&#x…

2024.8.15(python管理mysql、Mycat实现读写分离)

一、python管理mysql 1、搭建主mysql [rootmysql57 ~]# tar -xf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz [rootmysql57 ~]# cp -r mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql [rootmysql57 ~]# rm -rf /etc/my.cnf [rootmysql57 ~]# mkdir /usr/local/mysql…

pdf与canvas结合使用的场景1——为pdf增加水印

title: pdf与canvas结合使用的场景 date: 2024-08-28 10:03:45 tags: javascript 场景1:生成新的pdf水印 添加水印场景分析 这种情况下&#xff0c;不用再次封装好的一些水印工具的话&#xff0c;纯vue3前端的话就是使用pdfjscanvas来生成。 思路&#xff1a;1.上传并读取p…

《第二十八章:性能优化 - 电量优化》

一、引言 在 Android 应用开发中&#xff0c;电量优化是提升用户体验、延长设备续航的重要环节。一个电量消耗过高的应用可能会导致用户不满&#xff0c;甚至卸载。在这一章中&#xff0c;我们将重点探讨如何通过合理使用传感器和优化网络请求来降低应用的电量消耗。 二、合理使…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试1、打开软件&#xff0c;测试2、克隆项目&#xff0c;测试 安装完成&#xf…

java-Mybatis框架02

1.#{} 和${}区别 #{} 是占位符&#xff0c;是采用编译方式向sql中传值&#xff0c;可以防止sql注入&#xff0c;如果往sql中传值&#xff0c;使用#{}${} 是将内容直接拼接到sql语句中&#xff0c;一般不用于向sql中传值&#xff0c;一般用于向sql中动态传递列名。区别&#xff…

代理IP的来源、工作原理与应用

在数字化时代&#xff0c;代理IP已经成为网络活动中不可或缺的一部分&#xff0c;尤其在跨境电商、网络营销、网络爬虫等领域&#xff0c;代理IP发挥着至关重要的作用。本文将深入探讨代理IP的来源、工作原理、应用以及潜在风险&#xff0c;帮助读者更好地理解并合理利用这一网…

Git下载安装配置

Git的下载与安装 Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和文件夹的变化。它最初由Linus Torvalds开发&#xff0c;用于管理Linux内核的源代码。Git的设计目标是&#xff1a;速度快、开发效率高、数据完整性和可靠性强。 Git通过创建一个存储库&#xff08;rep…

(一) 初入MySQL 【认识和部署】

前置资源 一、数据库概述 1.1、数据库基本概念 数据(Data) 描述事物的符号记录称为数据。数字、文字、图形、图像、声音、档案记录等都是数据。数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&#xff0…

Python实现RSA加解密算法

目录 深入了解RSA加密算法一、RSA算法概述1.1 关键步骤1.2 安全性分析 二、RSA算法的Python实现2.1 辅助函数2.2 密钥生成2.3 加密与解密2.4 使用示例 三、总结 深入了解RSA加密算法 RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一种非对称加密算法&#xff0c;由Ron …

如何快速熟悉一个软件

当入职一家新公司时&#xff0c;必然要熟悉一些新的软件项目&#xff0c;这个时候&#xff0c;如何才能快速熟悉软件项目&#xff0c;以达到快速上手的目的。 1大忌 还记得自己刚毕业的第一份工作&#xff0c;一上来就去看代码&#xff0c;看代码的细节。在看代码的时候&…

[C++]set和map的介绍及使用

关于set和map的接口函数部分&#xff0c;只重点介绍一些相较于别的容器有特殊地方的接口&#xff0c;set和map的接口可以触类旁通。 一、概念 &#xff08;一&#xff09;、关联式容器 关联式容器存储的元素是一个个的键值对<key,value>。通过键&#xff08;key&#x…

MATLAB 生成指定范围、角度、厚度的含噪平面点云(77)

模拟生成点云并可视化显示,可以验证算法有效性,尤其是针对验证算法的某方面 MATLAB 生成指定范围、角度、厚度的含噪平面点云(77) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 如题,模拟生成一组平面点云,含有噪声点,确定算法稳定性,可以指定生成平面的范围,厚…