【OpenCV入门】第八部分——滤波器

文章结构

  • 图像平滑处理
  • 均值滤波器
  • 中值滤波器
  • 高斯滤波器
  • 双边滤波器
  • 拉普拉斯高通滤波器

图像平滑处理

图像平滑处理是指在尽量保留原图像信息的情况下,去除掉图像内部的噪声(分布不均匀的、高亮度的像素点)。而用于图像平滑处理的工具就是滤波器。OpenCV提供了种类丰富的滤波器,虽然每种滤波器的实现算法都不同,但每种滤波器都能完成图像平滑处理的操作。本文主要讲解其中的4中滤波器,分别是均值滤波器中值滤波器高斯滤波器双边滤波器

均值滤波器

噪声与周围像素的差别非常大,导致从视觉上就能看出噪声无法与周围像素组成可识别的图像信息,从而降低了整个图像的质量。如果图像中的噪声都是随机的纯黑像素或者纯白像素,这样的噪声也被称作“椒盐噪声”或“盐噪声”。

以一个像素为核心,核心周围像素可以组成一个 n 行 n 列(简称 n × n) 的矩阵,这样的矩阵结构在滤波操作中被称为“滤波核”。矩阵的行列数决定了滤波核的大小,例如图 9.4 所示的滤波核大小为 3x3,包含 9 个像素;图 9.5 所示的滤波核大小为 5x5,包含 25 个像素。

在这里插入图片描述
均值滤波器 (也被称为低通滤波器) 可以把图像中的每一个像素都当成滤波核的核心,然后计算出核内所有像素的平均值,最后让核心像素值等于这个平均值。

在这里插入图片描述

上图就是均值波的计算过程。滤波核大小为 3x3,核心像素值是 35,颜色极深,周围像素值都在 110~150之间,因此可以认为核心像素是噪声。将滤波核中的所有像素值相加,然后除以像素个数,就得出了平均值 123 (四舍五入取整)。将核心像素的值改成 123,其颜色就与周围颜色差别不大了,图像就变得平滑了。这就是均值滤波去噪的原理。

OpenCV将均值滤波器封装成了 blur()方法:

dst = cv2.blur(src, ksize, anchor, borderType)
  • src: 被处理的图像。
  • ksize: 滤波核大小,其格式为(高度,宽度),建议使用如(3,3)、(5,5)、(7,7)等宽高相等的奇数边长。滤波核越大,处理之后的图像就越模糊。
  • anchor: (可选)滤波核的锚点,建议采用默认值,方法可以自动计算锚点
  • borderType:(可选)边界样式,建议采用默认值
  • dst: 经过均值滤波处理之后的图像。

实例1: 对花朵图像进行均值滤波操作

import cv2img = cv2.imread("3.png")  # 读取原图
dst1 = cv2.blur(img, (3, 3))  # 使用大小为3*3的滤波核进行均值滤波
dst2 = cv2.blur(img, (5, 5))  # 使用大小为5*5的滤波核进行均值滤波
dst3 = cv2.blur(img, (9, 9))  # 使用大小为9*9的滤波核进行均值滤波
cv2.imshow("img", img)  # 显示原图
cv2.imshow("3*3", dst1)  # 显示滤波效果
cv2.imshow("5*5", dst2)
cv2.imshow("9*9", dst3)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:

在这里插入图片描述

中值滤波器

中值滤波器的原理与均值滤波器非常相似,唯一的不同就是不会计算像素的平均值,而是将所有像素值排序,把最中间的像素值取出,赋值给核心像素。

在这里插入图片描述

例如上图就是中值滤波的计算过程。滤波核大小为3×3,核心像素值是 35,周围像素值都在110~150之间。将核内所有像素值升序排序,9个像素值排成一队,最中间位置为第5个位置,这个位置的像素值为131。不需再做任何计算,直接把131赋值给核心像素,其颜色就与周围颜色差别不大了,图像就变得平滑了。这就是中值滤波去噪的原理。

OpenCV将中值滤波器封装成了medianBlur()方法:

dst = cv2.medianBlur(src, ksize)
  • src: 被处理的图像。
  • ksize: 滤波核的边长 (宽度),必须是大于1的奇数,例如3、5、7等。方法会根据此边长自动创建一个正方形的滤波核。中值滤波器的 ksize 参数是边长,而其他滤波器的 ksize 参数通常为(高,宽)。
  • dst: 经过中值滤波处理之后的图像

