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

news2024/9/21 16:50:09

文章目录

  • 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] = 0
            else:
                result[x, y] = 255
        return result
    
    
    MB = 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.coloradmin.cn/o/2079672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】通过Keepalived搭建mysql双主高可用集群

一、环境信息 主机名ip操作系统mysql版本VIP(虚拟ip)hadoop01192.168.10.200centos7_x865.7192.168.10.253hadoop03192.168.10.202centos7_x865.7 二、mysql集群搭建 两台节点,如果未部署mysql服务,部署文档请看【Mysql】mysql…

前端自动导入依赖

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

C++——string类(1)

### string是C中的一种类&#xff0c;在标准库中的&#xff1b;可以直接对字符串进行一系列操作。 string类类型的构造 1、无参构造&#xff1a; string(); 定义string对象的时候不给值&#xff0c;这个string类的对象里面没有字符&#xff1b; #include<iostream> #in…

VsCode中Jupyter找不到内核的问题

问题描述 之前可以选择内核&#xff08;可能要先 “Python: 选择解释器”&#xff0c;也可能不用&#xff09;&#xff0c;并且是自己检测到 conda 环境中的 Python。 但是后来会突然找不到内核&#xff0c;点击选择内核&#xff0c;会在空白下加载很久&#xff0c;无果。 这…

MIPI联盟D-PHYv1.2规范阅读笔记二之物理层接口协议PPI

本文阅读自eetop.cn_mipi_D-PHY_specification_v1-2.pdf Logical PHY-Protocol Interface Description&#xff08;PHY物理层协议接口描述PPI&#xff09; PHY物理层协议接口被用于连接物理层和通信栈与更高层协议栈之间建立联系。 表 31 定义了物理层协议接口&#xff08;P…

day10JS-this的使用规则

1. this情况总结 开启严格模式&#xff1a; "use strict"; //开启严格模式 1.全局&#xff1a;非严格this--->window &#xff0c;严格 this--->window。 2.普通函数执行&#xff1a;函数名() 非严格this-->window &#xff0c;严格 this--->undefined…

全新的大语言模型Grok-2,最新测评!!

埃隆马斯克再次引发轰动&#xff0c;他旗下的xAI公司推出了全新的大语言模型Grok-2&#xff01; 最新的Grok-2测试版已经发布&#xff0c;用户可以在&#x1d54f;平台上体验小版本的Grok-2 mini。 马斯克还通过一种谜语般的方式揭开了困扰大模型社区一个多月的谜团&#xff1a…

C/C++ 包管理器 Conan 安装及使用

文章目录 Github官网文档简介安装 Conan 包管理器Conan 私有存储库创建 profile 文件添加远程存储库依赖包操作命令 Artifactory 私有存储库下载安装包&#xff08;推荐&#xff09;Docker 方式安装 Conan 官方示例 Github https://github.com/conan-io/conan 官网 https://…

零代码上手,工厂数据管理从未如此简单

在当今快节奏的工业环境中&#xff0c;工厂管理者们越来越依赖于数据分析来优化生产流程、提高效率和降低成本。然而&#xff0c;传统的数据分析工具往往复杂难用&#xff0c;且动辄需要高昂的费用&#xff0c;这让很多工厂望而却步。不过最近本人发现了一款非常实用的报表工具…

智能废弃瓶子垃圾箱:城市环境的绿色守护者

随着城市化进程的加速&#xff0c;生活垃圾的处理成为城市管理中的一大挑战。智能废弃瓶子垃圾箱的出现&#xff0c;不仅提高了垃圾回收的效率&#xff0c;还促进了资源的循环利用&#xff0c;成为智慧城市建设的重要组成部分。 目录 技术概述 核心功能 应用场景 环境与社会…

Java数据结构栏目总结

目录 数组与稀疏数组 队列&#xff1a;自己用数组模拟Queue 环形队列&#xff0c;取模【取余】实现. 单链表(LinkList) 双向链表&#xff08;Next 、Pre&#xff09; 单向环形链表 线性结构 数组与稀疏数组 稀疏数组&#xff0c;很多0值&#xff0c;可用于压缩 特点&a…

在 AMD GPUs 上进行图分析使用 Gunrock

Graph analytics on AMD GPUs using Gunrock — ROCm Blogs 图和图分析是可以帮助我们理解复杂数据和关系的相关概念。在这种背景下&#xff0c;图是一种数学模型&#xff0c;用于表示实体&#xff08;称为节点或顶点&#xff09;及其连接&#xff08;称为边或链接&#xff09;…

【CTF Web】BUUCTF BUU BRUTE 1 Writeup(弱口令+暴力破解+字典攻击)

BUU BRUTE 1 1 点击启动靶机。 解法 随便输个用户名。 试试 admin。 用 burp 抓包。 生成四位数字的字典。 导入字典到 burp。 添加载荷位置。 开始爆破。破解完成&#xff0c;密码&#xff1a;6490。取得 flag。 注意 如果破解得慢的话&#xff0c;记得要续期靶机。不然靶机…

算法工程师秋招面试问题总结

大模型分布式训练并行 一般有 tensor parallelism、pipeline parallelism、data parallelism 几种并行方式,分别在模型的层内、模型的层间、训练数据三个维度上对 GPU 进行划分。三个并行度乘起来,就是这个训练任务总的 GPU 数量。 1.数据并行 数据并行是最常见的并行形式…

2024.8.27 作业

1> 提示并输入一个字符串&#xff0c;统计该字符串中字母个数、数字个数、空格个数、其他字符的个数 #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串>>>";getline(cin,s);int letter0,digit0,blank0,…

git 复制提交到另外分支上

查看提交id 在原分支上查看要复制的id git log切换目标分支 将刚才复制的id&#xff0c;在这个目标分支上执行复制命令 git cherry-pick <commit-id>其中是要复制的提交的提交ID 效果 新分支上未复制的提交&#xff1a; 新分支上已复制的提交&#xff1a;

PTA - C语言国庆题集2

目录 7-21 打妖怪7-22 统计连续高温的最大天数7-23 唱歌比赛打分7-24 找最长的字符串7-25 算龙脉7-26 DNA鉴定7-28 T9键盘7-31 单链表的创建&#xff0c;遍历与销毁7-36 有多少位是7&#xff1f;7-37 选择排序7-38 翻转单词顺序7-39 求因子和最大的数&#xff08;结构体排序&am…

min(n,k)*min(m,k)

今天看那场一题都没写出来的div12&#xff0c;发现我想了那么久的A题&#xff0c;别人用几行代码就搞出来了。。。&#xff0c;现在感觉这道题和状压dp好像。。。 这道题用到了切比雪夫距离。。。

2024114读书笔记|《漱玉词》—— 绛绡缕薄冰肌莹,雪腻酥香,满院东风,海棠铺绣,梨花飞雪

2024114读书笔记|《漱玉词》—— 绛绡缕薄冰肌莹&#xff0c;雪腻酥香&#xff0c;满院东风&#xff0c;海棠铺绣&#xff0c;梨花飞雪 《漱玉词》李清照&#xff0c;观之入微&#xff0c;是惆怅亦是欢乐&#xff0c;不费力就可以读完的小诗词&#xff0c;插图不错。 知否的主…

Spring理论知识(Ⅱ)——Spring核心容器模块

Spring的组成 Spring由20个核心依赖组成&#xff0c;这20个核心依赖可以分为6个核心模块 本篇文章着重描述Spring核心容器模块&#xff0c;其中包含了spring-beans&#xff0c;spring-core&#xff0c;spring-context&#xff0c;spring-expression-language&#xff08;…