从零开始学cv-9:图像滤波

news2024/11/15 19:42:30

文章目录

  • 前言
  • 一、简介:
  • 二、图像滤波实现:
    • 2.1 均值滤波:
    • 2.2 高斯滤波:
    • 2.3 中值滤波:
    • 2.4 锐化滤波:

前言

在信息化时代,图像已成为人们获取信息、沟通交流的重要载体。随着科技的飞速发展,图像处理技术在医疗、安防、航天、教育等领域发挥着越来越重要的作用。然而,在实际应用中,图像往往受到噪声、模糊等质量问题的困扰,这些问题严重影响了图像的视觉效果和后续处理。为此,图像滤波技术应运而生,它旨在改善图像质量,为图像的进一步分析和应用奠定基础。本文将围绕图像滤波这一主题,介绍其基本原理、常见算法及其在实际应用中的重要作用。

一、简介:

由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等,为了对这些噪声进行处理,常常使用图像滤波技术,图像滤波按照目的划分可以分为两种,平滑滤波和锐化滤波。
平滑滤波,能减弱或消除图像中的高频分量,但不影响低频分量。因为高频分量对应图像中的区域边缘等灰度值具有较大、较快变化的部分,平滑滤波将这些分量绿区可减少局部灰度的起伏,使图像变得比较平滑。实际应用中,平滑滤波即可以用来消除噪声,又可以用在提取较大的目标前过滤去除较小的细节或将目标内的小间断连接起来。
锐化滤波,能减弱或消除图像中的低频分量,但不影响高频分量。因为低频分量对应图像中灰度值缓慢变化的区域,因而与图像的整体特性如整体对比度和平均灰度值等有关。锐化滤波将这些分量滤去可使图像反差增加,边缘明显。实际应用中,锐化滤波可用于增强图像中被模糊的细节或景物的边缘。

二、图像滤波实现:

要想实现图像滤波,首先要了解一下图像卷积,平滑滤波和锐化滤波都是通过图像卷积实现的,卷积运算就是对于图像 f(x,y) 中的每个像素,将其作为中心像素,计算它及其邻域像素和卷积核 w(a,b)对应位置元素的乘积,然后把结果相加到一起,得到的值就作为该中心像素的新值,这样就完成了一次卷积运算。然后将kernel向下或向左平移一位继续计算每个像素的新值,直到遍历完整个图像。
在这里插入图片描述
注意:
在图像滤波中,处理边缘中心像素时,若周围像素不足,可采用两种方法:一是忽略边缘像素的计算,对大图像影响较小;二是通过插值增加边缘像素,这是卷积操作中的常用方法。处理结果超出0-255范围时,应将其限制在该范围内。
在opencv中使用result = cv.filter2D(src, ddepth, kernel, dst=None, anchor=None, delta=None, borderType=None)进行图像卷积。

参数说明
src: 输入图像,可以是灰度图像或者彩色图像。
ddepth: 目标图像的所需深度,如果设置为 -1,则输出图像将与输入图像具有相同的深度。
kernel: 卷积核(滤波器),是一个二维数组,表示滤波器的权重。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
anchor: 卷积核的锚点位置,默认值为 (-1, -1),表示锚点位于核中心。
delta: 可选值,用于添加到滤波结果中的值,可以在滤波后进行微调。
borderType: 边界类型,用于处理图像边界,默认值为 cv.BORDER_DEFAULT。

举例:


import cv2
import numpy as np
path = r"E:\PS\sky2.jpg"

img = cv2.resize(cv2.imread(path), (640,480))
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],    # 锐化
                   [0, -1, 0]])
dst = cv2.filter2D(img, -1, kernel)  # 图像卷积 -1代表和输入图一样
cv2.imshow("img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)

效果:
在这里插入图片描述
要想实现图像的卷积首先要根据图像的特征定义不同的卷积核,加大了使用的难度,opencv将几种常用的卷积操作进行封装,以此实现了不同的功能函数,下面介绍几个常用的滤波方法更多的滤波请看这里。

2.1 均值滤波:

均值滤波是典型的线性滤波算法,在图像中应用比较多,原理是以该像素点周围的八个像素点取平均操作,然后替代该像素点,均值滤波的特点是算法简单,计算速度快,缺点是去噪声的同时去除了很多细节部分,将图像变得模糊。opencv实现:dst = cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)