实例2: 对花朵图像进行中值滤波操作

import cv2img = cv2.imread("3.png")  # 读取原图
dst1 = cv2.medianBlur(img, 3)  # 使用宽度为3的滤波核进行中值滤波
dst2 = cv2.medianBlur(img, 5)  # 使用宽度为5的滤波核进行中值滤波
dst3 = cv2.medianBlur(img, 9)  # 使用宽度为9的滤波核进行中值滤波
cv2.imshow("img", img)  # 显示原图
cv2.imshow("3", dst1)  # 显示滤波效果
cv2.imshow("5", dst2)
cv2.imshow("9", dst3)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:
在这里插入图片描述
中值滤波处理的图像会比均值滤波处理的图像丢失更多细节。

高斯滤波器

高斯滤波也被称为高斯模糊、高斯平滑,是目前应用最广泛的平滑处理算法。高斯滤波可以很好地在降低图片噪声、细节层次的同时保留更多的图像信息,经过处理的图像会呈现“磨砂玻璃”的滤镜效果。

进行均值滤波处理时,核心周围每个像素的权重都是均等的,也就是每个像素都同样重要,所以计算平均值即可。但在高斯滤波中,越靠近核心的像素权重越大,越远离核心的像素权重越小。

高斯滤波的计算过程涉及到卷积运算,会有一个与滤波核大小相等的卷积核。本文不会深入介绍高斯函数以及高斯核的计算方式,仅以 3x3 的滤波核为例,简单地描述一下高斯滤波的计算过程。

卷积核中保存的值就是核所覆盖区域的权重值,其遵循图 9.16 的规律。卷积核中所有权重值相加的结果为 1。例如,3x3 的卷积核可以是如图 9.17 所示的值。随着核大小、标准差的变化,卷积核中的值也会发生较大变化,图 9.17 仅是一种最简单的情况。

在这里插入图片描述
进行高斯滤波的过程中,滤波核中像素会与卷积核进行卷积计算,最后将计算结果赋值给滤波核的核心像素。其计算过程如下所示:

在这里插入图片描述
在上图的计算过程中,滤波核中的每个像素值都会与卷积核对应位置的权重值相乘最后计算出9个值,让这9个值相加,再四舍五入取整,就得到了高斯滤波的计算结果。

OpenCV将高斯滤波器封装成了GaussianBlur()方法:

dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
  • src: 被处理的图像
  • ksize: 滤波核的大小,宽高必须是奇数,例如(3,3)、(5,5) 等,
  • sigmaX: 卷积核水平方向的标准差。
  • sigmaY: 卷积核垂直方向的标准差。修改 sigmaX 或 sigmaY 的值都可以改变卷积材中的权重比例。如果不知道如何设计这两个参数值,就直接把这两个参数的值写成 0,方法就会根据滤波核的大小自动计算出合适的权重比例。
  • borderType:(可选)边界样式,建议使用默认值。
  • dst: 经过高斯滤波处理之后的图像。

实例3: 对花朵图像进行高斯滤波

import cv2img = cv2.imread("3.png") # 读取原图
dst1 = cv2.GaussianBlur(img, (5, 5), 0, 0) # 使用大小为5*5的滤波核进行高斯滤波
dst2 = cv2.GaussianBlur(img, (9, 9), 0, 0) # 使用大小为9*9的滤波核进行高斯滤波
dst3 = cv2.GaussianBlur(img, (15, 15), 0, 0) # 使用大小为15*15的滤波核进行高斯滤波
cv2.imshow("img", img) # 显示原图
cv2.imshow("5", dst1) # 显示滤波效果
cv2.imshow("9", dst2)
cv2.imshow("15", dst3)
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体

结果如下:

在这里插入图片描述

双边滤波器

不管是均值滤波、中值滤波还是高斯滤波,都会使整幅图像变得平滑,图像中的边界会变得模糊不清。双边滤波是一种在平滑处理过程中可以有效保护边界信息的滤波操作。

双边滤波器会自动判断滤波核处于“平坦”区域还是“边缘”区域:如果滤波核处于“平坦”区域,则会使用类似高斯滤波的算法进行滤波;如果滤波核处于“边缘”区域,则加大“边缘”像素的权重,尽可能地让这些像素值保持不变。

例如 ,图9.23是一幅黑白拼接图像,对这个图像进行高斯滤波,黑白交界处就会变得模糊不清,效果如图9.24所示;但如果对这幅图像进行双边滤波,黑白交界处的边界则可以很好地保留下来,效果如图9.25所示。

