OpenCV基础(2)

目录

滤波处理

均值滤波

基本原理

函数用法

程序示例

高斯滤波 

基本原理

函数用法

程序示例

中值滤波

基本原理

函数用法

程序示例

形态学

腐蚀

膨胀

通用形态学函数


前言:本部分是上一篇文章的延续,前面部分请查看:OpenCV基础(1)

滤波处理

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声的过程称为对图像的平滑处理(又称滤波处理),所得图像称为平滑图像。
一般来说,图像平滑处理是指在一幅图像中若一个像素点与周围像素点的像素值差异较大,则将其值调整为周围邻近像素点像素值的近似值(如均值等),因此图像平滑处理通常也伴随图像模糊操作。由于近似值的取值方式不同,滤波也分为多种方式,这里对3种常用的滤波进行说明。

均值滤波

均值滤波是指用当前像素点周围 N×N 个像素值的均值代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。

基本原理

如果我现在想要对5行4列的像素点进行滤波。首先要考虑需要对周围多少个像素点取平均值。通常情况下,会以当前像素点为中心,求行数和列数相等的一块区域内的所有像素点的像素值的平均值。以上图中第 5 行第 4 列的像素点为中心,可以对其周围 3× 3 区域内所有像素点的像素值求平均值,也可以对其周围 5× 5 区域内所有像素点的像素值求平均值。我们对其周围 5× 5 区域内的像素点的像素值求平均,计算方法为

其实这也相当于将该像素点的 5× 5 邻域像素值与一个内部值都是 1/25 的 5× 5 矩阵相乘,得到均值滤波的结果 126。

这里可以把这个矩阵简化为以下形式

而简化后的矩阵也被叫做卷积核,一般形式为

其中,M和N是矩阵的高和宽,比较常用的有 3× 3、5× 5、7× 7 等。M N 的值越大,参与运算的像素点越多,当前像素点的计算结果受到越多的周围像素点影响。

函数用法

均值滤波的函数是 cv2.blur(),其语法格式为
dst = cv2.blur( src, ksize, anchor, borderType )

其中:

  • dst 是返回值,表示进行均值滤波后得到的处理结果。
  • src 是需要处理的图像,即原始图像。
  • ksize 是滤波核的大小。(就是卷积核)
  • anchor 是锚点,默认值是(-1,-1),表示当前计算均值的像素点位于滤波核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
  • borderType 是边界样式,该值决定了以何种方式处理边界。OpenCV 提供了多种填充边界的方式,如用边缘值填充、用 0 填充、用 255 填充、用特定值填充等。

一般来说,anchor 和borderType 都不需要修改,因此只需要传入3个参数即可。

程序示例

import cv2
o=cv2.imread("Colnoiselena.jpg")
r3=cv2.blur(o,(3,3))
r11=cv2.blur(o,(7,7))
cv2.imshow("original",o)
cv2.imshow("result3",r3)
cv2.imshow("result7",r11)
cv2.waitKey()
cv2.destroyAllWindows()

上图中白色的点即为噪声,使用3× 3的卷积核时噪声明显有所改善,图像失真不太严重;使用7× 7 的卷积核时图像噪声大幅减少,但是图像失真很严重。

补充:失真表示与原图像的偏差,这里也就是模糊度。

卷积核越大,参与均值运算的像素点越多,即当前像素点计算的是周围更多点的像素点的像素值的均值。因此,卷积核越大,去噪效果越好,花费的计算时间越长,图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。

高斯滤波 

在高斯滤波中,会将邻近中心像素点的权重值加大,远离中心像素点的权重值减小,在此基础上计算邻域内各像素值不同权重的和。

基本原理

高斯滤波中,卷积核的值不再相等,但卷积核的大小一定要是奇数。不同大小的卷积核如下图示:

计算方式如下:

函数用法

高斯滤波的函数是 cv2.GaussianBlur(),该函数的语法格式是

dst = cv2.GaussianBlur( src, ksize, sigmaX, sigmaY, borderType )

