【OpenCV实现平滑图像处理】

文章目录

    • 概要
    • 2D 卷积(图像过滤)
    • 模糊图像(平滑图像)
    • 中值模糊
    • 双边过滤
    • 小结

概要

在图像处理中,低通滤波器是一种常用的技术,用于平滑、模糊或降低图像的噪音。这种滤波器通过去除图像中高频部分(即变化较快的部分)来实现这些效果。通过应用2D卷积操作,低通滤波器将每个像素的值与其周围像素的值进行加权平均,从而实现图像的平滑处理。

在实际应用中,我们可以定制不同类型的低通滤波器,例如平均滤波器、高斯滤波器等,根据需求选择合适的滤波器。平均滤波器将像素的值替换为其周围像素值的平均值,从而消除图像中的高频噪音。而高斯滤波器则使用高斯函数生成一个权重矩阵,将像素值进行加权平均,使得距离中心像素越远的像素权重越小,实现更加自然的平滑效果。

定制的低通滤波器可以根据图像特性进行调整,例如在面对强烈噪音时增加滤波器的大小,或者根据图像中对象的大小调整滤波器的标准差。这种灵活性使得低通滤波器在图像处理中具有广泛的应用,例如在计算机视觉中的目标检测、图像识别、医学图像处理等领域。

2D 卷积(图像过滤)

使用各种低通滤波平滑图像
将定制的过滤器应用在图像上(2D卷积)

OpenCV提供了一个非常有用的函数,即cv.filter2D,该函数允许我们将一个图像和一个自定义的核(也称为滤波器)进行卷积操作。举个例子,如果我们想在一幅图像上尝试平均滤波,我们可以使用一个简单的平均核,该核中的所有元素值相等,代表了平均操作。通过使用cv.filter2D函数,我们可以将这个平均核应用到图像上,从而实现平均滤波的效果。

这种滤波技术不仅可以用于去除图像中的噪声,还可以在图像处理任务中发挥关键作用,比如在边缘检测、图像增强和特征提取等领域。
一个 5 X 5 的平均滤波核如下所示:

在这里插入图片描述
保持这个核在像素上面,将被这个核覆盖的25个像素点的值求平均值,然后将这个平均值替换掉最中间那个像素点的值。然后将这个操作应用在图像的所有像素点上。

# 导入必要的库
import numpy as np  # 用于数值计算
import cv2 as cv     # OpenCV库,用于图像处理
import matplotlib.pyplot as plt  # 用于绘图和可视化# 读取图像文件 'img.png'
img = cv.imread('img.png')# 定义一个 5x5 的平均滤波核
kernel = np.ones((5, 5), np.float32) / 25# 使用 cv2.filter2D 函数将图像与平均滤波核进行卷积
dst = cv.filter2D(img, -1, kernel)# 绘制原始图像、平均滤波后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122)  # 创建第二个子图
plt.imshow(dst)    # 显示平均滤波后的图像
plt.title('Averaging')  # 设置子图标题为 'Averaging'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.show()  # 显示绘制好的图像

在这里插入图片描述

模糊图像(平滑图像)

图像处理中,模糊(或称平滑)图像是一种常见的操作,可以通过低通滤波器与图像进行卷积来实现。这个技术非常有效地去除图像中的噪声,因为它能够消除高频内容,比如噪声和边缘。然而,需要注意的是,模糊操作也会稍微模糊图像的边缘,尽管有一些特殊的模糊技术可以保持边缘的清晰度。

  1. 平均
    这是通过将图像与归一化框滤波器进行卷积完成的。它简单的将核下面的像素值求平均并覆盖中间的像素值。这个可以使用函数cv.blur() 或者 cv.boxFilter() 来实现。我们应该指定内核的高度和宽度。一个 3 X 3 的归一化框滤波器如下所示:
    在这里插入图片描述
    Note: 如果你不想使用归一化框滤波器,那可以使用 cv.boxFilter。将 normalize=False 传入函数。
# 导入必要的库
import cv2 as cv  # OpenCV库,用于图像处理
import numpy as np  # 用于数值计算
from matplotlib import pyplot as plt  # 用于绘图和可视化# 读取图像文件 'img.png'
img = cv.imread('img.png')# 使用平均模糊(平滑)技术对图像进行处理,卷积核大小为 (5, 5)
blur = cv.blur(img, (5, 5))# 绘制原始图像和模糊处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示平均模糊后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.show()  # 显示绘制好的图像

在这里插入图片描述

2.高斯滤波(Gaussian Blur)
在高斯滤波中,我们使用高斯核替代了盒(框)滤波器。这种滤波方法已经被集成在OpenCV的cv.GaussianBlur()函数中。在使用高斯滤波时,我们需要确定核的高度和宽度,这两个数值需要是正数且奇数。此外,我们还需要指定X和Y方向上的标准差(sigma X和sigma Y)。如果只确定了sigma X,那么sigma Y的值会被设置为与sigma X相同。如果两者都为0,那么它们的值会根据核的大小自动计算。

