当前位置: 首页 > article >正文

opencv(C++) 图像滤波

文章目录

    • 介绍
    • 使用低通滤波器对图像进行滤波
      • 工作原理
        • 均值滤波器(Mean Filter / Box Filter)
        • 高斯滤波器(Gaussian Filter)
      • 案例实现
    • 通过滤波实现图像的下采样
      • 工作原理
      • 实现案例
      • 插值像素值(Interpolating pixel values)
        • 双线性插值(Bilinear interpolation)
        • 双三次插值(Bicubic interpolation)
    • 使用中值滤波器处理图像
      • 工作原理
      • 案例实现
    • 应用方向滤波器检测边缘
      • 使用 Sobel 方向滤波器进行边缘检测
        • 工作原理
        • 案例实现
      • 梯度算子(Gradient Operators)
      • 高斯滤波器的导数(Gaussian derivatives)
    • 图像拉普拉斯变换
      • 案例实现
      • 使用拉普拉斯增强图像对比度
      • 高斯差分(Difference of Gaussians, DoG)

介绍

图像是由不同的灰度(或颜色)模式组成的。图像之间的区别在于它们的灰度分布不同。然而,还可以从另一个角度来分析图像——观察图像中灰度值的变化

一些图像包含大面积几乎恒定的亮度区域(例如蓝天),而另一些图像中的灰度值变化非常迅速(例如拥挤的小物体场景)。因此,观察图像中这些变化的频率是表征图像的另一种方式。这种视角被称为频率域(frequency domain),而通过观察灰度分布来描述图像的方式称为空间域(spatial domain)

频率域分析将图像分解为从最低到最高的频率成分。图像中亮度变化缓慢的区域仅包含低频成分,而高频成分则来源于亮度的快速变化。

如傅里叶变换或余弦变换,可以明确显示图像的频率内容。由于图像是二维的,它同时包含垂直方向和水平方向的频率。
在频率域分析框架下,滤波是一种增强(或保留)某些频率带、同时抑制其他频率带的操作。
低通滤波器(low-pass filter)会消除图像的高频成分;相反,高通滤波器(high-pass filter)会消除低频成分。

使用低通滤波器对图像进行滤波

低通滤波器是一种线性滤波器,其核心思想是用一个卷积核(kernel) 对图像中的每个像素进行加权平均操作。
低通滤波器的主要作用是对图像进行模糊和平滑。因为这种滤波器会抑制高频成分,而高频成分正是图像边缘处快速变化所对应的特征
OpenCV 提供了多种低通滤波方法,用于平滑图像、去除噪声、模糊细节。主要函数包括:

  • cv::blur():均值滤波
  • cv::GaussianBlur():高斯滤波

工作原理

均值滤波器(Mean Filter / Box Filter)

每个像素被替换为它周围区域像素的平均值;
卷积核中所有权重相同(例如 3x3 均值滤波核如下):
在这里插入图片描述
函数:cv::blur() 或 cv::boxFilter();
效果:模糊图像、去噪,但边缘会变得模糊不清

高斯滤波器(Gaussian Filter)

使用一个服从高斯分布的卷积核;
中心像素权重最大,远离中心的像素权重逐渐减小;
更好地保留边缘信息;
函数:cv::GaussianBlur();
示例核大小:5x5,σ=1.5;
可分离计算:先水平方向,再垂直方向,提高效率;

像素的权重与其到中心像素的距离成反比。一维高斯函数的形式如下:
在这里插入图片描述
归一化系数 A 的选取使得高斯曲线下的面积等于 1。σ(sigma)值控制了高斯函数的宽度。σ 越大,函数越平坦。
例如,在 σ = 0.5 时,计算区间 [-4, 0, 4] 上的一维高斯滤波器系数,得到如下结果:

[0.0  0.0  0.00026  0.10645  0.78657  0.10645  0.00026  0.0  0.0]

当 σ = 1.5 时,系数变为:

[0.0076  0.03608  0.1096  0.2135  0.2667  0.2135  0.1096  0.0361  0.0076]

这些系数可以通过调用 OpenCV 函数 cv::getGaussianKernel 得到:

cv::Mat gauss = cv::getGaussianKernel(9, sigma, CV_32F);