其中:

  • dst 是返回值,表示滤波后的图像。
  • src 是需要处理的图像,即原始图像。
  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中邻域图像的高度和宽度。滤波核的大小必须是奇数。
  • sigmaX 是卷积核在水平方向(X 轴方向)上的标准差,其控制的是权重比。
  • sigmaY是卷积核在垂直方向(Y轴方向)上的标准差。若将该值设置为0,则只采用sigmaX 的值;如果 sigmaX 和 sigmaY 都是 0,则通过 ksize.width 和 ksize.height 计算得到。其中:
  • borderType 是边界样式,该值决定了以何种方式处理边界。一般情况下,该值采用默认值即可。

补充:这里可能会有不理解标准差和权重比的,我简单说一下:标准差就是方差开根,表示数据的离散程度,换句话说就是标准差越大,表示所有数据离均值越远,越小离均值越近。而权重比就是卷积核内的数求和取倒数。

在这里,sigmaY 和 borderType 是可选参数。sigmaX 是必选参数,但是可以将该参数设置为 0,让函数自己去计算 sigmaX 的具体值。所以至少需要传入3个参数

一般来说当卷积核确定时,sigma 越大图像的去噪效果越好,但相应的图像也变得更为模糊,反之亦是如此。为了简便,我们一般不会手动去设置这个值,由函数自己计算,因此函数的一般形式为

dst = cv2.GaussianBlur( src, ksize, 0, 0 )

程序示例

import cv2
o=cv2.imread(r"Colnoiselena.jpg")
r1=cv2.GaussianBlur(o,(5,5),0,0)
r2=cv2.GaussianBlur(o,(5,5),0.1,0.1)
r3=cv2.GaussianBlur(o,(5,5),1,1)
cv2.imshow("original",o)
cv2.imshow("result1",r1)
cv2.imshow("result2",r2)
cv2.imshow("result3",r3)
cv2.waitKey()
cv2.destroyAllWindows()

可以明显看出,使用相同的卷积核时函数自己计算和标准差为1得到的去噪效果相差不大,但是由于标准差较大表现出模糊的现象。所以有时我们手动设置值得到的效果图不一定比默认的好啊。

中值滤波

中值滤波采用邻域内所有像素值的中间值来替代当前像素点的像素值。

基本原理

中值滤波会取当前像素点及其周围邻近像素点的像素值,先将这些像素值排序,然后将位于中间位置的像素值作为当前像素点的像素值。
对图中4行4列的像素点进行滤波,将其邻域设置为 3× 3 大小,对 3× 3 邻域内像素点的像素值进行排序,按升序排序后得到序列值为[66,78,90,91,93,94,95,97,101]。在该序列中,处于中心位置的值是“93”,用该值作为新像素值替换原来的像素值 78。

函数用法

中值滤波的函数是 cv2.medianBlur(),语法格式如下:
dst = cv2.medianBlur( src, ksize)

其中:

  • dst 是返回值,表示进行中值滤波后得到的处理结果。
  • src 是需要处理的图像,即原始图像。
  • ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中邻域图像的高度和宽度。滤波核的大小必须是比 1 大的奇数,如 3、5、7 等。
注意: 均值和高斯滤波中卷积核都是元组,而中值滤波是一个奇数值。

程序示例

import cv2
o=cv2.imread("Colnoiselena.jpg")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

可以看出,中值滤波不存在其他滤波方式带来的细节模糊问题。中值滤波处理使用邻域像素点中间的像素值作为当前像素点的像素值。一般情况下噪声的像素值是一个特殊值,因此噪声成分很难被选作替代当前像素点的像素值,从而实现在不影响原有图像的情况下去除全部噪声。但是由于需要进行排序等操作,中值滤波的运算量较大

形态学

形态学主要从图像内提取分量信息,该分量信息通常是图像理解时所使用的最本质的形状特征。

腐蚀

腐蚀能够消除图像的边界点,使图像沿着边界向内收缩,也可以去除小于指定结构元的部分。
在腐蚀过程中,通常使用一个结构元逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀图像的关系来确定腐蚀结果。同时,该操作是逐个像素点地来决定像素值的,每次判定的像素点都是腐蚀结果图像中与结构元中心点所对应的像素点。

图中,黑色方块是结构元(又称核),白色圆形是前景

  • 如果结构元完全处于前景对象中,就将结构元中心点对应的腐蚀结果图像中的像素点处理为前景色(白色,像素点的像素值为 1)。
  • 如果结构元未完全处于前景对象中(可能部分在,也可能完全不在),就将结构元中心点对应的腐蚀结果图像中的像素点处理为背景色(黑色,像素点的 像素值为 0)。

