opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理?

图像平滑处理(Image
Smoothing)是一种图像处理技术,旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像,以便在后续图像处理任务中获得更好的结果。

常用的图像平滑处理方法包括:

均值滤波(Mean Filtering):用图像中像素周围区域的平均值来代替每个像素的值,从而平滑图像。均值滤波对去除高斯噪声等简单噪声类型效果较好。

高斯滤波(Gaussian Filtering):使用高斯核来对图像进行滤波,高斯滤波在平滑图像的同时能够较好地保留图像的边缘信息。

中值滤波(Median Filtering):用像素周围区域像素值的中值来代替每个像素的值,适用于去除椒盐噪声等脉冲型噪声。

双边滤波(Bilateral Filtering):结合空间域和灰度值域的信息,能够保持图像的边缘特征,同时对图像进行平滑处理。

图像平滑处理应用场景

图像平滑处理在图像处理中有广泛的应用场景,主要用于去除图像中的噪声、减少细节、平滑图像的过渡部分,从而提升后续图像处理任务的效果。

以下是图像平滑处理的一些常见应用场景:

去噪声:图像中可能存在不同类型的噪声,如高斯噪声、椒盐噪声等。使用图像平滑处理方法可以有效地减少这些噪声,提高图像质量。

在尽量保留图像原有信息的情况下,过滤掉图像内部的噪声,这一过程称为对图像的平滑
处理,所得的图像称为平滑图像。例如,下图是含有噪声的图像,在图像内存在噪声信息,
我们通常会通过图像平滑处理等方式去除这些噪声信息。

在图这里插入图片描述
通过图像平滑处理,可以有效地过滤掉图像内的噪声信息。再看下面得图 所示是对上面图 进行图像平滑处理的结果,可以看到原有图像内含有的噪声信息被有效地过滤掉了。

在这里插入图片描述

图像降噪:在低光条件下或者高ISO值下拍摄的图像可能会有较多的噪点。通过图像平滑处理,可以降低噪点的影响,使图像看起来更加干净和清晰。

图像模糊:在某些情况下,我们可能希望减少图像中的细节,使图像变得模糊,以达到某种特定的效果。图像平滑处理可以实现这个目标。

图像缩放:当对图像进行缩放操作时,可能会引入锯齿效应或马赛克现象。通过图像平滑处理,可以减少这些不平滑的现象,得到更平滑的缩放图像。

边缘检测:在进行边缘检测等图像处理任务时,图像平滑处理可以帮助去除细节,使边缘更加清晰和明显。

目标检测和识别:在某些情况下,图像中的细节和噪声可能会干扰目标检测和识别算法。通过图像平滑处理,可以消除这些干扰,提高目标检测和识别的准确性。

总的来说,图像平滑处理是图像预处理的重要步骤,它能够改善图像质量、减少噪声和细节,为后续图像处理任务提供更好的输入。不过需要注意,过度的平滑处理可能会导致图像失真和信息丢失,因此在应用图像平滑处理时需要权衡处理效果和影响。

均值滤波

定义:

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

例如,希望对图 下图 中位于第 5 行第 5 列的像素点进行均值滤波。

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

当前像素点的位置为第 5 行第 5 列,我们对其周围 5×5 区域内的像素值求平均,计算方法为:

新值=[(197+25+106+156+159)+
(149+40+107+5+71)+
(163+198+226+223+156)+
(222+37+68+193+157)+
(42+72+250+41+75)]/25
=126

计算完成后得到 126,我们将 126 作为当前像素点均值滤波后的像素值。我们针对上图 中的每一个像素点计算其周围 5×5 区域内的像素值均值,并将其作为当前像素点的新值,即可
得到当前图像的均值滤波结果。

当然,图像的边界点并不存在 5×5 邻域区域。例如,左上角第 1 行第 1 列上的像素点,其像素值为 23,如果以其为中心点取周围 5×5 邻域,则 5×5 邻域中的部分区域位于图像外部。
图像外部是没有像素点和像素值的,显然是无法计算该点的 5×5 邻域均值的。
针对边缘像素点,可以只取图像内存在的周围邻域点的像素值均值。

如图 7-8 所示,计算
左上角的均值滤波结果时,仅取图中灰色背景的 3×3 邻域内的像素值的平均值。

在这里插入图片描述

在图 7-8 中,对于左上角(第 1 行第 1 列)的像素点,我们取第 1~3 列与第 1~3 行交汇处
所包含的 3×3 邻域内的像素点的像素值均值。因此,当前像素点的均值滤波计算方法为:

新值=[(23+158+140)+
(238+0+67)+
(199+197+25)]/9
=116

计算完成后得到 116,将该值作为该点的滤波结果即可

