图像处理:均值滤波算法

news/2024/4/20 20:18:47/文章来源:https://blog.csdn.net/m0_62919535/article/details/130316849

目录

前言

概念介绍

基本原理

Opencv实现中值滤波

Python手写实现均值滤波

参考文章


前言

在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)。这在此基础上,我想更深入地研究和推导这些算法,以便为将来处理图像的项目打下基础。

概念介绍

均值滤波是一种简单的图像平滑处理方法,其基本思想是用像素点周围的邻域像素的平均值来代替该像素的值。在图像处理中,均值滤波可以用于去除图像中的噪声,使图像变得更加平滑。它的计算简单易懂,但在滤波过程中可能会导致图像细节的损失。因此,在实际应用中,需要根据具体的情况选择适合的滤波算法。

基本原理

我们以5x5大小为例,均值滤波的原理只需要理解到,它其实是将这个范围内的25个值进行求和的平均值,以这个新值来代替这个区域的中心值。

配合这里的图进行理解:

 右图是经过左图进行均值变换后的值。

print((197+25+106+156+159+149+40+107+17+71+163+198+226+223+156+222+37+68+193+157+42+72+250+41+75)/25)

运行之后,获得新值126,覆盖掉中心值得像素226。

对于边缘像素,只仅仅计算在这个范围内得数值。

假如,左上角为中心值,而其左边和上边都没有值,我们只需要计算在这5x5区域内有的值就可以了。

计算如下:

print((23+0+25+158+140+238+67+199+197)/9)

得出新值为116,替换中心点23的值。

Opencv实现中值滤波

def blur(src, ksize, dst=None, anchor=None, borderType=None):

在OpenCV中,我们可以使用cv2.blur()函数来实现均值滤波。在使用该函数时,我们需要输入原始图像、滤波核的大小以及边界样式等参数。一般情况下,我们可以直接采用函数默认值即可。

这里我拿的是我个人的一个使用情况来看待的,像锚点,边界样式这种,我基本上没有遇到要修改的情况,现在我们来看看滤波核的大小对图片的影响。

import cv2
import pyps.pyzjr.utility as zjrpath = 'Images/Colnoiselena.jpg'
img = cv2.imread(path)
imgAverage_1 = cv2.blur(img, (1, 1))
imgAverage_3 = cv2.blur(img, (3, 3))
imgAverage_5 = cv2.blur(img, (5, 5))
imgAverage_7 = cv2.blur(img, (7, 7))
imgStack = zjr.stackImages(0.6, ([imgAverage_1, imgAverage_3], [imgAverage_5, imgAverage_7]))
cv2.imshow("imges",imgStack)
cv2.waitKey(0)

实现效果:

经典的lena的图片,可以看到,随着滤波核的大小逐渐增加,去噪效果越好,但相应的图片会变的模糊,计算时间会增长。所以,还是应了我开头就说过的话,在实际处理中,选择合适的滤波核大小,让模糊与去噪效果之间取得平衡。

pyps并不是什么第三方库,只是我集成在一起的函数文件,你无需在意。

Python手写实现均值滤波

import cv2
import numpy as np
import pyps.pyzjr.utility as zjrpath = 'Images/Colnoiselena.jpg'
img = cv2.imread(path)def Arerage_Filtering(img, k_size=3):if k_size % 2 == 0:k_size += 1rows, cols = img.shape[:2]pad_width = (k_size - 1) // 2img_pad = cv2.copyMakeBorder(img, pad_width, pad_width, pad_width, pad_width, cv2.BORDER_REPLICATE)img_filter = np.zeros_like(img)for i in range(rows):for j in range(cols):pixel_values = img_pad[i:i+k_size, j:j+k_size].flatten()img_filter[i, j] = np.mean(pixel_values)return img_filterimgAverage_1 = Arerage_Filtering(img,k_size=1)
imgAverage_3 = Arerage_Filtering(img,k_size=3)
imgAverage_5 = Arerage_Filtering(img,k_size=5)
imgAverage_7 = Arerage_Filtering(img,k_size=7)
imgStack = zjr.stackImages(0.6, ([imgAverage_1, imgAverage_3], [imgAverage_5, imgAverage_7]))
cv2.imshow("imges",imgStack)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个算法相对来说比较容易实现,但是相比调用OpenCV的函数,它的计算时间要长很多,而且我这里还只考虑了图像的两个通道,最终输出的结果是灰度图的情况下。