最后得到的图像就会向内部收缩。下面我们用一个具体的示例进行说明。

图中

  • (a)表示待腐蚀图像 img。
  • (b)是核 kernel。
  • (c)中的阴影部分是核 kernel 在遍历 img 时,完全位于前景对象内部时的 3 个全部可能位置。也就是说,当核 kernel 处于任何其他位置时都不能完全位于前景对象中。
  • (d)是腐蚀结果 rst,即在核 kernel 完全位于前景对象中时,将其中心点对应的rst 中像素点的像素值置为 1;当核 kernel 不完全位于前景对象中时,将其中心点对应的rst 中像素点的像素值置为 0。
函数 cv2.erode()实现腐蚀操作,其语法格式为
dst = cv2.erode( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )

其中:

  • dst 是腐蚀后输出的目标图像,该图像和原始图像的类型和大小相同。
  • src 是需要进行腐蚀的原始图像。
  • kernel 代表腐蚀操作时采用的结构类型,一般会输入一个元组。
  • anchor 代表结构元中锚点的位置。该值默认为(-1,-1),在核的中心位置。
  • iterations 是腐蚀操作迭代的次数,该值默认为 1,即只进行一次腐蚀操作。
import cv2
import numpy as np
o=cv2.imread("1.png")
kernel1 = np.ones((3,3),np.uint8)
erosion1 = cv2.erode(o,kernel1)
kernel2 = np.ones((5,5),np.uint8)
erosion2 = cv2.erode(o,kernel2, iterations=5)
cv2.imshow("orriginal",o)
cv2.imshow("erosion1",erosion1)
cv2.imshow("erosion2",erosion2)
cv2.waitKey()
cv2.destroyAllWindows()

可以看出,腐蚀操作具有腐蚀去噪功能,核越大腐蚀效果越明显。

膨胀

膨胀操作和腐蚀操作的作用是相反的,膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。如果图像内两个对象的距离较近,那么经膨胀操作后,两个对象可能会连通在一起。膨胀操作有利于填补图像分割后图像内的空白处。

  • 如果结构元中任意一点处于前景对象中,就将膨胀结果图像中对应像素点处理为前景色。
  • 如果结构元完全处于背景对象外,就将膨胀结果图像中对应像素点处理为背景色。
膨胀结果就是前景对象的白色圆直径变大。同样,下面用一个示例进行说明。

图中:

  • (a)表示待膨胀图像 img。
  • (b)是核 kernel。
  • (c)中的阴影部分是核 kernel 在遍历 img 时,核 kernel 中心像素点位于 img[1,1]、 img[3,3]时与前景对象存在重合像素点的两种可能情况。
  • (d)是膨胀结果图像 rst。在核 kernel 内,当任意一个像素点与前景对象重合时,其中心点对应的膨胀结果图像内的像素点的像素值为 1;当核 kernel 与前景对象完全无重合时,其中心点对应的膨胀结果图像内的像素点值为 0。
函数 cv2.dilate()实现对图像的膨胀操作,该函数的语法结构为
dst = cv2.dilate( src, kernel[, anchor[, iterations[, borderType[, borderValue]]]])
其中:
  • dst 代表膨胀后输出的目标图像,该图像和原始图像类型和大小相同。
  • src 代表需要进行膨胀操作的原始图像。
  • kernel 代表膨胀操作采用的结构类型,一般是元组。
  • anchor 代表结构元中锚点的位置。该值默认为(-1,-1),在核的中心位置。
  • iterations 是膨胀操作迭代的次数,该值默认为 1,即只进行一次膨胀操作。
import cv2
import numpy as np
o=cv2.imread("erode2.jpg")
kernel = np.ones((5,5),np.uint8)
dilation1 = cv2.dilate(o,kernel)
dilation2 = cv2.dilate(o,kernel,iterations = 9)
cv2.imshow("original",o)
cv2.imshow("dilation1",dilation1)
cv2.imshow("dilation2",dilation2)
cv2.waitKey()
cv2.destroyAllWindows()

通用形态学函数

腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀操作和膨胀操作进行组合,就可以实现开运算、闭运算、形态学梯度运算、顶帽运算(礼帽运算)、黑帽运算、击中击不中等多种不同形式的运算。
函数 cv2.morphologyEx()来实现上述形态学运算,其语法结构如下:
dst = cv2.morphologyEx( src, op, kernel[, anchor[, iterations[, borderType[, borderValue]]]] )
其中:
  • dst 代表经过形态学处理后输出的目标图像,该图像和原始图像的类型和大小相同。
  • src 代表待进行形态学操作的原始图像。
  • op 代表操作类型。各种形态学运算的操作规则均是将腐蚀操作和膨胀操作进行组合得到的。

形态学运算的主要含义及作用如下:
  • 开运算操作先将图像腐蚀,再对腐蚀的结果进行膨胀,可以用于去噪、计数等。
  • 闭运算是先膨胀、后腐蚀的操作,有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景对象进行连接。
  • 形态学梯度运算是用原始图像的膨胀图像减腐蚀图像的操作,该操作可以获取原始图像中前景对象的边缘。
  • 顶帽运算是用原始图像减去其开运算图像的操作。该操作能够获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。
  • 黑帽运算是用闭运算图像减去原始图像的操作。该运算能够获取图像内部的小孔,或前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。

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

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

相关文章

计算机网络之以太网

上文内容:总线局域网以及冲突的解决方法 1.以太网的起源 1.1起源 60年代末期,夏威夷大学Norman Abramson等研制ALOHA无线网络系统,实现Oahu岛上的主机和其它岛及船上的读卡机和终端通信; 出境信道地址:主机到终端&#xff1…

空间数据获取与预处理指南:生产与科研应用

1.空间数据简介 2.免费的国外GIS数据下载方法 3.免费的国内GIS数据下载方法 4.遥感云平台数据的获取方法 5.专题数据的获取及预处理示例 (1)行政区划数据 (2)气象数据 (3)土壤数据 (4)遥感产品数据 (5)统计数据 (6)…… 原文链接https://mp.weixin.qq.com/s?__bizMz…

Mean teacher are better role models-论文笔记

论文笔记 资料 1.代码地址 2.论文地址 https://arxiv.org/pdf/1703.01780 3.数据集地址 CIFAR-10 https://www.cs.utoronto.ca/~kriz/cifar.html 论文摘要的翻译 最近提出的Temporal Ensembling方法在几个半监督学习基准中取得了最先进的结果。它维护每个训练样本的标签…

打赢网络免疫升级战!看聚铭铭察高级威胁检测系统如何重塑网络安全防线

在信息洪流的今天,企业如航行于暗礁密布的数字海洋,面对的不仅仅是已知的病毒与漏洞,更有高级威胁这股暗流,悄无声息地侵蚀着网络的肌理。常规的安全措施,犹如常规体检,虽能捕捉表面的异常,却难…

竹云实力入选《现代企业零信任网络建设应用指南报告》代表性厂商

2024年7月3日,国内网络安全媒体安全牛正式发布《现代企业零信任网络建设应用指南报告(2024版)》。竹云凭借在零信任领域创新性的产品方案和优异的市场表现,实力入选代表性厂商。 伴随着云计算、AI、大数据等技术的发展,远程办公、业务协同、…

spring boot 接口参数解密和返回值加密

spring boot 接口参数解密和返回值加密 开发背景简介安装配置yml 方式Bean 方式 试一下启动项目返回值加密参数解密body 参数解密param和form-data参数解密 总结 开发背景 虽然使用 HTTPS 已经可以基本保证传输数据的安全性,但是很多国企、医疗、股票项目等仍然要求…

聚鼎科技:装饰画现在做晚不晚

在每一处光影交错的角落,墙上那一副副静默无言的装饰画,似乎总在诉说着不同的故事。如今,投身于装饰画的创作与收藏,仿佛是一场关于美和时间的赛跑,那么问题来了——现在开始,晚吗? 伴随着生活品质的提升和…

长难句打卡7.5

When the United States entered just such a glowing period after the end of the Second World War, it had a market eight times larger than any competitor, giving its industries unparalleled economies of scale. 二战结束后,美国恰好进入了这样一段辉煌…

