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.mfbz.cn/a/783959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的底层机制

手写MyBatis底层机制 读取配置文件,得到数据库连接 思路 引入必要的依赖需要写一个自己的config.xml文件,在里面配置一些信息,driver,url ,password,username需要编写Configuration类,对 自己…

服务器数据恢复—同品牌不同系列服务器raid5阵列数据恢复方案分析

RAID5磁盘阵列数据恢复案例一: 服务器数据恢复环境: 一台某品牌LH6000系列服务器,通过NetRaid阵列卡将4块硬盘组建为一组RAID5磁盘阵列。操作系统都为Window server,数据库是SQLServer。 服务器故障: LH6000系列服务器…

四、嵌入式技术(考点篇)试题(1)

我选择C,实际答案选B,答案给出的理由是,SoC是片上系统,包含完整系统和嵌入式软件全部内容,B的说法有点片面。 明显选C,嵌入式跟通用性不太沾边。 嵌入式OS特征:裁剪配置安全可靠实时高确定&…

Python基础知识——(001)

文章目录 P4——3. 程序设计语言的分类 1. 程序设计语言 2. 编译与解释 P5——4. Python语言的简介与开发工具 1. Python语言的简介 2. Python语言的发展 3. Python语言的特点 4. Python的应用领域 5. Python的开发工具 P6——5. IPO编程方式 IPO程序编写方法 P7——6. print函…

大模型隐私窃取攻击

前言 对于大模型风险,目前大家更多关注的还是越狱攻击。隐私这一块,可能国内还不如欧美重视,在安全的学术四大会议论文中,有时候甚至AI隐私的论文比AI安全的论文更多。但实际上,除了越狱之外,另外一大风险…

监控电脑软件【2024最新】|6款软件保姆式解析!

在数字化办公日益普及的今天,很多企业为了更好的提升员工的工作效率和保障企业的数据安全,开始给自己的企业布局电脑监控软件。 但市面上的电脑监控软件种类繁多复杂,为了更好的保障企业利用,小编推荐了以下几款电脑监控软件供大…

阶段三:项目开发---大数据开发运行环境搭建:任务4:安装配置Spark集群

任务描述 知识点:安装配置Spark 重 点: 安装配置Spark 难 点:无 内 容: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop …

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用,确实会带来很多好处,并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

【c语言】玩转文件操作

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展,学术交流与研讨成为了推动科研进步的重要途径。进入7月,众多高质量的EI国际会议纷纷拉开帷幕,为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下,我们将详细介绍一些在7月可投的EI国际会议…

Java集合升序降序、转Set的方法

Collections.sort(list,Comparator.comparing(OcApplySquareVo::getApplyName).reversed()); 集合转set /** 集合转set */Set<String> pkCodeSet rows.stream().map(RailwayWeighBookResult.RailwayWeighBook::getPkCode).collect(Collectors.toSet());

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

Pytest单元测试系列[v1.0.0][Pytest基础]

Pytest安装与配置 和Unittest一样&#xff0c;Pytest是另一个Python语言的单元测试框架&#xff0c;与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的测试用例。 Pytest 安装 启动命令行&…

A股本周在3000点以下继续筑底,本周依然继续探底?

夜已深&#xff0c;市场传来了3个浓烈的消息&#xff0c;炸锅了&#xff0c;恐有大事发生&#xff0c;马上告诉所有人&#xff1a; 消息面&#xff1a; 1、中国经济周刊首席评论员钮文新称&#xff1a;不要等中小投资者都彻底希望&#xff0c;销户离场了&#xff0c;才发现该…

新恒汇过会一年多注册仍遥遥无期,实控人大额负债入股资金靠借款

《港湾商业观察》施子夫 自2022年6月递表深交所创业板获受理&#xff0c;新恒汇电子股份有限公司 &#xff08;以下简称&#xff0c;新恒汇&#xff09;的上市之路无疑颇显诸多坎坷。2022年7月&#xff0c;深交所下发第一轮审核问询函&#xff1b;同年11月&#xff0c;深交所下…

Bugly的底层是怎么实现的

Bugly 入门 首先&#xff0c;简要介绍什么是 Bugly 以及它的主要功能&#xff1a; Bugly 是什么&#xff1a; Bugly 是腾讯提供的一款移动应用质量监控工具&#xff0c;主要用于捕捉应用的崩溃、ANR&#xff08;应用无响应&#xff09;、卡顿和错误日志。 主要功能&#xff1…

微型导轨如何提升数控机床的稳定性?

数控机床是加工设备中常用的机床&#xff0c;精度和稳定性是衡量数控机床性能的重要指标。而微型导轨作为数控机床中重要的传动元件&#xff0c;数控机床与其具体结构性能是密不可分的&#xff0c;那么微型导轨如何提高数控机床的稳定性呢&#xff1f; 1、微型导轨通过采用先进…

【见刊通知】MVIPIT 2023机器视觉、图像处理与影像技术国际会议

MVIPIT 2023&#xff1a;https://ieeexplore.ieee.org/xpl/conhome/10578343/proceeding 入库Ei数据库需等20-50天左右 第二届会议征稿启动&#xff08;MVIPIT 2024&#xff09; The 2nd International Conference on Machine Vision, Image Processing & Imaging Techn…

暑假提升(3)[平衡二叉树之二--红黑树]

命为志存。 —— 朱熹 红黑树RBTree 1、诞生原因2、红黑树的概念3、红黑树的性质4、红黑树的设计4、1、节点设计4、2、插入操作的设计 5、总结 1、诞生原因 由于二叉树的局限性&#xff0c;进一步出现平衡二叉树&#xff0c;来帮助我们来进一步提升我们对数据的处理&#xff0…

【LabVIEW学习篇 - 1】:初始LabVIEW

文章目录 初始LabView前面板和程序框图前面板&#xff08;Front Panel&#xff09;程序框图&#xff08;Block Diagram&#xff09;交互和工作流程 练手小案例&#xff1a;LabView中实现加法操作 初始LabView LabVIEW&#xff08;Laboratory Virtual Instrument Engineering W…