下面是这个函数的具体实现过程:

  1. 首先,判断卷积核的大小是否为奇数,如果为偶数,则将其加1,确保其大小为奇数。
  2. 获取图像的行数和列数。
  3. 计算填充的宽度,即卷积核宽度的一半,用于处理图像边缘。
  4. 使用cv2.copyMakeBorder函数进行边缘填充,将图像的边缘复制并填充到周围,以防止边缘像素点无法进行卷积。
  5. 初始化一个和原始图像大小一样的零矩阵。
  6. 遍历图像中的每一个像素点,计算该像素点周围邻域内的像素值,并求取其平均值,然后将其赋值给零矩阵中的对应像素点。
  7. 返回处理后的图像。

最后,函数通过stackImages函数将处理后的四张图像以2x2的网格形式拼接成一张图像,并展示结果。

参考文章

(6条消息) 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)_高斯滤波,均值滤波,中值滤波_夏天是冰红茶的博客-CSDN博客

(6条消息) 均值滤波(Mean filtering)_半濠春水的博客-CSDN博客

(7条消息) Opencv之图像滤波:2.均值滤波(cv2.blur)_Justth.的博客-CSDN博客

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

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

相关文章

使用状态机实现幂等性

文章目录 背景幂等概念适用场景示例代码上述代码状态流转 背景 在某些场景下,可以使用状态机来实现幂等性。将业务流程抽象为一个状态机,定义各个状态之间的转换规则。当收到一个请求时,根据当前状态和请求类型来判断是否允许执行操作&#x…

数学知识四

容斥原理 S表示面积,下面公式可求出不相交的面积 2个圆的公式是这样 4个圆的面积是 总面积-所有俩俩相交的面积所有三三相交的面积-四四相交的面积,公式里加和减互相出现。 从n个集合里面挑一个一直到从n个集合里面挑n个 1-10中,能被2&#x…

【 SpringBoot单元测试 和 Mybatis 增,删,改 操作 】

文章目录 一、Spring-Boot单元测试(了解)1.1 概念1.2 单元测试引用1.3 单元测试的实现1.4 简单的断言说明1.5 单元测试优点 二、Mybatis 增,删,改 操作2.1 增加⽤户操作2.2 修改⽤户操作2.3 删除⽤户操作 一、Spring-Boot单元测试(了解) 1.1 概念 单元测…

645. 错误的集合|||697. 数组的度|||448. 找到所有数组中消失的数字

645. 错误的集合 题目 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的…

教你轻松申请Azure OpenAI

Azure OpenAI 和 OpenAI 官方提供的服务基本是一致的,但是目前前者还是处于预览版的状态,一些功能还没有完全开放。 优点: 不受地域限制,国内可以直接调用。可以自己上传训练数据进行训练(据说很贵)。Azu…

Cloud Kernel SIG月度动态:发布 Anolis 8.8 镜像、kABI 社区共建流程

Cloud Kernel SIG(Special Interest Group):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体进展 Anolis 8.8 镜像发布,默认搭载 ANCK 5.10-013 版本。 Anolis 23 滚动内核更新至…

Windows下版本控制器(SVN)-验证是否安装成功+配置版本库+启动服务器端程序

文章目录 基础知识-Windows下版本控制器(SVN)3、Subversion 安装与配置3.1 验证是否安装成功。3.2 配置版本库3.3 启动服务器端程序 基础知识-Windows下版本控制器(SVN) 3、Subversion 安装与配置 TortoiseSVN安装与配置网上资料太多了,这里就不阐述了。 3.1 验证是…

【Java代码】MP3、flac歌曲批量生成同名的“xxx.lrc”歌词文件导入索尼黑砖二代