从草图到现实:SketchUp 在建筑项目中的独特优势

Sketchup 是全球最受欢迎的建筑可视化平台之一。借助该平台提供的各种工具,您可以创建可供市场使用的逼真项目。Sketchup为什么如此优秀?它对建筑项目有哪些优势?下面,你将看到什么是 Sketchup 以及这个工具的一些重要的优势。 关…

15.优化算法之BFS最短路问题2

0.算法 1.迷宫中离⼊⼝最近的出⼝ . - 力扣(LeetCode) class Solution {int[] dx { 0, 0, -1, 1 };int[] dy { 1, -1, 0, 0 };public int nearestExit(char[][] maze, int[] e) {int m maze.length, n maze[0].length;boolean[][] vis new boolean…

智能光伏开发都能用到什么软件和工具?

随着全球对可再生能源的日益重视和光伏技术的快速发展,智能光伏开发已成为推动能源转型的重要力量。在光伏项目的全生命周期中,从设计、建设到运营管理,各种软件和工具的应用发挥着至关重要的作用。 一、光伏系统设计软件 1、PVsyst PVsyst…

绝地求生PUBG点击开始游戏一直在加载不读条计时间的解决办法

绝地求生PUBG作为一款引领潮流的大逃杀游戏,凭借其紧张刺激的对抗体验赢得了全球玩家的喜爱。 即使是游戏已经上线很长时间了,但是游戏现在依旧是很火爆,还有很多玩家下载游戏进行游玩。然而,一些为玩家在游戏中遇到了点击开始游戏…

【ue5】虚幻5同时开多个项目

正常开ue5项目我是直接在桌面点击快捷方式进入 只会打开一个项目 如果再想打开一个项目需要进入epic 再点击启动就可以再开一个项目了

市场表现低迷,本周期的山寨币还有投资机会吗?

近年来,加密货币行业经历了巨大的波动和变革。尽管比特币和以太坊的价格走势持续向好,但山寨币市场的表现却令人失望。在这一轮牛市中,比特币和以太坊吸引了大量资金,而许多投资者对山寨币的信心却处于低谷。这让许多投资组合的回…

C++|海康摄像头实时预览时设置音量大小

使用海康API设置音量的函数是:NET_DVR_OpenSound。 在实际代码中我遇到了以下问题: 1:调用NET_DVR_OpenSound接口一直返回失败,错误是调用顺序出错。 2:音量设置不成功。 对于以上两种问题,我相信很多人…

数据库国产化之路(一)

数据库国产化之路(一) 1、前言:适配海量数据库过程中的一些记录,备忘用 2、海量数据库基于的pg版本,查看PG_VERSION文件为9.2。 3、MySQL中的IF函数替代,一开始的方案是从网上找了个if函数,后来发现CASE WHEN其实能完成…

公共事件应急日常管理系统-计算机毕业设计源码40054

公共事件应急日常管理系统的设计与实现 摘 要 本研究基于Spring Boot框架,设计并实现了公共事件应急日常管理系统,旨在提升公共事件的应急响应和日常管理效率。系统包括应急资源管理、物资申请管理、物资发放管理、应急培训管理、科普宣教管理、公共事件…

SOLIDWORKS分期许可(订阅形式),降低前期的投入成本!

SOLIDWORKS 分期许可使您能够降低前期软件成本,同时提供对 SOLIDWORKS 新版本和升级程序的即时访问,以及在每个期限结束时调整产品的灵活性,帮助您跟上市场需求和竞争压力的步伐。 目 录: ★ 1 什么是SOLIDWORKS分期许可 ★ 2 …

网安小贴士(8)IPv4与IPv6

一、前言 IPv4和IPv6都是互联网协议(IP)的版本,它们用于在互联网上标识和定位设备。 二、定义 IPv4(互联网协议第四版): IPv4是互联网协议的第一个广泛使用的版本,最初在1981年被标准化为RFC 7…

鸿蒙 HarmonyOS Next 路由 不废话 全干货

一、页面的创建 (1)直接通过创建一个新的Page的方式创建 (2)先创建一个 ArkTs File文件,然后在resources/base/profile/main_pages.json中加上页面对应的src路径,下面的Index_3.ets文件是通过创建ArkTs Fi…