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

news2024/10/6 10:41:32

文章结构

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

图像平滑处理

图像平滑处理是指在尽量保留原图像信息的情况下,去除掉图像内部的噪声(分布不均匀的、高亮度的像素点)。而用于图像平滑处理的工具就是滤波器。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 cv2

img = 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 cv2

img = 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 cv2

img = 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 cv2

img = 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.coloradmin.cn/o/963836.html

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

相关文章

Qt +VTK+Cmake 编译和环境配置(第一篇 采坑)

VTK下载地址&#xff1a;https://vtk.org/download/ cmake下载地址&#xff1a;https://cmake.org/download/ 版本对应方面&#xff0c;如果你的项目对版本没有要求&#xff0c;就不用在意。我就是自己随机搭建的&#xff0c;VTK选择最新版本吧&#xff0c;如果后面其他的库不…

HttPClient简介及示例:学习如何与Web服务器进行通信

文章目录 前言一、引入依赖二、使用步骤1.创建被调用者2.创建调用者三、结果被调用者服务&#xff1a;调用者服务&#xff1a; 总结 前言 欢迎来到本篇博客&#xff0c;这是一个关于HttPClient的入门案例的指南。&#x1f389; 在今天的网络世界中&#xff0c;与服务器进行数据…

数据挖掘导论学习笔记1(第1 、2章)

参考&#xff1a;https://blog.csdn.net/u013232035/article/details/48281659?spm1001.2014.3001.5506 和《数据挖掘导论》学习笔记&#xff08;第1-2章&#xff09;_时机性样本_schdut的博客-CSDN博客 第1章 绪论 数据挖掘是一种技术&#xff0c;它将传统的数据分析方法…

【LeetCode】剑指 Offer <二刷>(4)

目录 题目&#xff1a;剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 10- I. 斐波那契数列 - 力扣&am…

FFmpeg5.0源码阅读——FFmpeg大体框架(以GIF转码为示例)

摘要&#xff1a;前一段时间熟悉了下FFmpeg主流程源码实现&#xff0c;对FFmpeg的整体框架有了个大概的认识&#xff0c;因此在此做一个笔记&#xff0c;希望以比较容易理解的文字描述FFmpeg本身的结构&#xff0c;加深对FFmpeg的框架进行梳理加深理解&#xff0c;如果文章中有…

ROS机器人编程---------(二)ROS中的核心概念

ROS机器人编程 ROS中的核心概念 ROS的通信机制 在ROS中结点是最小单元&#xff0c;比如说机器人的遥控器可以作为一个控制结点&#xff0c;机器人上的摄像头也可以看作一个结点&#xff0c;ROS通过协调各个结点来实现 在启动任何ROS结点之前&#xff0c;都必须先启动ROS Mas…

【数据结构】 二叉树面试题讲解->贰

文章目录 &#x1f30f;引言&#x1f384;[二叉树遍历](https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId60&&tqId29483&rp1&ru/activity/oj&qru/ta/tsing-kaoyan/question-ranking)&#x1f431;‍&#x1f464;题目描述&#…

阿里云短信服务测试

测试时遇到下面的错误; {"Message":"测试专用签名和模板必须结合使用","RequestId":"59035729-FD2A-5618-A2BE-6CABD839B400","Code":"isv.SMS_TEST_SIGN_TEMPLATE_LIMIT"} 上网查了下才发现&#xff1a; 使用…

一些自己整理的工具实用参数

工具实用参数 sqlmap -u: 指定需要测试的目标URL&#xff08;格式&#xff1a;http://www.example.com/test.php?id1&#xff09; --cookie: 设置需要发送的 HTTP Cookie&#xff0c;例如&#xff1a;--cookie"sid123456;PHPSESSID654321" --threads&#xff1a;…

化学中的各种基团(羧基、酰胺、吡喃、联苯结构)

一、羧基 化学式–C(O)OH&#xff0c;是羧酸所具有的官能团。一般而言&#xff0c;羧基上的氢有较大的电离倾向&#xff0c;从而使羧酸在水溶液中显酸性。羧酸根负离子所具有共轭结构可以看作是氢易电离的潜在动力。 二、羟基 化学式&#xff0d;OH&#xff0c;是氧原子以共价…