在这里插入图片描述
OpenCV将双边滤波器封装成了 bilateralFilter() 方法

dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
  • src: 被处理的图像。
  • d: 以当前像素为中心的整个滤波区域的直径。如果是 d<0,则自动根据 sigmaSpace 参数计算得到。该值与保留的边缘信息数量成正比,与方法运行效率成反比。
  • sigmaColor: 参与计算的颜色范围,这个值是像素颜色值与周围颜色值的最大差值只有颜色值之差小于这个值时,周围的像素才会进行滤波计算。值为 255 时,表示所有色都参与计算。
  • sigmaSpace: 坐标空间的σ (sigma) 值,该值越大,参与计算的像素数量就越多
  • borderType:(可选)边界样式,建议默认。
  • dst: 经过双边滤波处理之后的图像。

实例4: 对一幅人脸图像进行”磨皮“

import cv2img = cv2.imread("girl.png")  # 读取原图
# 双边滤波,选取范围直径为7,颜色差为120
dst2 = cv2.bilateralFilter(img, 7, 120, 100)
cv2.imshow("img", img)  # 显示原图
cv2.imshow("bilateral", dst2)  # 显示双边滤波效果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

结果如下:

在这里插入图片描述

拉普拉斯高通滤波器

锐化又可以称作锐化滤镜,可以加深图像的边缘细节,以达到略微提高图像清晰度的目的,还能让图像中某些色彩更加鲜明。拉普拉斯高通滤波器就是实现锐化效果的一种关键技术。拉普拉斯高通滤波器使用的滤波核如下图所示:

在这里插入图片描述
使用这个核进行滤波计算 (同卷积计算) 后,中间的像素值会先乘以5再减去其上、下、左、右四个相邻的像素值。如果中心像素值与四周像素值差别很大,算法就会加深这种差别。从视觉上看,处理之后的图像边缘会呈现出明显的颗粒化。

OpenCV 把拉普拉斯高通滤波器封装成了 filter2D()方法

dst = cv2.filter2D(src, ddepth, kernel, anchor=None, delta=None, borderType=None)
  • src: 原始图像。
  • ddepth: 输出的图像深度
  • kernel: 滤波核。
  • anchor:(可选)核的锚点位置,默认为核的中心
  • delta:(可选)亮度,默认值为 0。
  • borderType:(可选)边界样式。
  • dst: 输出的图像。

实例5: 锐化图像

import cv2
import numpy as np# 拉普拉斯高通滤波的滤波核
def laplacian(img):# Laplacian高通滤波算子,5*中间像素值 - 上下左右四个像素值,让像素的梯度越来越大kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]])dst = cv2.filter2D(img, cv2.CV_32F, kernel)  # 滤波dst = cv2.convertScaleAbs(dst)  # 取绝对值return dst# 加载图像
img = cv2.imread('pluto.jpg')
cv2.imshow('Original Image', img)dst1 = laplacian(img)
cv2.imshow('Laplace', dst1)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:

在这里插入图片描述

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

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

相关文章

HarmonyOS—使用Web组件加载页面

页面加载是 Web 组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载 HTML 格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 加载网络…

人工智能轨道交通行业周刊-第58期(2023.8.28-9.3)

本期关键词&#xff1a;成都智慧工厂、机务段、站台地标、备案大模型、AIGC报告 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路…

论文浅尝 | 利用对抗攻击策略缓解预训练语言模型中的命名实体情感偏差问题...

笔记整理&#xff1a;田家琛&#xff0c;天津大学博士&#xff0c;研究方向为文本分类 链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/26599 动机 近年来&#xff0c;随着预训练语言模型&#xff08;PLMs&#xff09;在情感分类领域的广泛应用&#xff0c…

SpringBoot 使用MyBatis分页插件实现分页功能

SpringBoot 使用MyBatis分页插件实现分页功能 1、集成pagehelper2、配置pagehelper3、编写代码4、分页效果 案例地址&#xff1a; https://gitee.com/vinci99/paging-pagehelper-demo/tree/master 1、集成pagehelper <!-- 集成pagehelper --> <dependency><gr…

【SQL】关系模型与查询和更新数据

一、关系模型 1.1 主键 主键是关系表中记录的唯一标识。主键的选取非常重要&#xff1a;主键不要带有业务含义&#xff0c;而应该使用BIGINT自增或者GUID类型。主键也不应该允许NULL。 可以使用多个列作为联合主键&#xff0c;但联合主键并不常用。 1.2 外键 FOREIGN KEY …