高斯滤波在去除图像中的高斯噪声方面非常有效。高斯核的权重分布使得中心像素周围的像素对平均值的贡献更大,这样可以更好地保留图像的细节。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt# 读取图像文件 'img.png'
img = cv.imread('img.png')# 使用高斯滤波(核大小为 5x5,标准差为 0,表示自动计算)
blur = cv.GaussianBlur(img, (5, 5), 0)# 绘制原始图像和高斯滤波处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示高斯滤波后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.show()  # 显示绘制好的图像

在这里插入图片描述

中值模糊

中值模糊是一种特殊的滤波技术,它的原理是在核的覆盖区域内找到像素值的中间值,并将中间值赋给核中心的像素点。与其他滤波方法不同,中值滤波不是使用计算得到的新值替代中心像素,而是直接采用该区域内的中间值。

在OpenCV中,中值滤波可以通过cv.medianBlur()函数实现。与其他滤波方法类似,中值滤波的核的大小也应该是正数和奇数。这种滤波技术在处理图像中的椒盐噪声(图像中随机出现的亮或暗像素点)非常有效。因为它通过选择中间值,可以避免受到噪声的干扰。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt# 读取图像文件 'img.png'
img = cv.imread('img.png')# 使用中值模糊(核大小为 5x5)
blur = cv.medianBlur(img, 5)# 绘制原始图像和中值模糊处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示中值模糊后的图像
plt.title('Blurred')  # 设置子图标题为 'Blurred'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.show()  # 显示绘制好的图像

在这里插入图片描述

双边过滤

双边过滤在需要处理噪声但又需要保持图像边缘清晰的场景中非常有效。它的操作由cv.bilateralFilter()函数完成。相较于其他滤波器,这个操作相对较慢。我们已经了解到,高斯滤波器通过获取像素周围的邻域并计算其高斯加权平均值来进行操作。高斯滤波仅仅是一个空间函数,即在滤波时只考虑相邻像素的值。它不会检查像素值是否接近,也不会检查一个像素是否是边缘像素。因此,它可能会模糊掉一些我们希望保留的边缘细节。

双边滤波在空间上同样使用高斯滤波器,但还引入了一个像素强度差异的高斯滤波器。空间上的高斯函数确保只有附近的像素被用来进行模糊处理,而像素差异高斯函数确保只有与中心像素具有相似强度的像素被模糊处理。因此,它可以保持图像边缘的清晰度,因为边缘处的像素会有较大的强度变化,不容易被平滑掉。这种特性使得双边滤波在同时保持图像细节和去除噪声的需求下表现出色。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt# 读取图像文件 'img.png'
img = cv.imread('img.png')# 使用双边过滤(参数:d表示领域直径,sigmaColor表示颜色空间标准差,sigmaSpace表示坐标空间标准差)
blur = cv.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)# 绘制原始图像和双边过滤处理后的图像并显示
plt.subplot(121)  # 创建第一个子图
plt.imshow(img)    # 显示原始图像
plt.title('Original')  # 设置子图标题为 'Original'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.subplot(122)  # 创建第二个子图
plt.imshow(blur)   # 显示双边过滤后的图像
plt.title('Bilateral Filtered')  # 设置子图标题为 'Bilateral Filtered'
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴plt.show()  # 显示绘制好的图像

在这里插入图片描述

小结

总之,低通滤波器通过2D卷积操作,能够有效平滑图像、去除噪音、提高图像质量,为各种图像处理任务提供了重要支持。通过定制不同类型的滤波器,我们能够根据具体需求进行图像处理,获得更清晰、更有信息量的图像结果。

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

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

相关文章

Unity之ShaderGraph如何实现冰冻效果

前言 今天我们来实现一个冰冻的效果,非常的炫酷哦。 如下图所示: 主要节点 Voronoi:根据输入UV生成 Voronoi 或Worley噪声。Voronoi 噪声是通过计算像素和点阵之间的距离生成的。通过由输入角度偏移控制的伪随机数偏移这些点,可以生成细胞簇。这些单元的规模以及产生的…

垃圾回收系统小程序

在当今社会,废品回收不仅有利于环境保护,也有利于资源的再利用。随着互联网技术的发展,个人废品回收也可以通过小程序来实现。本文将介绍如何使用乔拓云网制作个人废品回收小程序。 1. 找一个合适的第三方制作平台/工具,比如乔拓云…

非侵入式负荷检测与分解:电力数据挖掘新视角

电力数据挖掘 概述案例背景分析目标分析过程数据准备数据探索缺失值处理 属性构造设备数据周波数据模型训练 性能度量推荐阅读 主页传送门:📀 传送 概述 摘要:本案例将根据已收集到的电力数据,深度挖掘各电力设备的电流、电压和功…

非小米笔记本小米妙享中心安装最新教程 3.2.0.464 兼容所有Windows系统

小米妙享中心 3.2.0.464 版本帮助 : 支持音频流转、屏幕镜像、屏幕拓展、键鼠拓展、无线耳机、小米互传 目录 小米妙享中心 3.2.0.464 版本帮助 : 1.常规教程使用安装包方式安装失败 或者 1.1安装失败可使用大佬的加载补丁方法解决 补充卸载残留 1.2 截图存档 2. 本教程…

App在哪里可以免费内测分发?