参数说明
src: 输入图像,可以是灰度图像或者彩色图像。
ksize: 滤波核的大小。核的大小由宽度 和高度指定,它们都必须是正奇数。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
anchor: 锚点位置,默认值为 (-1, -1),表示锚点位于核中心。
borderType: 边界类型,用于处理图像边界,默认值为 cv2.BORDER_DEFAULT。

特点:

  1. 简单性和高效性:均值滤波器的设计和实现非常简单,只需使用一个固定大小的卷积核,其中所有系数相等,这使得其计算效率较高,适合快速处理图像。
  2. 平滑效果:均值滤波通过对像素邻域内的平均值进行替换,能有效减少图像中的随机噪声,使图像整体看起来更加平滑。

2.2 高斯滤波:

高斯滤波是一种基于高斯分布的线性滤波器,它在图像处理中用于减少图像噪声和模糊图像。高斯滤波器通过对图像的每个像素点及其邻域内的像素点应用高斯权重函数进行加权平均,从而实现平滑效果。由于高斯函数具有很好的性质,如对称性和可分离性,因此高斯滤波器在图像处理中非常流行。
高斯滤波有以下几个特点:

  1. 权重分配:高斯滤波器为邻域内的每个像素分配不同的权重,中心像素权重最大,越远离中心权重越小。
  2. 可分离性:二维高斯函数可以分解为两个一维高斯函数的乘积,这意味着可以先沿着一个方向进行滤波,然后再沿着另一个方向滤波,从而减少计算量。
  3. 减少噪声:高斯滤波能有效减少高斯噪声,即随机分布的噪声。

其opencv函数为dst = cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

src: 输入图像,可以是灰度图像或者彩色图像。
ksize: 高斯核的大小。核的大小由宽度和高度指定,它们都必须是正奇数。如果设置为 (0, 0),则函数会根据 sigmaX 和 sigmaY 自动计算核的大小。
sigmaX: X 方向的高斯核标准差。较大的值会导致更广泛的模糊效果。如果这个值是 0,那么它就会从 ksize 计算得出。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
sigmaY: Y 方向的高斯核标准差。如果这个值是 0,则默认等于 sigmaX。
borderType: 边界类型,用于处理图像边界,默认值为 cv2.BORDER_DEFAULT。

2.3 中值滤波:

中值滤波是一种常用的图像处理技术,它通过计算图像中每个像素点及其邻域内像素的中值,并用这个中值替换原始像素值,从而实现图像平滑和去除噪声的目的。中值滤波特别适用于去除图像中的椒盐噪声,即随机分布的白点和黑点。
特点:

  1. 去除椒盐噪声:中值滤波非常有效于去除图像中的椒盐噪声,这是因为噪声像素通常与其邻域内的像素值差异较大,而中值滤波会将这些异常值替换为中值,从而消除噪声。
  2. 边缘保持:与均值滤波不同,中值滤波在平滑图像的同时,能够较好地保持图像的边缘和细节。这是因为中值滤波不依赖于邻域像素的加权平均,而是直接选择中值,这使得边缘像素不会被过度模糊。
  3. 非线性和不变性:中值滤波是一种非线性滤波技术,它对输入信号的变化不敏感,具有一定的鲁棒性。此外,中值滤波不会改变图像的亮度均值,因此对于图像的整体亮度保持不变。

opencv函数为dst = cv2.medianBlur(src, ksize)

src: 输入图像,可以是灰度图像或者彩色图像。
ksize: 滤波核的大小,它必须是大于1的正奇数。滤波核的大小决定了邻域的大小,即考虑多少个周围的像素来计算中值。

代码

# 1.60 彩色图像的直方图匹配
import cv2
import numpy as np

path = r"E:\PS\1700898802715.png"

img = cv2.resize(cv2.imread(path), (256,256))  # 读取图片并压缩
blur = cv2.blur(img,(5, 5))   # 均值滤波
gas = cv2.GaussianBlur(img, (5, 5), 1.5)  # 高斯滤波
mid = cv2.medianBlur(img, 5)  # 中值滤波

cv2.imshow("ori",img)
cv2.imshow("mid",mid)
cv2.imshow("blur",blur)
cv2.imshow("gas",gas)
cv2.waitKey(0)