nginx的配置文件

nginx的配置文件 一、nginx配置文件1.1、主配置文件详解1.2、子配置文件 二、修改启动程序的全局配置2.1、修改启动的工作进程数优化2.2、cpu与eorker process绑定优化2.3、PID路径优化2.4、修改工作进程的优先级 优化2.5、调试工作进程打开文件的文件个数2.5.1、基本原理2.5.2…

ac7260网卡不能连5g

之前路由器是双频&#xff0c;最近为了连物联网一堆&#xff0c;把双频拆成两个wifi 结果电脑上装的pdd网卡就罢工了&#xff0c;连4g可以&#xff0c;但是连5g网络就不行&#xff0c;连上却没网&#xff0c;导致网盘下东西慢。刚开始以为是tplink的易展问题&#xff0c;结果看…

Python Opencv实践 - 凸包检测(ConvexHull)

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/stars.png") plt.imshow(img[:,:,::-1])img_contour img.copy() #得到灰度图做Canny边缘检测 img_gray cv.cvtColor(img_contour, cv.COLOR_BGR2GRAY) edges…

Python将多个文件的名称或后缀名由大写字母修改为小写的方法

本文介绍基于Python语言&#xff0c;基于一个大文件夹&#xff0c;遍历其中的多个子文件夹&#xff0c;并对于每一个子文件夹中的大量文件&#xff0c;批量将其文件的名称或后缀名中的字母由大写修改为小写的方法。 本文期望实现的需求为&#xff1a;现有一个大文件夹&#xff…

netcat的使用

目录 netcat简介 nc的使用场景 nc实现通信 创建一个服务端 创建一个客户端 具体案例 环境 win10在具体路径下执行命令 win7在具体路径下执行命令 netcat文件传输 nc文件传输的利用 服务器等待接收文件 客户端向服务器发送文件 服务器向连接的客户端发送文件 客户…

内网隧道代理技术(二十)之 CS使用HTTP代理上线不出网机器

CS使用HTTP代理上线不出网机器 CS工具自带上线不出网机器 如图A区域存在一台中转机器,这台机器可以出网,这种是最常见的情况。我们在渗透测试的过程中经常是拿下一台边缘机器,其有多块网卡,边缘机器可以访问内网机器,内网机器都不出网。这种情况下拿这个边缘机器做中转,…

OpenSIPS 管理接口的对接

文章目录 1. 背景2. OpenSIPS 的 HTTP 管理接口对接2.1 脚本配置2.2 请求方式 1. 背景 OpenSIPS 是功能完善的开源 SIP 代理服务器&#xff0c;它在支持 SIP 代理的主要功能以外&#xff0c;也为使用者提供了一套 MI 管理接口。面向不同的通信方式&#xff0c;OpenSIPS 还提供…

训练简单的线性模型,预测电影评分和票房收入

文章目录 训练简单的线性模型&#xff0c;预测电影评分和票房收入数据集加载数据可视化数据分割数据集训练模型可视化结果应用模型保存和加载模型 训练简单的线性模型&#xff0c;预测电影评分和票房收入 这是一个简单的线性模型&#xff0c;用于预测电影的评分和票房收入。不…

Mysql 性能分析(慢日志、profiling、explain)、读写分离(主从架构)、分库分表(垂直分库、垂直分表、水平分表)

查看系统性能参数 一条sql查询语句在执行前&#xff0c;需要确定查询执行计划&#xff0c;如果存在多种执行计划的话&#xff0c;mysql会计算每个执行计划所需要的成本&#xff0c;从中选择 成本最小的一个作为最终执行的执行计划 想要查看某条sql语句的查询成本&#xff0c;可…

【LeetCode算法系列题解】第21~25题

CONTENTS LeetCode 21. 合并两个有序链表&#xff08;简单&#xff09;LeetCode 22. 括号生成&#xff08;中等&#xff09;LeetCode 23. 合并K个升序链表&#xff08;困难&#xff09;LeetCode 24. 两两交换链表中的节点&#xff08;中等&#xff09;LeetCode 25. K 个一组翻转…