除此以外,还可以扩展当前图像的周围像素点。例如,将当前 9×7 大小的图像扩展为 13×11大小的图像,如图 7-9 所示。

在这里插入图片描述
完成图像边缘扩展后,可以在新增的行列内填充不同的像素值。在此基础上,再针对 9×7的原始图像计算其 5×5 邻域内像素点的像素值均值。OpenCV 提供了多种边界处理方式,我们可以根据实际需要选用不同的边界处理模式。

针对图像中第 5 行第 5 列的像素点,其运算过程相当于与一个内部值都是 1/25 的 5×5 矩阵进行相乘计算,从而得到均值滤波的结果 126,其对应的关系如图 7-10 所示

在这里插入图片描述

根据上述运算,针对每一个像素点,都是与一个内部值均为 1/25 的 5×5 矩阵相乘,得到均值滤波的计算结果,如图 7-11 所示。

在这里插入图片描述

将使用的 5×5 矩阵一般化,可以得到如图 7-12 所示的结果。

在这里插入图片描述
OpenCV 中,图 7-12 右侧的矩阵被称为卷积核,其一般形式为:
在这里插入图片描述
式中,M 和 N 分别对应高度和宽度。一般情况下,M 和 N 是相等的,例如比较常用的 3×3、5×5、
7×7 等。如果 M 和 N 的值越大,参与运算的像素点数量就越多,图像失真越严重。

函数语法

OpenCV 中,实现均值滤波的函数是 cv2.blur(),其语法格式为:

dst = cv2.blur( src, ksize, anchor, borderType )

式中:

 dst 是返回值,表示进行均值滤波后得到的处理结果。

 src 是需要处理的图像,即原始图像。它可以有任意数量的通道,并能对各个通道独立处理。图像深度应该是 CV_8U、CV_16U、CV_16S、CV_32F 或者 CV_64F 中的一种。

 ksize 是滤波核的大小。滤波核大小是指在均值处理过程中,其邻域图像的高度和宽度。

例如,其值可以为(5, 5),表示以 5×5 大小的邻域均值作为图像均值滤波处理的结果,
如下式所示。

