若楠带你初识OpenCV(3)--图像平滑处理和图像形态学

news2024/9/20 6:07:26

文章目录

  • OpenCV
  • 图像平滑处理
    • 1. 添加噪声
    • 2. 均值滤波
    • 3. 方框滤波
    • 4. 高斯滤波
    • 5. 中值滤波
  • 图像形态学
    • 1. 腐蚀
    • 2. 膨胀
    • 3. 开运算
    • 4. 闭运算
    • 5. 梯度运算
    • 6. 顶帽和黑帽
      • 顶帽
      • 黑帽
  • 总结

OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。

本篇所用图片数据:

链接:https://pan.baidu.com/s/1-C6sxtw-S3vL1I5SwaStlQ?pwd=dzvx

提取码:dzvx

图像平滑处理

1. 添加噪声

添加噪声与给图片打码有相似之处,即在一张图片随机改变几个点的像素值:

#自添加噪声
def add_noise(image,n = 1000):
    result = image.copy()
    w,h = image.shape[:2] #高 宽  高轴为y轴,宽轴为x轴
    for i in range(n):
        x = np.random.randint(1,h) #随机定位图片范围内的坐标点
        y = np.random.randint(1,w)
        #在0,1中随机抽一个数判断,要么白点要么黑点
        if np.random.randint(0,2) == 0:
            result[x,y] = 0
        else:
            result[x,y] = 255
    return result


a = cv2.imread('yifei.jpg')
image = cv2.resize(a,(400,400))
cv2.imshow('ori',image)
cv2.waitKey(0)

noise = add_noise(image)
cv2.imshow('noise',noise)
cv2.waitKey(0)

在这里插入图片描述

2. 均值滤波

在卷积核范围内,求像素点平均值,替换中心点的像素值值:

在这里插入图片描述

比如在上图中,一个3*3的卷积核,计算平均值替换中心点的值。

blur_1 = cv2.blur(noise,(3,3)) #(3,3):卷积核范围,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)
cv2.destroyAllWindows()

在这里插入图片描述

我们可以发现,均值滤波对噪声点的处理不明显,效果较差。

3. 方框滤波

方框滤波:是指用当前像素点周围nxn个像素值的和来代替当前像素值。

参数:

 方框滤波
 boxFilter()中有参数:
 ddepth:表示深度,-1表示与原始图像深度相同
 normalize:表示图像是否要进行归一化。
     1True:归一化,用邻域像素值的和除以面积,此时与均值滤波效果相同
     2False:不归一化,直接使用邻域像素值的和,和>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)

在这里插入图片描述

方框滤波的效果也不太行哦~,效果不是很理想。

4. 高斯滤波

高斯滤波(Mean filtering):对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。

在这里插入图片描述

#高斯滤波
GaussianB = cv2.GaussianBlur(noise,(3,3),1)
cv2.imshow('GaussianB',GaussianB)
cv2.waitKey(0)

在这里插入图片描述

效果不太行,有明显的像素点未处理,且图片模糊。

5. 中值滤波

中值滤波:会取当前像素点及其周围临近像素点(一共有奇数个像素点)的像素值,将这些像素值从小到大排序,然后将位于中间位置的像素值作为当前像素点的像素值。比如:

[0,48,56,95,128,130,212,215,250]选择的就是128。

