文章目录

    • 介绍
    • 使用低通滤波器对图像进行滤波
      • 工作原理
        • 均值滤波器(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

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

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

相关文章

图论学习笔记 4 - 仙人掌图

先扔张图&#xff1a; 为了提前了解我们采用的方法&#xff0c;请先阅读《图论学习笔记 3》。 仙人掌图的定义&#xff1a;一个连通图&#xff0c;且每条边只出现在至多一个环中。 这个图就是仙人掌图。 这个图也是仙人掌图。 而这个图就不是仙人掌图了。 很容易发现&#xf…

华为OD机试真题——洞穴探险(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

Java设计模式之职责链模式详解

Java设计模式之职责链模式详解 一、职责链模式核心思想 核心目标&#xff1a;将请求的发送者与接收者解耦&#xff0c;使多个对象都有机会处理请求。这些处理者形成链式结构&#xff0c;请求沿链传递直到被处理或到达链尾&#xff0c;如政府审批层层上报机制。 二、职责链模式…

解决WPF短暂的白色闪烁(白色闪屏)

在 WPF 应用程序启动时出现 短暂的白色闪烁&#xff08;白色闪屏&#xff09;&#xff0c;通常是由于以下原因导致的&#xff1a; 主要原因 WPF 默认窗口背景是白色&#xff0c;在加载 UI 之前会短暂显示白色背景。 解决方案 设置窗口背景为透明或黑色&#xff08;推荐&…

《Python基础》第1期:人生苦短,我用Python

介绍 Python 在英语中是蟒蛇的意思&#xff0c;它的 logo 也是两条蟒蛇缠绕在一起。 然而 Python 和蟒蛇实际上没有半点关系。 Python 是由荷兰程序员 Guido van Rossum&#xff08;因为其名字的前三个字母“gui”是中文“龟”的拼音&#xff0c;所以江湖人称“龟叔”&#x…

DiT、 U-Net 与自回归模型的优势

DiT 相对于 U-Net 的优势 全局自注意力 vs. 局部卷积 U-Net 依赖卷积和池化/上采样来逐层扩大感受野&#xff0c;捕捉全局信息需要堆叠很多层或借助跳跃连接&#xff08;skip connections&#xff09;。DiT 在每个分辨率阶段都用 Transformer 模块&#xff08;多头自注意力 ML…

怎么查找idea插件的下载位置,并更改

长期使用 IntelliJ IDEA 时&#xff0c;默认存储在 C 盘的配置文件会持续生成大量缓存和日志文件&#xff0c;可能导致系统盘空间不足。通过修改默认配置文件存储位置&#xff0c;可以有效释放 C 盘空间并提升系统性能。 1&#xff0c;先找到自己idea的下载目录&#xff0c;再打…

IoT/HCIP实验-1/物联网开发平台实验Part2(HCIP-IoT实验手册版)

文章目录 概述产品和设备实例的产品和设备产品和设备的关联单个产品有多个设备为产品创建多个设备产品模型和物模型设备影子&#xff08;远程代理&#xff09; 新建产品模型定义编解码插件开发编解码插件工作原理消息类型与二进制码流添加消息&#xff08;数据上报消息&#xf…

15.进程间通信(一)

一、进程间通信介绍 进程间通信目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xf…

05-jenkins学习之旅-vue前项目部署实践

1、创建被管理项目 2、构建流程说明 jenkins其实就是将服务部署拆分成了&#xff1a; 1、拉取代码(git) 2、打包编译(npm install) 3、自定义脚本(dist复制、执行启动脚本) 4、部署成功后的一些通知等 3、demo配置 3.1、General 3.2 源码管理 添加用户名密码方式如下图 3.2…

服务器中分布式存储数据技术都包含哪些内容?

随着大数据时代的到来&#xff0c;企业和组织对于服务器的存储要求也在不断地增高&#xff0c;传统的存储架构已经无法满足一些大规模的数据存储和处理需求&#xff0c;分布式存储技术应运而生&#xff0c;成为了大数据存储的重要基础设施&#xff0c;下面&#xff0c;就来介绍…

从比分滚动到数据革命:体育数据如何重构我们的观赛体验?

当凌晨三点的欧冠决赛与闹钟冲突时&#xff0c;当世界杯小组赛因时差难以全程跟进时&#xff0c;当代体育迷早已不再依赖电视直播 —— 打开手机里的比分网&#xff0c;实时跳动的体育大数据正构建着全新的观赛宇宙。这些曾经被视为 "辅助工具" 的平台&#xff0c;如…

vue2使用element中多选组件el-checkbox-group,数据与UI更新不同步

问题描述 使用element多选checkbox组件&#xff0c;点击勾选取消勾选&#xff0c;视图未变化&#xff0c;再次点击表单其他元素&#xff0c;多选组件勾选状态发生变化&#xff0c;视图和数据未同步 第一次尝试&#xff1a;再el-checkbox-group多选父组件上增加点击事件&…

CodeTop之LRU缓存

题目链接 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 我们使用双向链表哈希表的形式来模拟缓存机制 首先我们要自己实现一个双链表, 自己写一个内部类, 这个内部类记录了key,value,prev,next(前驱和后继), 后续我们就通过这个内部类来构造双…

PyQt学习系列11-综合项目:多语言文件管理器

PyQt学习系列笔记&#xff08;Python Qt框架&#xff09; 第十一课&#xff1a;综合项目 - 多语言文件管理器 &#xff08;原课程规划中的第十五课&#xff0c;按用户要求调整为第十一课&#xff09; 课程目标 综合运用PyQt框架开发一个支持多语言的文件管理器实现以下核心功…

【Ubuntu修改串口延时(Latency Timer)为1毫秒(设备拔插或系统重启后自动生效)】

Ubuntu修改串口延时Latency Timer为1毫秒-设备拔插或系统重启后自动生效 在Ubuntu系统中&#xff0c;串口设备的延时参数(latency_timer)可以通过udev规则永久修改。以下是完整步骤&#xff1a; 创建udev规则文件 sudo vim /etc/udev/rules.d/99-ftdi-low-latency.rules添加以…

OpenCV CUDA模块图像处理------颜色空间处理之GPU 上交换图像的通道顺序函数swapChannels()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上交换图像的通道顺序&#xff08;例如将 BGR 图像转为 RGB&#xff09;。 它适用于多通道图像&#xff08;如 3 通道或 4 通道…

Linux Ubuntu24.04配置安装MySQL8.4.5高可用集群主从复制!

MySQL 主从复制&#xff08;Replication&#xff09;是实现数据高可用、读写分离及异地容灾的核心机制之一。主库写、从库读&#xff0c;提升并发能力&#xff1b;读写分离&#xff0c;减轻主库压力。 本地 windows 系统有一个Linux Ubuntu子系统&#xff0c;版本为Ubuntu 24.…

R基于逻辑回归模型实现心脏病检测及SHAP值解释项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 心血管疾病是全球范围内导致死亡的主要原因之一&#xff0c;每年有数百万人因此失去生命。在众多的…

嵌入式学习笔记 -函数嵌套时以及异常响应时,LR使用的具体过程

函数嵌套时以及异常响应时&#xff0c;寄存器LR的作用存在显著区别&#xff0c;理解这个问题对于理解freeRTOS底层代码的实现大有帮助&#xff0c;具体使用过程如下&#xff1a; 一 函数嵌套时的LR使用的具体过程 在ARM架构(特别是M0处理器)中&#xff0c;函数嵌套调用时LR(L…