在这里插入图片描述
anchor 是锚点,其默认值是(-1, -1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点。
 borderType 是边界样式,该值决定了以何种方式处理边界,其值如表 7-1 所示。一般情
况下不需要考虑该值的取值,直接采用默认值即可。

在这里插入图片描述
通常情况下,使用均值滤波函数时,对于锚点 anchor 和边界样式 borderType,直接采用其
默认值即可。因此,函数 cv2.blur()的一般形式为:

dst = cv2.blur( src, ksize,)

实验: 读取一幅噪声图像,使用函数 cv2.blur()对图像进行均值滤波处理,得到去噪图像,并显示原始图像和去噪图像

实验原图

在这里插入图片描述

import cv2
o=cv2.imread("lenaNoise.png") #读取待处理图像
#使用 blur 函数处理图像
r=cv2.blur(o,(5,5)) 
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

运行上述程序后,会分别显示噪声图像(左图)和去噪图像(右图)

在这里插入图片描述

实验2:针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。

调整设置函数 cv2.blur()中的 ksize 参数,示例代码如下

代码如下:

import cv2
o=cv2.imread("lenaNoise.png") #读取待处理图像
#使用 blur 函数处理图像
r3=cv2.blur(o,(3,3))
r5=cv2.blur(o,(5,5))
r7=cv2.blur(o,(7,7))
cv2.imshow("original",o)
cv2.imshow("result3",r3)
cv2.imshow("result5",r5)
cv2.imshow("result7",r7)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述
从结果图中可以看出,卷积核越来,图片会越模糊.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter 的使用

文章目录 1. JMeter下载2. JMeter的使用2.1 JMeter中文设置2.2 JMeter的使用2.2.1 创建线程组2.2.2 HTTP请求2.2.3 监听器 1. JMeter下载 官网地址 https://jmeter.apache.org/download_jmeter.cgi https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.zip 下载解…

系统架构设计师-软件架构设计(6)

目录 一、物联网分层架构 二、大数据分层架构 三、基于服务的架构(SOA) 1、SOA的特征 2、服务构件与传统构件的区别 四、Web Service(WEB服务) 1、Web Services 和 SOA的关系 五、REST(表述性状态转移) 六、ESB(…

【C++】STL——queue的介绍和使用、queue的push和pop函数介绍和使用、queue的其他成员函数

文章目录 1.queue的介绍2.queue的使用2.1queue构造函数2.2queue的成员函数(1)empty() 检测队列是否为空,是返回true,否则返回false(2)size() 返回队列中有效元素的个数 (3)front() 返…

如何在Visual Studio Code中用Mocha对TypeScript进行测试

目录 使用TypeScript编写测试用例 在Visual Studio Code中使用调试器在线调试代码 首先,本文不是一篇介绍有关TypeScript、JavaScript或其它编程语言数据结构和算法的文章。如果你正在准备一场面试,或者学习某一个课程,互联网上可以找到许多…

tdengine入门详解

TDengine是什么? TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB), 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计,基于C语言开发。 什么是时序数据库?时序数据产生…

C++ 对象数组

**数组元素不仅可以是基本数据类型,也可以是自定义类型。**例如,要存储和处理某单位全体雇员的信息,就可以建立一个雇员类的对象数组。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。 因此,和基…

Libevent开源库的介绍与应用

libeventhttps://libevent.org/ 一、初识 1、libevent介绍 Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络&#xff…

Linux系统安装部署MongoDB完整教程(图文详解)

前言:本期给大家分享一下目前最新Linux系统安装部署MongoDB完整教程,我的服务器采用的是Centos7,在部署之前我重装了我的服务器,目的是为了干净整洁的给大家演示我是如何一步步的操作的,整体部署还是挺简洁&#xff0c…

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑:提升性能和延长使用寿命 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦&…

【机器学习】西瓜书习题3.3Python编程实现对数几率回归

参考代码 结合自己的理解,添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt from sklearn import linear_model导入数据,进行数据处理和特征工程 # 1.数据处理&#x…

Go语音介绍

Go语言介绍 Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。 Go是静态强类型语言,是区别于解析型语言的编译型语言。 解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。 编译型语言——源代码编…

Redis 6.5 服务端的读取缓冲区和输出缓冲区执行源码

通篇全文都是不开启事务,不开启多线程,只有主线程去执行 借鉴 Redis源码与设计剖析 – 18.Redis网络连接库分析 客户端与集群之间数据的交互 IO多路复用与客户端、输出缓冲区和读取缓冲区之间的关系一、读取缓冲区1、新客户端连接时注册从socket读取事件…

【css】解决元素浮动溢出问题

如果一个元素比包含它的元素高&#xff0c;并且它是浮动的&#xff0c;它将“溢出”到其容器之外&#xff1a;然后可以向包含元素添加 overflow: auto;&#xff0c;来解决此问题&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head> <style>…

基于遗传算法的试题组卷(二)

实例讲解 一、准备工作 1、问题实体 问题实体包含编号、类型&#xff08;类型即题型&#xff0c;分为五种&#xff1a;单选&#xff0c;多选&#xff0c;判断&#xff0c;填空&#xff0c;问答&#xff0c; 分别用1、2、3、4、5表示&#xff09;、分数、难度系数、知识点。一…

C++ 智能指针

C 智能指针 为什么需要智能指针&#xff1f;auto_ptrunique_ptrshared_ptrweak_ptr智能指针的核心实现unique_ptr的简单实现Counter的简单实现share_ptr的简单实现weak_ptr简单实现 shared_ptr的线程安全性多线程无保护读写 shared_ptr 可能出现的问题make_shared()share_ptr/u…

卸载本机已安装的node.js(v.16.13.0版本)

因为要用多版本的node&#xff0c;准备安装一个nvm管理&#xff0c;所以需要先卸载掉原来安装的v.16.13.0版本。 记录一下卸载过程 1、在系统设置-应用里卸载node 妈蛋这样卸载报错。。找了下根本没有这个路径 那就只能最简单的方法了&#xff0c;全部删掉 1、删除node的安装…

IDEA用Gradle构建项目时,lombok插件无效的解决办法

Lombok 可用来帮助开发人员消除 Java 的重复代码&#xff0c;尤其是对于简单的 Java 对象&#xff08;POJO&#xff09;&#xff0c;比如说getter/setter/toString等方法的编写。它通过注解实现这一目的。 正确使用姿势 一、安装Lombok插件 菜单栏File -> Settings ->…

通过MySQL删除Hive元数据信息

之前遇到过一个问题&#xff0c;在进行Hive的元数据采集时&#xff0c;因为Hive表的文件已经被删除了&#xff0c;当时是无法删除表&#xff0c;导致元数据采集也发生了问题&#xff0c;所以希望通过删除Hive表的元数据解决上述问题。 之前安装时&#xff0c;经过特定的配置后…

Qt实现自定义QDoubleSpinBox软键盘

在Qt应用程序开发中&#xff0c;经常会遇到需要自定义输入控件的需求。其中&#xff0c;对于QDoubleSpinBox控件&#xff0c;如果希望在点击时弹出一个自定义的软键盘&#xff0c;以便用户输入数值&#xff0c;并将输入的值设置给QDoubleSpinBox&#xff0c;该如何实现呢&#…

【MySQL】MySQL数据类型

文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…