效果:在这里插入图片描述

2.4 锐化滤波:

图像锐化处理旨在通过增强图像的对比度来提升其清晰度,这一过程涉及对图像模糊的根本原因进行分析和针对性的增强策略。图像模糊通常是由于图像数据经过平均或积分运算导致的细节丢失,因此,图像锐化处理的核心在于通过微分运算来恢复这些细节,从而使图像变得更加清晰。
拉普拉斯算子是基于图像邻域内像素灰度差异的计算原理,它是一种基于二阶微分的图像邻域增强算法。该算子的基本原理是:当邻域中心像素的灰度低于其邻域内其他像素的平均灰度时,中心像素的灰度值应相应降低;反之,当中心像素的灰度高于邻域平均灰度时,其灰度值应相应提高。这一过程有助于突出图像的边缘和细节,从而实现图像的锐化。
在算法的实现过程中,通常通过对邻域中心像素进行四方向或八方向的梯度计算,并将梯度值相加以判断中心像素与邻域内其他像素的灰度关系。随后,根据梯度运算的结果对中心像素的灰度进行调整,以达到图像锐化的目的。通过这种方式,拉普拉斯算子能够有效地增强图像的对比度,提升图像的视觉效果。
opencv实现
dst = cv.Laplacian(src, ddepth, ksize=None, scale=None, delta=None, dst=None, borderType=None)

src: 输入图像,可以是灰度图像或者彩色图像。
ddepth: 输出图像的深度,如果设置为 -1,则输出图像将与输入图像具有相同的深度。
ksize: 卷积核的大小,它必须是正奇数。如果设置为 None,则默认为 3。
scale: 缩放因子,用于调整输出图像的值域范围。如果设置为 None,则默认为 1。
delta: 可选值,用于添加到滤波结果中的值,可以在滤波后进行微调。
dst: 输出图像,可以是一个预先分配的图像,如果不指定,则函数会自动分配。
borderType: 边界类型,用于处理图像边界,默认值为 cv.BORDER_DEFAULT

代码:

# 1.60 彩色图像的直方图匹配
import cv2
import numpy as np

# 1.78:图像锐化:拉普拉斯算子 (Laplacian)
img = cv2.imread(r"E:\PS\shadow1.jpg") 

# 使用 cv2.Laplacian 实现 Laplace 卷积算子
imgLaplace = cv2.Laplacian(img, -1, ksize=3) #拉普拉斯获取细节
imgRecovery = cv2.add(img, imgLaplace)  # 细节和原图叠加
cv2.imshow("lap",imgLaplace)
cv2.imshow("imgRecovery",imgRecovery)
cv2.waitKey(0)

效果:
在这里插入图片描述

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

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

相关文章

《高等代数》范德蒙德行列式的证明

说明:此文章用于本人复习巩固,如果也能帮助到大家那就更加有意义了。 注:1)利用数学归纳法证明范德蒙德行列式。 2)将范德蒙德行列式最后一列除了“1”以外都化为“0”,再按照最后一列展开。 3&#xff09…

Python编码系列—Python项目架构的艺术:最佳实践与实战应用

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

线段树解决区间合并类问题

如果只维持一段区间连续1的最长字串长度是无法被线段树维护的:所以可以增加信息来共同维护 1.维护三个信息:连续1的最长字串长度、连续1的最长前缀长度、连续1的最长后缀长度 2.如果一段区域连续1的长度小于区域的总长度: 3.如果一段区域连续…

力扣376-摆动序列(java详细题解)

题目链接:https://leetcode.cn/problems/wiggle-subsequence/ 前情提要: 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法:局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优,并且…

最新时光邮局系统,给未来写封信系统PHP源码美化版

源码介绍 最新时光邮局系统,给未来写封信系统PHP源码美化版视频教程。 给未来写封信开源源码,本源码支持用户给未来某个人发送一封信。前端采用MDUI框架后端对于定时发信采用screenphp的方式,未来将会增加其稳定性,寄出的信是可以在数据库查…

绝区零苹果电脑能玩吗,如何在Mac上玩绝区零?绝区零MacBook 下载安装保姆级教程