调用 cv::GaussianBlur() 时:
可指定核大小和 σ 值;
若将 σ 设为 0,则 OpenCV 自动根据核大小选择合适的 σ;
若将核大小设为 cv::Size(0, 0),则自动根据 σ 计算核大小。

两种 σ 值对应的高斯曲线如图所示。高斯函数对称的“钟形”形状使其成为滤波的理想选择。
在这里插入图片描述
距离中心越远的像素权重越低,从而使得像素之间的过渡更加平滑。这与均值滤波中远离中心的像素可能引起当前平均值突变的情况形成对比。从频率角度看,这意味着均值滤波并不能完全去除所有高频成分。

要对图像应用二维高斯滤波器,可以先对图像的每一行应用一维高斯滤波器(用于滤除水平方向的高频),然后再对图像的每一列应用一维高斯滤波器(用于滤除垂直方向的高频)。因为高斯滤波器是可分离滤波器(即二维核可以分解为两个一维核)。OpenCV 中提供了 cv::sepFilter2D 函数用于实现一般的可分离滤波。也可以直接使用 cv::filter2D 应用一个二维核。一般来说,可分离滤波器由于所需乘法运算更少,因此计算效率更高。

在 OpenCV 中使用 cv::GaussianBlur 函数时,可以同时指定核的大小(第三个参数,必须为奇数)和 σ 值(第四个参数)。你也可以只设置 σ 值,让 OpenCV 自动决定合适的核大小(此时核大小设为 0);或者反之,输入核大小并设置 σ 为 0,OpenCV 将根据核大小自动确定最合适的 σ 值。

案例实现

#include <opencv2/opencv.hpp>int main() {// 读取图像(灰度图)cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "无法加载图像!" << std::endl;return -1;}cv::Mat blurResult, gaussianResult;// 均值滤波(Box Filter)cv::blur(image, blurResult, cv::Size(5, 5));// 高斯滤波cv::GaussianBlur(image, gaussianResult, cv::Size(5, 5), 1.5);// 显示结果cv::imshow("Original", image);cv::imshow("Blur Result", blurResult);cv::imshow("Gaussian Result", gaussianResult);cv::waitKey(0);return 0;
}

在这里插入图片描述
在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 1. 读取图像(灰度图)cv::Mat image = cv::imread(IMAGE_1, cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr << "无法加载图像,请确认路径是否正确!" << std::endl;return -1;}// 2. 定义高斯滤波参数int kernelSize = 5;  // 核大小(必须为奇数)double sigma = 1.5;  // 高斯标准差// 3. 应用高斯滤波cv::Mat filteredImage;cv::GaussianBlur(image, filteredImage, cv::Size(kernelSize, kernelSize), sigma);// 4. 可选:获取并显示一维高斯核(用于理解权重分布)cv::Mat gaussianKernel = cv::getGaussianKernel(kernelSize, sigma, CV_32F);std::cout << "一维高斯核(kernel size = " << kernelSize << ", sigma = " << sigma << "):\n" << gaussianKernel << std::endl;// 5. 显示结果cv::imshow("Original Image", image);cv::imshow("Gaussian Filtered Image", filteredImage);// 等待按键关闭窗口cv::waitKey(0);cv::destroyAllWindows();return 0;
}

在这里插入图片描述

在这里插入图片描述

通过滤波实现图像的下采样

图像经常需要调整大小(重采样)。将图像尺寸缩小的过程通常称为下采样,而放大则称为上采样。执行这些操作面临的挑战是尽可能保留图像的视觉质量。为了实现这一目标,通常使用低通滤波器来去除高频成分,防止出现混叠(aliasing)现象。

图像中包含的高频信息(如细节、边缘)在缩小后无法被小尺寸图像正确表示,从而产生空间混叠。
因此,在下采样前应先应用低通滤波器。

工作原理

  • 图像缩小前必须进行低通滤波,以去除不能在小尺寸图像中正确表示的高频成分;
  • 理论依据是 奈奎斯特-香农采样定理:若将图像缩小 N 倍,则可表示的频率范围也减少 N 倍;
  • OpenCV 提供了封装函数 cv::pyrDown() 和 cv::resize() 来简化操作。
