《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)及形态学处理
文章目录
- 《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)
- 边界填充
- 阈值处理
- 图像平滑处理
- 生成椒盐图片
- 均值滤波处理
- 方框滤波处理
- 高斯滤波处理
- 中值滤波处理
- 图像形态学
- 腐蚀
- 膨胀
- 开运算
- 闭运算
- 顶帽和黑帽
《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)
边界填充
cv2.copyMakeBorder()是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)。
copyMakeBorder(src: UMat, top: int, bottom: int, left: int, right: int, borderType: int, dst: UMat | None = ..., value: cv2.typing.Scalar = ...)
它有以下几个参数:
src:要扩充边界的原始图像。
top, bottom, left, right:相应方向上的边框宽度。
borderType:定义要添加边框的类型,它可以是以下的一种:
cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要额外再给定一个参数)。
cv2.BORDER_REFLECT:添加的边框像素将是边界元素的镜面反射,类似于gfedcba|abcdefgh|hgfedcba。 (交界处也复制了)
cv2.BORDER_REFLECT_101 或 cv2.BORDER_DEFAULT:和上面类似,但是有一些细微的不同,类似于gfedcb|abcdefgh|gfedcba (交接处删除了)
cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaa|abcdefgh|hhhhhhh
cv2.BORDER_WRAP:上下左右边依次替换,cdefgh|abcdefgh|abcdefg
ys = cv2.imread('demo1.png')
top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(100,20,220))
reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)cv2.imshow('yuantu',ys)
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)
阈值处理
阈值处理是指剔除图像内像素值高于一定值或低于一定值的像素点。使用的方法为:
retval,dst=cv2.threshold(src,thresh,maxval,type)retval代表返回的阈值dst代表阈值分割结果图像,与原始图像具有相同的大小和类型src代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值thresh代表要设定的阈值maxval代表type参数位THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值type代表阈值分割的类型,具体内容如下表所示:选项 像素值>thresh 其他情况
cv2.THRESH_BINARY maxval 0
cv2.THRESH_BINARY_INV 0 maxval
cv2.THRESH_TRUNC thresh 当前灰度值
cv2.THRESH_TOZERO 当前灰度值 0
cv2.THRESH_TOZERO_INV 0 当前灰度值
image = cv2.imread('demo1.png',0)
ret,binary=cv2.threshold(image,210,255,cv2.THRESH_BINARY)
ret1,binaryinv=cv2.threshold(image,210,255,cv2.THRESH_BINARY_INV)
ret2,trunc=cv2.threshold(image,210,255,cv2.THRESH_TRUNC)
ret3,tozero=cv2.threshold(image,210,255,cv2.THRESH_TOZERO)
ret4,tozeroinv=cv2.threshold(image,210,255,cv2.THRESH_TOZERO_INV)cv2.imshow('gray',image)
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)
cv2.destroyAllWindows()
图像平滑处理
图像平滑(smoothing)也称为“模糊处理”(bluring), 是一项简单且使用频率很高的图像处理方法。
可以用来压制、弱化或消除图像中的细节、突变、边缘和噪声。但最常见的是用来减少图像上的噪声或者失真。
降低图像分辨率时,平滑处理是很重要的。
下面是常用的一些滤波器均值滤波(邻域平均滤波)–> blur函数方框滤波–> boxFilter函数高斯滤波–>GaussianBlur函数中值滤波–>medianBlur函数dst=cv2.blur(src,ksize,anchor,borderType)dst是返回值src是需要处理的图像kszie是滤波核(卷积核)的大小anchor是锚点,默认值是(-1,-1)一般无需更改borderType是边界样式,一般无需更改
一般情况下,使用dst=cv2.blur(src,ksize)即可
生成椒盐图片
def add_peppersalt_noise(image,n=10000):result = image.copy()h, w=image.shape[:2] # 获取图片的高和宽for i in range(n): # 生成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 resultimage = cv2.imread('demo1.png')
cv2.imshow('sro',image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)
均值滤波处理
blur_1 = cv2.blur(noise,(3,3))
cv2.imshow('blur_1',blur_1)
cv2.waitKey(0)blur_2 = cv2.blur(noise,(5,5))
cv2.imshow('blur_2',blur_2)
cv2.waitKey(0)
方框滤波处理
dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:● dst是返回值,表示进行方框滤波后得到的处理结果。● src 是需要处理的图像,即原始图像。● ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。(可以理解为数据类型)● ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高 度和宽度。● anchor 是锚点,(指对应哪个区域)● normalize 表示在滤波时是否进行归一化。1.当值为True时,归一化,用邻域像素值的和除以面积。 此时方框滤波与 均值滤波 效果相同。2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
# 方框滤波
boxFilter_1 = cv2.boxFilter(noise,-1,(3,3),normalize=True)
cv2.imshow('boxFilter_1',boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise,-1,(3,3),normalize=False)
cv2.imshow('boxFilter_2',boxFilter_2)
cv2.waitKey(0)
高斯滤波处理
cv2.GaussianBlur(src, ksize[, sigmaX[, sigmaY[, dst]]])高斯滤波
参数说明:
src:输入图像,通常是一个NumPy数组。
ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如,(5, 5)表示一个5x5的滤波器。
sigmaX和sigmaY:分别表示在X轴和Y轴方向上的标准差。这些值与滤波器大小相同。默认情况下,它们都等于0,这意味着没有高斯模糊。
dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianBlur',GaussianB)
cv2.waitKey(0)
中值滤波处理
cv2.medianBlur(src, ksize[, dst])中值滤波参数说明:
src:输入图像。
ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如,5表示一个5x5的滤波器。
dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
medianB = cv2.medianBlur(noise,3)
cv2.imshow('medianBlur',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像形态学
腐蚀
1、图像腐蚀, 函数为:
cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
src: 输入的图像
kernel: 用于腐蚀的结构元件如果element = Mat(),则使用3 × 3的矩形结构单元。
dst: 它是与src相同大小和类型的输出图像。
iterations:腐蚀操作的迭代次数,默认为1。次数越多, 腐蚀操作执行的次数越多,腐蚀效果越明显
sun = cv2.imread('sun.png')
cv2.imshow('sun',sun)
cv2.waitKey(0)
kernel = np.ones((3,3),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=2)
cv2.imshow('erosion_1',erosion_1)
cv2.waitKey(0)
膨胀
2、图像膨胀, 函数为:
cv2.dilate(img, kernel, iteration)
参数含义:
img – 目标图片
kernel – 进行操作的内核,默认为3×3的矩阵
iterations – 膨胀次数,默认为1
wenzi = cv2.imread('zimu.png')
cv2.imshow('src1',wenzi)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
wenzi_new = cv2.dilate(wenzi,kernel,iterations=3)
cv2.imshow('wenzi_new',wenzi_new)
cv2.waitKey(0)
开运算
开运算:先腐蚀后膨胀。
zhiwen = cv2.imread('zhiwen1.png')
cv2.imshow('scr2',zhiwen)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)
闭运算
闭运算:先膨胀后腐蚀
zhiwen = cv2.imread('zhiwen2.png')
cv2.imshow('scr3',zhiwen)
cv2.waitKey(0)
kernel = np.ones((4,4),np.uint8)
zhiwen_new = cv2.morphologyEx(zhiwen,cv2.MORPH_CLOSE,kernel)
cv2.imshow('zhiwen_new',zhiwen_new)
cv2.waitKey(0)cv2.destroyAllWindows()
顶帽和黑帽
顶帽 = 原始图像 - 开运算结果(先腐蚀后膨胀)
黑帽 = 闭运算(先膨胀后腐蚀) - 原始图像
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8) #设置kenenel大小
#开运算
open_sun=cv2.morphologyEx(sun,cv2.MORPH_OPEN,kernel)
cv2.imshow('open_sun',open_sun)
cv2.waitKey(0)
#顶帽
tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('TOPHAT',tophat)
cv2.waitKey(0)
#闭运算
close_sun=cv2.morphologyEx(sun,cv2.MORPH_CLOSE,kernel)
cv2.imshow('close_sun',close_sun)
cv2.waitKey(0)
#黑帽
blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('BLACKHAT',blackhat)
cv2.waitKey(0)
相关文章:
《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)及形态学处理
文章目录 《OpenCV计算机视觉》-对图片的各种操作(均值、方框、高斯、中值滤波处理)边界填充阈值处理图像平滑处理生成椒盐图片均值滤波处理方框滤波处理高斯滤波处理中值滤波处理 图像形态学腐蚀膨胀开运算闭运算顶帽和黑帽 《OpenCV计算机视觉》-对图片…...
如何让Tplink路由器自身的IP网段 与交换机和电脑的IP网段 保持一致?
问题分析: 正常情况下,我的需求是:电脑又能上网,又需要与路由器处于同一局域网下(串流Pico4 VR眼镜),所以,我是这么连接 交换机、路由器、电脑 的: 此时,登录…...
【JetPack】Navigation知识点总结
Navigation的主要元素: 1、Navigation Graph: 一种新的XML资源文件,包含应用程序所有的页面,以及页面间的关系。 <?xml version"1.0" encoding"utf-8"?> <navigation xmlns:android"http://schemas.a…...
InnoDB引擎的内存结构
InnoDB擅长处理事务,具有自动崩溃恢复的特性 架构图: 由4部分组成: 1.Buffer Pool:缓冲池,缓存表数据和索引数据,减少磁盘I/O操作,提升效率 2.change Buffer:写缓冲区,…...
Y3地图制作1:水果缤纷乐、密室逃脱
文章目录 一、水果缤纷乐1.1 游戏设计1.1.1 项目解析1.1.2 项目优化1.1.3 功能拆分 1.2 场景制作1.2.1 场景需求1.2.2 创建主镜头、绘制草稿,构思文案和情景1.2.3 构建场景地图1.2.4 光源与氛围设置 1.3 游戏初始化1.3.1 物编、UI预设置1.3.2 游戏初始化1.3.2 玩家初…...
ESP32_H2(IDF)学习系列-ADC模数转换(连续转换)
一、简介(节选手册) 1 概述 ESP32-H2 搭载了以下模拟外设: • 一个 12 位逐次逼近型模拟数字转换器 (SAR ADC),用于测量最多来自 5 个管脚上的模拟信号。 • 一个温度传感器,用于测量及监测芯片内部温度。 2 SAR ADC 2…...
如何通过TikTok成功引流到独立站
随着短视频平台的迅猛发展,TikTok已成为全球最受欢迎的社交媒体之一,尤其是在年轻用户群体中更是势不可挡。如果你是一个独立站(如电商网站、博客、个人品牌站等)的运营者,那么如何通过TikTok引流到独立站已经成为一个…...
生成签名文件 .keystore
打开java sdk 到bin目录(D:\JDK\Java\jdk1.8.0_202\bin),打开dos窗口执行以下命令: 命令行输入: 1、生成签名文件:(-alias 别名 validity 有效期 9125 天) keytool -genkeypair -v…...
Mono里运行C#脚本3—mono_jit_init
前面已经介绍了配置参数的读取,这样就可以把一些特殊的配置读取进来,完成了用户配置阶段的参数,接着下来就需要进行大工程的建造了。 为什么这样说呢,因为需要解释并执行C#编译的受托管的代码,相当于就是建立一个C#代码运行的虚拟机,而这个虚拟机还是很复杂的,不但要支…...
龙迅#LT6911C适用于HDMI转MIPI/LVDS产品应用,分辨率高达4K30HZ,内置程序,支持KEY(HDCP)!
1. 描述 LT6911C 是一款高性能 HDMI1.4/DP 转 MIPIDSI/CSI/LVDS 芯片,适用于 VR/智能手机/显示应用。 对于 MIPIDSI/CSI 输出,LT6911C具有可配置的单端口或双端口 MIPIDSI/CSI,具有 1 个高速时钟通道和 1~4 个高速数据通道,运行…...
阿里云虚拟主机ecs镜像如何转移到本地virtualbox上
导出阿里云 ECS 镜像 创建快照:登录阿里云 ECS 控制台,找到对应的 ECS 实例,创建一个快照,等待快照创建完成。创建自定义镜像:基于创建好的快照,创建一个自定义镜像,填写镜像名称和描述等信息。导出镜像:镜像创建完成后,点击 “导出镜像”,并授权访问,将镜像导出到阿…...
虚拟机桥接模式
主机Win10,虚拟机xp 1.虚拟机设置中选择桥接模式 2.在虚拟机菜单:编辑>虚拟机网络编辑,点击“更改设置”,可以看到三个网卡,这三个网卡分别对应不同的网络共享模式。桥接模式须使用VMnet0,如果没看到这个网卡&…...
酷睿i7和i5哪个好?i5和i7的区别介绍
在英特尔酷睿处理器家族中,i7与i5作为面向不同用户群体的主流产品,各自承载着不同的性能定位与使用价值。在面对“酷睿i7和i5哪个好”的问题时,答案并非一概而论,而是取决于具体的应用需求、预算考量以及对性能与效率的期待。本文…...
STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC
首先可以通过 winr->输入cmd->输入ipconfig 命令可以查看计算机的各种地址 IPV4:是互联网协议第 4 版(Internet Protocol version 4)所使用的地址。它是一个 32 位的二进制数字,通常被分为 4 个 8 位的部分ÿ…...
Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…...
消息队列(二)消息队列的高可用原理
高可用的定义 上一篇文章提过,引入了消息队列的优势在于解耦、并发和缓冲,代价就是让程序的复杂性上升,引入了消息队列后,就需要考虑消息队列对于系统整体的影响,此时消息队列的稳定和健壮就是重中之重。也就是消息队…...
大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库
大模型-使用OllamaDify在本地搭建一个专属于自己的知识库 1、本地安装Dify2、本地安装Ollama并解决跨越问题3、使用Dify搭建聊天助手4、使用Dify搭建本地知识库 1、本地安装Dify 参考往期博客:https://guoqingru.blog.csdn.net/article/details/144683767 2、本地…...
深入理解索引的最左匹配原则:底层逻辑解析
1. 什么是最左匹配原则? 最左匹配原则是指在使用复合索引时,查询条件从左到右依次匹配索引列的顺序,一旦中间有列未匹配,索引将停止工作或部分失效。 1.1 举例说明 假设我们有一张用户表(users)…...
微服务——数据管理与一致性
1、在微服务架构中,每个微服务都有自己的数据库,这种设计有什么优点和挑战? 优点挑战服务自治:每个微服务可独立选择适合自己的数据库类型。数据一致性:跨微服务的事务难以保证强一致性。故障隔离:一个微服…...
Docker之技术架构【八大架构演进之路】
Docker之技术架构 1. 八大架构演进之路1.1 单机架构1.2 应用数据分离架构1.3 应用服务集群架构1.4 读写分离架构1.5 冷热分离架构1.6 垂直分库架构1.7 微服务架构1.8 容器编排架构(docker出现) 2. 一个互联网实战架构 本章意在让大家了解Docker出现的历史…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
第2篇:BLE 广播与扫描机制详解
本文是《BLE 协议从入门到专家》专栏第二篇,专注于解析 BLE 广播(Advertising)与扫描(Scanning)机制。我们将从协议层结构、广播包格式、设备发现流程、控制器行为、开发者 API、广播冲突与多设备调度等方面,全面拆解这一 BLE 最基础也是最关键的通信机制。 一、什么是 B…...