当ios开发者开发完成ios App后,往往要进入内测或公测阶段,需要进行分发,测试用户才能下载应用。 App分发平台是许多app开发类企业经常使用的平台,将主要开发的app上传到app分发平台上进行内测下载。很多开发者服务平台其实是提供…

PHP与mysql数据库交互

PHP与mysql数据库交互 文章目录 PHP与mysql数据库交互方法速查建立与Mysql链接捕获连接错误SQL语句的执行SQL 错误SQL语句执行结果集对象方法速查 案例 方法速查 函数名 作用 mysqli_connect() 与MySQL 数据库建立连接。 mysqli_close() 关闭与MYSQL 数据库建…

nodejs+vue 电子书阅读系统

本文首先介绍了电子书阅读系统的发展背景与发展现状,然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,随着网络技术的不断发展,多媒体技术应用渐渐的出现在教育领域中,电子书阅读已经成为社会的一个热…

【AICFD案例操作】汽车外气动分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

Ubuntu ARMv8编译Qt源码以及QtCreator

最近需要在NVIDIA小盒子上面跑一个程序,一开始想着在Ubuntu x64下交叉编译一版,后来发现libqxcb.so 这个库在configure时就会一直报错,多方查找怀疑可能是由于硬件不支持在x64环境下编译AMR架构的xcb库。 所以最后在ARM下直接编译Qt源码了&am…

华为数通方向HCIP-DataCom H12-831题库(多选题:81-100)

第81题 经典的网络转发方式是基于路由表转发。OpenFlow交换机的转发方式是基于流表转发。对于这两种转发方式,以下说法正确的有哪些选项? A、流表的匹配方式是同时匹配流量的MAC地址和IP地址。 B、路由表的匹配方式是匹配拥有最长掩码的目的网段路由 C、流表是变长的。一台网…

测试C#调用Vlc.DotNet组件播放视频

除了Windows Media Player组件,在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频,关于Vlc.DotNet的详细介绍见参考文献1,本文学习Vlc.DotNet的基本用法。   VS2022中新建基于.net core的winform程序,在Nuget包管理器中…

疫情物资管理系统-基于SSM实现

包括-源码参考文档 下载地址: https://juzhendongli.store/commodity/details/5

PDF编辑工具Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款全面、高效的PDF编辑和管理软件。它提供了丰富的PDF编辑功能,如创建、编辑、合并、分割、压缩、旋转、裁剪等,让用户可以轻松处理各种PDF文档。同时,该软件还具有智能的PDF处理技术,可以自动识别和修复P…

iPhone手机屏幕分辨率

ios app测试时,需要测试应用在不同型号的苹果手机上的表现形式,可以自己在浏览器上配置。 代数设备逻辑像素尺寸缩放发布时间第一代iPhone 2G320 x 480480 x 3203.5寸1x2007年6月29日第二代iPhone 3320 x 480480 x 3203.5寸1x2008年7月11日第三代iPhone …

微前端qiankun接入Vue和React项目

主应用:Vue3Webpack 1、创建主应用: npx vue create main-vue3-app 2、安装qiankun npx yarn add qiankun 3、项目中使用的vue、vue-router、qiankun依赖如下,webpack版本为5.x 4、在根目录下创建vue.config.js const { defineConfig }…

【第25例】IPD体系进阶:需求分析团队RAT

目录 简介 RAT CSDN学院相关内容推荐 作者简介 简介 RAT是英文Requirement Analysis Team英文首字母的简称,也即需求分析团队,每个产品线都需要设定对应的一个RAT的组织。 RAT主要负责产品领域内需求的分析活动,是RMT的支撑团队: 这个时候可以将RAT细化为PL-RAT团队,…

云原生架构设计理论与实践

云原生架构设计理论与实践 云原生架构概述 云原生的背景 云原生定义和特征 云原生架构的设计原则 架构模式 服务化架构模式 Mesh化架构模式 Serverless模式 存储计算分离模式 分布式事务模式 可观测架构 事件驱动架构 云原生架构相关技术 容器技术 云原生微服务技术 无服务…

MessageQueue 深入理解Android卷2 学习笔记

MessageQueue类封装了与消息队列有关的操作,一个以消息驱动的系统中,最重要部分就是消息队列和消息处理循环。 MessageQueue的核心代码在native层,可以处理java和native的事件 1.1MessageQueue创建 构造方法,调用nativeInit fra…

CVE-2021-44228 Apache log4j 远程命令执行漏洞

一、漏洞原理 log4j(log for java)是由Java编写的可靠、灵活的日志框架,是Apache旗下的一个开源项目,使用Log4j,我们更加方便的记录了日志信息,它不但能控制日志输出的目的地,也能控制日志输出的内容格式;…

CSDN学院 < 华为战略方法论进阶课 > 正式上线!

目录 你将收获 适用人群 课程内容 内容目录 CSDN学院 作者简介 你将收获 提升职场技能提升战略规划的能力实现多元化发展综合能力进阶 适用人群 主要适合公司中高层、创业者、产品经理、咨询顾问,以及致力于改变现状的学员。 课程内容 本期课程主要介绍华为…