《绝区零》是一款由米哈游开发的都市动作冒险游戏,游戏的故事背景设定在一个名为「新艾利都」的现代化大都市中,玩家将扮演一对「绳匠」兄妹展开冒险。很多玩家都在问苹果电脑笔记本Mac怎么玩绝区零,今天就给大家介绍一下《绝区零》是一款什么…

信息打点-CDN绕过篇漏洞回链接口探针全网扫描反向邮件

知识点: 0、CDN知识-工作原理及阻碍 1、CDN配置-域名&区域&类型 2、CDN绕过-靠谱十余种技战法 3、CDN绑定-HOSTS绑定指向访问 CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和…

小程序列表滚动加载下一页数据功能实现指南

在前端小程序开发中,列表页是用户交互的核心部分之一。为了提高用户体验和页面响应速度,实现列表的滚动加载(也称为“无限滚动”或“懒加载”)功能显得尤为重要。本篇文章将详细介绍如何在小程序中实现这一功能,并提供…

基于vue框架的畅饮水站业务管理系统0wf4k(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:员工,会员,矿泉水,订单信息,派送任务,派送进度,评价记录,空桶回收,员工考勤,员工工资 开题报告内容 基于Vue框架的畅饮水站业务管理系统开题报告 一、研究背景与意义 随着健康意识的不断提升,直饮水、纯净水等健康饮水方式…

关于Seata的AT模式以及XA模式的理解

AT 模式 (最终一致性)的特点是性能较高,因为它只在第一阶段获取锁,在第一阶段提交后释放锁。相比之下,XA 模式(强一致性)需要在整个事务过程中占用数据库锁,因此性能相对较低。但是&…

为什么在JDBC中使用PreparedStatement?

为什么在JDBC中使用PreparedStatement? 💖The Begin💖点点关注,收藏不迷路💖 在JDBC编程中,PreparedStatement 因其以下优势而备受推崇: 性能提升:预编译的SQL语句可快速执行&#…

【C++11及其特性】explicit关键字

explicit关键字目录 一.explicit的含义1.中文含义2.用法 二.显示构造和隐式构造1.源码2.显示构造---()3.隐式构造---4.加上关键字 三.explicit作用 一.explicit的含义 1.中文含义 2.用法 写在构造函数前,那么在创建对象时就只能显示构造了,默认情况下是显示构造和隐式构造都可…

ctfshow之web55~web57(无字母的rce)

目录 web55 思路一: 思路二: web56 web57 本系列主要针对无字母rce或无字母无数字rce 声明:本章内容是引荐几位师傅的博客,然后根据自己的理解编写而成。 web55 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\…

.net dataexcel winform控件 更新 日志

增加 列宽度调整时动态显示列象素大小 更改列的宽度可以使用 column.Width属性进行修改

文章解读与仿真程序复现思路——电网技术@EI\CSCD\北大核心《基于双缓冲区生成对抗模仿学习的电力系统实时安全约束经济调度》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

线段树维护更多类型的信息

P3870 [TJOI2009] 开关 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) sum维护一段区域的和&#xff1b;revers记录翻转懒信息&#xff1b; lazy&#xff1a;灯泡翻转后个数就是之前不亮的个数&#xff0c;revers变为原来的反 #include <iostream> using namespace s…

代码随想录第十九天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和,222. 完全二叉树的节点个数

110. 平衡二叉树 第一想法&#xff1a;首先要明确平衡二叉树的定义&#xff1f;左右节点的高度差不超过1&#xff1f;不会概念感觉无法下手... 返回参数返回int,为了标记已经不是平衡二叉树&#xff0c;用-1作标记 int traversal(TreeNode* root){if(rootnullptr) return 0;…

Linux_kernel烧写Uboot02

一、温故知新 1、开发环境 Ubuntu的Linux操作系统(18.04 20.04 22.04) 前面的版本号是双数&#xff0c;后面的版本号是04 lsb_release -a 用于查看系统版本号 uname -a 查看系统位数/内核版本号 2、体系架构 APP 各种控制界面\通…

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 B…

点餐收银小程序

一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《点餐收银小程序》。 系统含管理员/商家/用户三种角色&#xff0c;商家能维护菜式类别、维护菜品信息&#xff0c;用户在小程序能够选择门店&#xff0c;查看门店下各个分类的菜式信息&#xff0c;并进行加购…