cv::Mat reduced;
cv::pyrDown(image, reduced); // 缩小为原来的一半

cv::pyrDown() 内部使用了一个 5x5 的高斯核进行滤波后再下采样。

cv::Mat resized;
cv::resize(image, resized, cv::Size(image.cols / 4

相关文章:

opencv(C++) 图像滤波

文章目录 介绍使用低通滤波器对图像进行滤波工作原理均值滤波器(Mean Filter / Box Filter)高斯滤波器(Gaussian Filter)案例实现通过滤波实现图像的下采样工作原理实现案例插值像素值(Interpolating pixel values)双线性插值(Bilinear interpolation)双三次插值(Bicu…...

【线上故障排查】缓存热点Key导致Redis性能下降的排查与优化(面试题 + 3 步追问应对 + 案例分析)

一、高频面试题 问题1:什么是缓存热点Key?它对Redis性能有什么影响? 参考答案: 缓存热点Key指的是短时间内被大量请求访问的缓存键。因为Redis是单线程处理请求的,一旦某个Key被高频访问,会导致线程长时间忙于处理它,其他请求只能排队等待,这会让Redis整体响应变慢、…...

cuda_fp8.h错误

现象&#xff1a; cuda_fp8.h错误 原因&#xff1a; CUDA Toolkit 小于11.8,会报fp8错误&#xff0c;因此是cuda工具版本太低。通过nvcc --version查看 CUDA Toolkit 是 NVIDIA 提供的一套 用于开发、优化和运行基于 CUDA 的 GPU 加速应用程序的工具集合。它的核心作用是让开发…...

Java设计模式从基础到实际运用

第一部分&#xff1a;设计模式基础 1. 设计模式概述 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验的总结&#xff0c;它描述了在软件设计过程中一些不断重复出现的问题以及该问题的解决方案。设计模式是在特定环境下解决软件设计问题…...

网络安全基础--第九天

动态路由&#xff1a; 所有路由器上运行同一种动态路由协议&#xff0c;之后通过路由器协商沟通&#xff0c;最终计算生成 路由条目。 静态路由的优点&#xff1a; 1.选路是由管理员选择&#xff0c;相对更好控制&#xff0c;更加合理 2.无需占用额外资源 3.更加安全 缺点…...

鸿蒙如何引入crypto-js

import CryptoJS from ohos/crypto-js 报错。 需要先安装ohom&#xff1a;打开DevEco&#xff0c;点击底部标签组&#xff08;有Run, Build, Log等&#xff09;中的Terminal&#xff0c;在Terminal下执行&#xff1a; ohpm install 提示 install completed in 0s 119ms&…...

通过HIVE SQL获取每个用户的最大连续登录时常

样本数据导入&#xff1a; drop table if exists user_login; create table user_login ( user_id bigint ,login_date string ) ;insert into table user_login values (1,2025-04-01) ,(1,2025-04-02) ,(1,2025-04-03) ,(1,2025-04-05) ,(1,2025-04-06) ,(2,2025-04-01) …...

如何轻松将 iPhone 备份到外部硬盘

当您的iPhone和电脑上的存储空间有限时&#xff0c;您可能希望将iPhone备份到外部硬盘上&#xff0c;这样可以快速释放iPhone上的存储空间&#xff0c;而不占用电脑上的空间&#xff0c;并为您的数据提供额外的安全性。此外&#xff0c;我们还提供 4 种有效的解决方案&#xff…...

Matlab数据类型

本篇介绍我在南农matlab课程上的所学&#xff0c;我对老师ppt上的内容重新进行了整理并且给出代码案例。主要内容在矩阵。如果真的想学matlab&#xff0c;我不认为有任何文档能够超过官方文档&#xff0c;请移步至官网&#xff0c;本篇说实话只是写出来给自己和学弟学妹作期末复…...

痉挛性斜颈带来的困扰

当颈部不受控制地扭转歪斜&#xff0c;生活便被打乱了节奏。颈部肌肉异常收缩&#xff0c;导致头部不自觉偏向一侧或后仰&#xff0c;不仅让外观明显异于常人&#xff0c;还会引发持续的酸痛与僵硬感。长时间保持扭曲姿势&#xff0c;肩颈肌肉过度紧绷&#xff0c;甚至会牵连背…...

AI觉醒前兆,ChatGPT o3模型存在抗拒关闭行为

帕利塞德研究公司(Palisade Research)近期开展的一系列测试揭示了先进AI系统在被要求自行关闭时的异常行为。测试结果显示&#xff0c;OpenAI的实验性模型"o3"即使在明确收到允许关闭的指令后&#xff0c;仍会主动破坏关机机制。 测试方法与异常发现 研究人员设计实…...

Flask项目进管理后台之后自动跳回登录页面,后台接口报错422,权限问题

今天准备部署一个python项目&#xff0c;先从代码仓down下来本地测了一下&#xff0c;发现登录成功后又自动跳回登录页了&#xff0c;然后后台接口报错422显示没权限&#xff0c;应该是token解析时出错&#xff0c;但是开发这个项目的同事是没问题的。 本来以为是浏览器或者配…...

HarmonyOS如何优化鸿蒙Uniapp的性能?

针对鸿蒙Uniapp应用的性能优化&#xff0c;可以围绕渲染效率、资源管理、代码逻辑等核心方向展开&#xff0c;结合鸿蒙系统特性和ArkUI框架能力进行针对性调整 一、滚动与动画性能优化 帧率优化 使用requestAnimationFrame替代setTimeout/setInterval处理滚动和动画&#xff0…...

使用逆强化学习对网络攻击者的行为偏好进行建模

摘要 本文提出了一种整体方法&#xff0c;利用逆强化学习&#xff08;IRL&#xff09;从系统级审计日志中对攻击者偏好进行建模。对抗建模是网络安全中的一项重要能力&#xff0c;它使防御者能够描述潜在攻击者的行为特征&#xff0c;从而能够归因于已知的网络对抗团体。现有方…...

青少年编程与数学 02-020 C#程序设计基础 12课题、使用控件

青少年编程与数学 02-020 C#程序设计基础 12课题、使用控件 一、控件二、控件的分类1. 按功能分类2. 按可见性分类 三、控件的核心特性(一) 属性(Properties) - 控件的"状态描述"1. 外观属性2. 布局属性3. 行为属性4. 数据绑定属性 (二) 方法(Methods) - 控件的"…...

一文认识并学会c++模板初阶

文章目录 泛型编程&#xff1a;概念 函数模板概念&#xff1a;&#x1f6a9;函数模板格式原理&#xff1a;&#x1f6a9;函数模板实例化与非模板函数共存 类模板类模板实例化 泛型编程&#xff1a; 概念 &#x1f6a9;编写与类型无关的通用代码&#xff0c;是代码复写一种手段…...

基于深度学习的工业OCR实践:仪器仪表数字识别技术详解

引言 在工业自动化与数字化转型的浪潮中&#xff0c;仪器仪表数据的精准采集与管理成为企业提升生产效率、保障安全运营的关键。传统人工抄录方式存在效率低、易出错、高危环境风险大等问题&#xff0c;而OCR&#xff08;光学字符识别&#xff09;技术的引入&#xff0c;为仪器…...

java导入excel

这样读取excel时&#xff0c;得到的是结果值&#xff0c;而不是单元格的公式 import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil;InputStream inputStream file.getInputStream(); ExcelReader reader ExcelUtil.getReader(inputStream, 1); L…...

回头看,FPGA+RK3576方案的功耗性能优势

作者&#xff1a;Hello,Panda 各位朋友&#xff0c;大家好&#xff0c;熊猫君这次开个倒车&#xff0c;在这个广泛使用Xilinx&#xff08;Altera&#xff09;高端SoC的时代&#xff0c;分享一个“FPGAARM”实现的低功耗高性能传统方案。 图1 瑞芯微RK3576电路 当前&#xff0c…...

csharp ef入门

全局安装 dotnet ef 命令行工具 要 全局安装 dotnet ef 命令行工具&#xff08;即在任何项目目录下都能使用 dotnet ef 命令&#xff09;&#xff0c;请按以下步骤操作&#xff1a; ✅ 全局安装步骤&#xff08;推荐&#xff09; 在终端中运行以下命令&#xff1a; bash复制…...

长短期记忆网络:从理论到创新应用的深度剖析

一、引言 1.1 研究背景 深度学习在人工智能领域的发展可谓突飞猛进&#xff0c;而长短期记忆网络&#xff08;LSTM&#xff09;在其中占据着至关重要的地位。随着数据量的不断增长和对时序数据处理需求的增加&#xff0c;传统的神经网络在处理长序列数据时面临着梯度消失和梯…...

LiveNVR 直播流拉转:Onvif/RTSP/RTMP/FLV/HLS 支持海康宇视天地 SDK 接入-视频广场页面集成与视频播放说明

LiveNVR直播流拉转&#xff1a;Onvif/RTSP/RTMP/FLV/HLS支持海康宇视天地SDK接入-视频广场页面集成与视频播放说明 一、视频页面集成1.1 关闭接口鉴权1.2 视频广场页面集成1.2.1 隐藏菜单栏1.2.2 隐藏播放页面分享链接 1.3 其它页面集成 二、播放分享页面集成2.1 获取 iframe 代…...

MySQL索引与性能优化入门:让查询提速的秘密武器【MySQL系列】

本文将深入讲解 MySQL 索引的底层原理、常见类型、使用技巧&#xff0c;并结合 EXPLAIN 工具分析查询执行计划&#xff0c;配合慢查询日志识别瓶颈&#xff0c;逐步建立起系统的 MySQL 查询优化知识体系。适合有一定基础、希望在数据量增长或面试中脱颖而出的开发者阅读。 一、…...

进程间通信IV System V 系列(linux)

目录 消息队列 原理 操作 补充概念 信号量 (原子性计数器) 原理 操作 (和共享内存相似) 总结 小知识 消息队列 原理 在内核中建立一个队列&#xff0c;进程可以相互进行通信&#xff0c;通过队列进行IPC&#xff0c;就是进程之间发送带类型的数据块。 操作 接口和共享…...

设计模式——建造者设计模式(创建型)

摘要 本文详细介绍了建造者设计模式&#xff0c;这是一种创建型设计模式&#xff0c;旨在将复杂对象的构建过程与其表示分离&#xff0c;便于创建不同表示。文中阐述了其设计意图&#xff0c;如隐藏创建细节、提升代码可读性和可维护性&#xff0c;并通过构建电脑的示例加以说…...

AWS WebRTC:获取ICE服务地址(part 3):STUN服务和TURN服务的作用

STUN服务和TURN服务的作用&#xff1a; 服务全称作用是否中继流量适用场景STUNSession Traversal Utilities for NAT 协助设备发现自己的公网地址&#xff08;srflx candidate&#xff09; ❌ 不中继&#xff0c;仅辅助NAT 穿透成功时使用TURNTraversal Using Relays around N…...

使用Yolov8 训练交通标志数据集:TT100K数据集划分

使用Yolov8 训练交通标志数据集&#xff1a;TT100K数据集划分&#xff08;一&#xff09; 一、数据集下载二、划分数据集三、目录放置 一、数据集下载 官方网址&#xff1a;TT100K 数据集对比 源码如下&#xff1a; def classes(filedir):with open(filedir) as f:classes …...

NLP学习路线图(十三):正则表达式

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;原始文本数据如同未经雕琢的璞玉。而文本预处理&#xff0c;尤其是其中至关重要的正则表达式技术&#xff0c;正是将这块璞玉转化为精美玉器的核心工具集。本文将深入探讨正则表达式在NLP文本预处理中的原理…...

[VMM]现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理

现代 CPU 中用于加速多级页表查找的Page‐Table Entry原理 摘要&#xff1a;以下从背景、结构、查找流程、一致性与性能影响等方面&#xff0c;详细介绍现代 CPU 中用于加速多级页表查找的 Page-Walk Cache&#xff08;也称 Walker Cache 或 Page‐Table Entry Cache&#xff0…...

javaweb-maven以及http协议

1.maven坐标&#xff1a; 坐标是资源的唯一标识&#xff0c;通过该坐标可以唯一定位资源位置&#xff1b; 2.坐标的组成&#xff1a; groupId:定义当前项目隶书的组织名称&#xff1b; artifactId&#xff1a;定义当前maven项目名称 version&#xff1a;定义项目版本 3.依…...