#中值滤波
medianB = cv2.medianBlur(noise,5)
cv2.imshow('medianB',medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

我们看到,图片效果处理非常好呀!!噪声点基本都处理掉了。

图像形态学

什么是形态学:图像形态学是一种处理图像形状特征的图像处理技术,主要用于描述和处理图像中的形状和结构。形态学可以用于提取图像中的特征、消除噪声、改变图像的形状等。

1. 腐蚀

图像形态学中的腐蚀是一种基本的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而减小图像中物体的大小或去除物体的边界点。

# 1.腐蚀:cv2.erode()
sun = cv2.imread('sun.png')
cv2.imshow('sunn',sun)
cv2.waitKey(0)

# kernel:用于腐蚀的结构原件,设置大小
# iterations:图像腐蚀的次数
kernel = np.ones((3,3),np.uint8)
erosion_1 = cv2.erode(sun,kernel,iterations=1)
cv2.imshow('fushi',erosion_1)
cv2.waitKey(0)

腐蚀的次数越多,图片边界点被腐蚀的越严重。

在这里插入图片描述

图中可以明显的看到:太阳发散的线条被去除掉了,这就是腐蚀的效果。

2. 膨胀

图像形态学中的膨胀是一种重要的图像处理技术,它基于数学形态学原理,通过特定的结构元素对图像进行卷积操作,从而扩大图像中物体的大小或增加物体的边界点。

# 2.膨胀:cv2.dilate()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wz_ori',wenzi)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
wenzi_new = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow("pengzhang",wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

我们可以明显的看到,文字都膨胀加粗了,膨胀的效果比较明显。

3. 开运算

开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
# 开运算:先腐蚀后膨胀 -- cv2.MORPH_OPEN()
noise_zhiwen = cv2.imread('noise_zhiwen.png')
cv2.imshow('noise',noise_zhiwen)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
k_zhiwen = cv2.morphologyEx(noise_zhiwen,cv2.MORPH_OPEN,kernel)
cv2.imshow('new_zhiwen',k_zhiwen)
cv2.waitKey(0)

在这里插入图片描述

对比两张图,可以发现图片先经过了腐蚀去除了噪声点,然后膨胀。

4. 闭运算

闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
#闭运算:先膨胀后腐蚀 -- cv2.MORPH_CLOSE()
zhiwen = cv2.imread('zhiwen.png')
cv2.imshow('zhiwen',zhiwen)
cv2.waitKey(0)

kernel = np.ones((5,5),np.uint8)
b_zhiwen = cv2.morphologyEx(zhiwen,cv2.MORPH_CLOSE,kernel)
cv2.imshow('b_zhiwen',b_zhiwen)
cv2.waitKey(0)

在这里插入图片描述

通过图片我们看见,闭运算后的指纹,断开出都连接在了一起。

5. 梯度运算

图像形态学中的梯度运算在边缘检测、轮廓提取、特征增强以及作为预处理步骤等方面发挥着重要作用。它不仅能够提高图像处理的效率和准确性,还能够为后续的图像分析和目标识别等任务提供有力的支持。

梯度运算:图像膨胀后减去图像腐蚀的结果 -- cv2.MORPH_GRADIENT()
wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi',wenzi)
cv2.waitKey(0)

kernel = np.ones((3,3),np.uint8)
#膨胀
pz_wenzi = cv2.dilate(wenzi,kernel,iterations=2)
cv2.imshow('pz_wenzi',pz_wenzi)
cv2.waitKey(0)

#腐蚀
fs_wenzi = cv2.dilate(wenzi,kernel,iterations=1)
cv2.imshow('fs_wenzi',fs_wenzi)
cv2.waitKey(0)

#膨胀 - 腐蚀
bianyuan = cv2.morphologyEx(wenzi,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('bianyuan',bianyuan)
cv2.waitKey(0)

在这里插入图片描述

从最后结果可以发现,梯度运算将膨胀的结果减去腐蚀的结果,可以得到文字的外轮廓,对于边缘检测、轮廓提取有明显作用。

6. 顶帽和黑帽

顶帽

顶帽操作是原始图像与开运算结果之间的差值。开运算是先进行腐蚀操作,再进行膨胀操作的过程。由于腐蚀操作会缩小图像中的高亮区域,而膨胀操作会恢复部分但不一定全部的高亮区域,因此开运算的结果往往比原始图像更平滑,去除了部分小细节。顶帽操作通过计算原始图像与开运算结果之间的差异,将这些被去除的小细节重新显现出来。

图像形态学中的顶帽操作在提取图像中的小细节、增强图像对比度、背景提取与分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,顶帽操作可以在多种图像处理任务中发挥重要作用。

顶帽:原始图像 - 开运算结果(先腐蚀后膨胀) -- cv2.MORPH_TOPHAT()
sun = cv2.imread('sun.png')
cv2.imshow('sun_yuantu',sun)
cv2.waitKey(0)

# 设置kernel大小
kernel = np.ones((2,2),np.uint8)

# 顶帽:原始图像 - 开运算结果(先腐蚀后膨胀)
# cv2.MORPH_TOPHAT()

tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophot',tophat)
cv2.waitKey(0)

在这里插入图片描述

黑帽

黑帽操作是闭运算结果与原始图像之间的差值。闭运算是先进行膨胀操作,再进行腐蚀操作的过程。由于膨胀操作会扩大图像中的高亮区域,而腐蚀操作会缩小这些区域,但不一定能完全恢复到原始状态,因此闭运算的结果往往比原始图像更平滑,填充了部分暗部细节。黑帽操作通过计算闭运算结果与原始图像之间的差异,将这些被填充的暗部细节重新显现出来。

图像形态学中的黑帽操作在突出图像中的暗部细节、增强图像对比度、背景与前景的分离等方面具有显著作用。通过合理选择和调整参数以及与其他技术的结合使用,黑帽操作可以在多种图像处理任务中发挥重要作用。

黑帽:闭运算(先膨胀后腐蚀) - 原始图像 -- cv2.MORPH_BLACKHAT
# 黑帽:闭运算(先膨胀后腐蚀) - 原始图像
# cv2.MORPH_BLACKHAT

blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)

在这里插入图片描述

总结

本篇介绍了:

  1. 图像的平滑处理:包含均值滤波、方框滤波、高斯滤波以及中值滤波。
  2. 图像形态学:腐蚀、膨胀、开闭运算、梯度运算以及顶帽和黑帽

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106885.html

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

相关文章

佰朔资本:北交所,突现惊人一幕!

进入9月份以来,北交一切7只股票产生了大宗生意。大宗生意并不乖僻,让人吃惊的是这些股票的生意折价起伏很大。北交所的蓝筹股贝特瑞折价逾越30%,连城数控亦逾越26%,并且这些股票较其高位本就现已跌幅巨大。 那么,终究…

新型PyPI攻击技术可能导致超2.2万软件包被劫持

一种针对 Python 软件包索引(PyPI)注册表的新型供应链攻击技术已在野外被利用,并且目前正试图渗透到下游组织中。 软件供应链安全公司 JFrog 将其代号定为Revival Hijack,并称这种攻击方法可用于劫持 2.2万个现有 PyPI 软件包&am…

JavaScript - Api学习 Day03 (日期对象、节点操作、两种定时器、本地存储)

文章目录 一、日期对象1.1 实例化1.2 日期对象方法 二、节点操作2.1 父子兄弟节点1. 父节点查找2. 子节点查找3. 兄弟关系查找 2.2 增删节点1. 创建节点 - createElement2. 添加节点2.1 appendChild() 方法2.2 insertBefore() 方法2.3. 克隆节点 - cloneNode 3. 删除节点3.1 re…

开放式运动耳机评测怎么样?真人实测总结分享

其实对于很多人来说,为了保持身体的健康,还是蛮喜欢适当运动的。不过,跑步有时候还是有点枯燥的,所以能提升运动兴趣的装备必须提前安排。除了舒服的衣服,耳机也是必不可少的,跟着节奏踩点跑步也很容易分泌…

【数据库】MySQL-基础篇-SQL

专栏文章索引:数据库 有问题可私聊:QQ:3375119339 目录 一、SQL通用语法 二、SQL分类 三、DDL 1.数据库操作 1.1 查询所有数据库 1.2 查询当前数据库 1.3 创建数据库 1)案例: 1.4 删除数据库 1.5 切换数据库…

Hadoop运行jps没有datanode节点【已解决】

1 原因: 格式化NameNode后,如果DataNode的clusterID与新的NameNode的clusterID不匹配,DataNode将无法加入集群,导致HDFS无法正常提供服务。 2 解决方式: 将新的NameNode的clusterID与DataNode的clusterID保持一致 &…

C#使用MQTT(二):MQTT客户端

上一篇我们初步设计了MQTT服务端 C#使用MQTT(一):MQTT服务端-CSDN博客 这里我们设计客户端MQTT Client,接上一篇 新建Windows窗体FormMqttClient 窗体FormMqttClient设计如图: 窗体FormMqttClient设计器相关代码如下 文件FormMqttClient.Designer.cs namespace…

【软件测试】软件测试-----什么是Bug?Bug是如何分级的?Bug的生命周期是怎样的?如何描述一个Bug?

博客目录 一.软件测试的生命周期二.BUG的定义和级别2.1 bug的概念.2.2 如何描述一个bug.2.3bug的级别2.3.1 bug分级的意义.2.3.2 bug的四种级别. 三.BUG的生命周期.四.当与开发人员发生冲突该如何处理(高频面试)五.总结 一.软件测试的生命周期 软件测试贯穿于软件的整个生命周…

Day-02-QPushButton设置信号与槽一在UI界面直接设置槽函数

1.点击UI界面 2.选择Push Button按键 3.右键选择转到槽 4.根据自己的需要选择信号事件 5.在自动生成的函数内编写自己需要完成的动作

【网络安全】服务基础第一阶段——第十一节:Windows系统管理基础----PKI技术与应用

目录​​​​​​​ 一、加密技术 1.1 基本保密通信模型 1.2 密码学发展 1.2.1 古典密码学(1949年前) 1.2.2 近代密码学(1949~1975年) 1.2.3 现代密码学(1976年以后) 1.3 古典密码 1.3.…

基因组学中的深度学习

----/ START /---- 基因组学其实是一门将数据驱动作为主要研究手段的学科,机器学习方法和统计学方法在基因组学中的应用一直都比较广泛。 不过现在多组学数据进一步激增——这个从目前逐渐增多的各类大规模人群基因组项目上可以看出来,这其实带来了新的挑…

数字签名,数字证书,时间戳

简介 数字签名、数字证书和时间戳是现代网络安全技术中的重要组成部分,它们共同确保了数据传输的安全性和完整性。 数字签名 数字签名是一种基于公钥加密技术的电子签名方式。它通过使用发送方的私钥对消息进行加密生成一个特定的签名值,并将该签名值与…

四川财谷通抖音小店新宠儿,科技生活一键购!

在数字经济蓬勃发展的今天,电商平台如雨后春笋般涌现,其中抖音小店凭借其庞大的用户基础、精准的算法推荐以及创新的营销模式,成为了众多商家竞相入驻的热门选择。而四川财谷通信息技术有限公司,作为这一领域内的佼佼者&#xff0…

煤矿广播通信系统

在煤矿这样的特殊工作环境中,煤矿广播通信系统发挥着至关重要的作用。它就如同煤矿中的“传音使者”,保障着各项工作的顺利进行和人员的安全。 系统功能 煤矿广播通信系统具备多种强大的功能。首先,它拥有实时广播功能,能够及时传…

应用商店优化(ASO)的四大误区

应用商店优化 (ASO) 是移动营销中最重要的部分之一,可以帮助开发人员吸引自然流量并在应用推广方面取得预期效果。近年来ASO优化在开发者中越来越受欢迎。虽然它已经证明了其有效性和对应用成功的影响力,但尽管如此仍然存在与ASO相关的误解,导…

Rust 赋能前端:PDF 分页/关键词标注/转图片/抽取文本/抽取图片/翻转...

❝ 我从不幻想成功。我只会为了成功努力实践 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder ❝ 此篇文章所涉及到的技术有 WebAssembly Mupdf Pdf操作( 分页展示/文本抽离/文本标注/获取超链接/Pdf转图片/翻转/截取) 因为,行文…

Chrome 浏览器插件获取网页 window 对象(方案一)

前言 最近有个需求,是在浏览器插件中获取 window 对象下的某个数据,当时觉得很简单,和 document 一样,直接通过嵌入 content_scripts 直接获取,然后使用 sendMessage 发送数据到插件就行了,结果发现不是这…

【unplugin-vue-router】超级实用的自动路由,具体使用教程!

一、安装 vite 创建vue项目的时候选择 auto import 【推荐】 二、使用 原理:参考 vite 官网 来看一个简单的例子: 这是项目的pages目录结构 src/pages/ ├── index.vue ├── about.vue └── users/├── index.vue└── [id].vueunplugin-…

C语言08--指针数组结合

前言: 这次的指针数组结合乃作者呕心沥血之作,大家翻翻进度条就知道了,内容十分干货,各位读者若能全部耐心解析读懂了,想必也能理解掌握C语言中的数组指针这两把利剑了。 指针数组结合: 指针数组 概念&a…

异步编程学习

UniTask UniTask 访问UniTask的GitHub的主页可以直接下载unity Package进行导入,或者通过 Package Manager导入,导入完成之后根据文档加一下 宏定义“UNITASK_DOTWEEN_SUPPORT” 这样就可以正常的控制DoTween了 2.UniTask 的简单使用 // UniTask 是可以作…