mall :hutool项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Hutool工具类库2.1 Hutool 简介 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置 3.2 核心工具类3.2.1 AnnotationUtil使用&#xff1a;注解工具类3.2.2 BeanUtil使用&#xff1a;JavaBean的工具类3.2…

记本地新建一个gradle方式springboot项目过程

打算使用gradle在idea新建个springboot项目&#xff0c;然后坑很多&#xff0c;记录一下 原来我的idea应该是社区版&#xff0c;新建项目时候没有可以选择spring相关配置&#xff0c;然后卸载了重装&#xff0c;之前问题是启动是启动起来了&#xff0c;但是状态栏那边一直显示…

Matlab(画图初阶)

目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 ​编辑 4. legend() 5.X 、Y and Title&#xff1f; 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …

设计模式--代理模式

笔记来源&#xff1a;尚硅谷Java设计模式&#xff08;图解框架源码剖析&#xff09; 代理模式 1、代理模式的基本介绍 1&#xff09;代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象2&#xff09;这样做的好处是…

在抖音中使用语聚AI,实现自动回复用户视频评论、私信问答

您可以通过集简云数据流程&#xff0c;将语聚AI助手集成到抖音视频评论、抖音私信&#xff0c;实现自动回复用户视频评论、私信问答&#xff0c;大大提升账号互动与运营效率。 效果如下&#xff1a; 自动化流程&#xff1a; ● 抖音普通号评论对接语聚AI&#xff08;点击可一…

C#2010 .NET4 解析 json 字符串

下载Newtonsoft.Json.dll using System; using System.Collections.Generic; using System.Linq; using System.Text;using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; namespace ConsoleApplication1 {class Program{static void Main(string[] args){strin…

Apple Configurator iphone ipad 设备管控 描述文件使用方法

一、准备 App Store 下载安装 Apple Configurator 二、Apple Configurator 注册组织&#xff0c; -----------这个组织可以是个人&#xff0c;或者其它组织导出-------再导入进来&#xff1a; 三、描述文件配置&#xff1a;“” 根据管控需求进行配置 “” 四、使用 Ap…

Socket交互的基本流程?

TCP socket通信过程图 什么是网络编程&#xff0c;网络编程就是编写程序使两台连联网的计算机相互交换数据。怎么交换数据呢&#xff1f;操作系统提供了“套接字”&#xff08;socket&#xff09;的组件我们基于这个组件进行网络通信开发。tcp套接字工作流程都以“打电话”来生…

面试中的商业思维:如何展示你对业务的理解

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

解读亚马逊云科技语义搜图检索方案

图像检索&#xff08;包括文搜图和图搜图&#xff09;是各个行业中常见的一个应用场景。比如在电商场景中&#xff0c;基于以图搜图做相似商品查找&#xff1b;在云相册场景中&#xff0c;基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式&#xff0c;即先使用目标…

解决FreeRTOS程序跑不起来,打印调试却提示“Error:..\FreeRTOS\port\RVDS\ARM_CM3\port.c,244“的方法

前言 今天来分享一个不会造成程序编译报错&#xff0c;但会使程序一直跑不起来&#xff0c;并且通过调试会发现有输出错误提示的错误例子分析&#xff0c;话不多说&#xff0c;我们就直接开始分析~ 首先&#xff0c;我们说过这个例子在编译时候没有明示的错误提示&#xff0c…

【C++习题集】-- 顺序表、链表

&#xff08;用于复习&#xff09; 目录 线性表 顺序表 链表 单链表 单向 \ 双向 带哨兵位 \ 不带哨兵位 循环 \ 非循环 无头单向非循环链表实现 oj题 203. 移除链表元素 206. 反转链表 快慢指针 141.环形链表 【解题思路】 带头双向循环链表 顺序表和链表的区…

【计算机网络】HTTP

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

如何将两个pdf合并成一个?pdf合并技巧分享

在日常工作过程当中&#xff0c;我们经常需要处理一些文件&#xff0c;而文件的处理往往是琐碎的&#xff0c;想要提高工作效率&#xff0c;需要选择一些合适的方法&#xff0c;并掌握一定的技巧&#xff0c;那么&#xff0c;如何将两个pdf合并成一个?pdf合并技巧有哪些呢?接…

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner&#xff0c;重写getPartiti…