目录 1、准备条件2、实现方式3、代码环境和maven依赖4、Java代码5、示例1结果6、示例2结果7、一个小问题8、“音乐标签”下载地址 1、准备条件 网易云下载的MP3、flac后缀的歌曲若干首(ncm后缀的歌曲需要还原格式,不然会随着VIP过期而无法听&#xff09…

【原理图专题】案例:从集成的电平转换芯片换成三极管分立电平转换怎么就报异常

本案例是一个已经小批量量产的设备,不是我测试出来的,但是也算是我之前一手造成的,因为原理图这部分是我修改的。 异常发现最近生产的整机有部分非接读卡时无法控制到蜂鸣器发声音。我们的设计是这样的,有两个MCU互相通信,一个MCU是控制蜂鸣器的,另一个MCU通过SPI与非接芯…

银行数字化转型导师坚鹏:银行业务数字化创新工作坊

银行业务数字化创新工作坊 课程背景: 很多银行存在以下问题: 不清楚如何进行业务数字化创新? 不知道如何开展银行数字化营销工作? 不知道零售业务数字化创新成功案例? 学员收获: 学习原创银行BLM…

docker容器内的应用利用k8s configmap做配置中心

ConfigMap 能带来什么好处? 传统的应用服务都有自己的配置文件,各自配置文件存储在服务所在节点。如果配置出现变更,就需要对应节点的配置文件。Kubernetes 利用了 Volume 功能,完整设计了一套配置中心,其核心对象就是…

阳光万里,祝你上岸——免统考在职研究生

什么是在职研究生 在职研究生,是国家计划内,以在职人员身份,部分时间在职工作,部分时间在校学习的研究生教育的一种类型。在职攻读硕士方式有三种: 1.双证非全日制研究生:为普通高等教育研究生学历&#x…

Android OpenGL 渲染相机预览画面显示体系

OpenGL能进行高效得渲染图形图像,并支持各种复杂的特效和动画。 而在 Android 当中,运用的是OpenGL ES,它是OpenGL的一个轻量级版本,专门用于在移动设备、游戏控制台、嵌入式系统等嵌入式环境中使用。 它可以做相机滤镜或者图片…

seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库

seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库 大纲 1 单机搭建2 集群搭建 由于项目中的dubbo版本为2.6.0 故客户端程序(TM RM)使用seata-all 1.4.2 ,服务端(TC)使用seata-server-1.6.0.zip …

MIT6.S081操作系统实验2021(xv6系统)——lab1 Xv6 and Unix utilities

MIT6.S081操作系统实验2021——lab1 参考文章 sleep 要求为xv6实现UNIX 程序sleep;其应该暂停用户指定的ticks number。tick是 xv6 内核定义的时间概念,即计时器芯片的两次中断之间的时间(两次时钟中断之间的时间)。您的解决方…

关于函数栈帧的创建与销毁和可变参数列表

目录 1. 深刻理解函数调用过程1.1 基本概念1.2 函数栈帧的创建于销毁1.2.1 栈帧创建1.2.2 栈帧销毁1.2.3 有趣的现象 2. 了解可变参数列表的使用与原理2.1 可变参数列表与函数栈帧的关系2.2 宏的工作过程2.3 宏的具体实现原理 1. 深刻理解函数调用过程 1.1 基本概念 关于函数…

【MySQL】(7)复合查询

文章目录 单表查询回顾与练习多表查询自连接多行子查询(单列)in 运算符all 关键字any 关键字 多列子查询from 子句中的子查询合并查询 单表查询回顾与练习 注:下面的依旧基于 scott 数据库 MariaDB [scott]> select * from emp; -------…

ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7

编辑:ll ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7 型号:ADG736BRMZ-REEL7 品牌:ADI /亚德诺 封装:MSOP-10 批号:2023 安装类型:表面贴装型 引脚数量:10 类型&#xff1…

Mybatis框架超详解及运用总结

Mybatis 一、什么是Mybatils?二、第一个Mybatils程序2.1、创建springboot工程2.2、准备数据2.3、配置MyBatis2.4、编写SQL语句2.5、单元测试 三、JDBC四、数据库连接池五、lombok六、Mybatis基础操作6.1、删除6.2、新增6.2.1、主键返回 6.3、修改6.4、查询6.4.1、数…

推式配货(Push)、拉式配货(Pull)和配送需求计划(DRP)的区别

随着电子商务的迅猛发展,物流配送服务已然成为企业竞争最为核心的环节,一个全面、完善的物流配送方案,能够帮助企业满足客户交期、节约运输和库存成本,促进各环节沟通,提高生产稳定性。同时,物流配送的许多…