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

6.8方框滤波

基本概念

方框滤波(Box Filter)是一种基本的图像处理技术,用于对图像进行平滑处理模糊效果。它通过在图像上应用一个固定大小的方框核(通常是矩形),计算该区域内像素值的平均值来替换中心像素的值。这种方式简单且计算效率高,但在处理边界时需要特别注意。

方框滤波(Box Filter)是一种简单的线性滤波器,它可以用于平滑图像或降低噪声。方框滤波器使用一个均匀加权的矩形核来对图像进行卷积,从而实现图像的平滑处理。在OpenCV中,方框滤波可以使用 boxFilter 函数来实现。

函数原型
在OpenCV中,方框滤波可以通过boxFilter函数实现。函数原型如下:

void boxFilter(InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), bool normalize=true, int borderType=BORDER_DEFAULT);
参数说明
src: 输入图像,可以是单通道或多通道图像。
dst: 输出图像,将具有与输入图像相同的尺寸,但深度取决于ddepth参数。
ddepth: 输出图像的深度。常见的选择有:-1: 输出图像深度与输入图像相同。CV_8U: 8位无符号整数。CV_16S: 16位有符号整数。CV_32F: 32位浮点数。CV_64F: 64位浮点数。
ksize: 方框核的大小,指定为一个Size对象,例如Size(3, 3)。
anchor: 核的锚点位置,默认为Point(-1,-1),表示锚点在核的中心。
normalize: 是否归一化。如果设置为true(默认值),则输出的每个像素将是核内所有像素值的平均值;如果设置为false,则输出的每个像素将是核内所有像素值的总和。
borderType: 边界处理类型。常见的边界处理方式有:BORDER_CONSTANT: 使用常数值填充边界外区域。BORDER_REPLICATE: 复制边界像素。BORDER_REFLECT: 镜像反射边界。BORDER_WRAP: 边界环绕(类似于纹理坐标)。BORDER_REFLECT_101 或 BORDER_DEFAULT: 默认的边界反射方式。

使用示例1

下面是一个详细的示例,展示如何使用boxFilter函数来进行图像平滑处理。

步骤一:包含必要的头文件
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;步骤二:加载图像
int main(int argc, char** argv)
{Mat src = imread("path_to_your_image.jpg", IMREAD_COLOR);if (src.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}步骤三:定义输出图像Mat dst;步骤四:应用方框滤波// 设置方框核的大小Size ksize(5, 5);  // 5x5的核// 应用方框滤波boxFilter(src, dst, -1, ksize, Point(-1,-1), true);
在这里,-1表示输出图像的深度与输入图像相同。true表示启用归一化,即输出的每个像素值将是核内所有像素值的平均值。步骤五:显示结果namedWindow("Original Image", WINDOW_AUTOSIZE);imshow("Original Image", src);namedWindow("Blurred Image", WINDOW_AUTOSIZE);imshow("Blurred Image", dst);waitKey(0);return 0;
}注意事项
归一化: 如果normalize参数设置为true,则输出图像中的每个像素值将是核内所有像素值的平均值。如果设置为false,则输出图像中的每个像素值将是核内所有像素值的总和。在某些情况下,不归一化的结果可能会导致像素值溢出。
边界处理: 方框滤波在处理图像边界时可能会出现问题,特别是当核的大小超过边界时。选择适当的边界处理方式可以帮助解决这些问题。
性能: 方框滤波是一种简单快速的滤波方法,但由于它在每个像素上都执行了累加操作,因此在处理大尺寸核时可能会消耗较多资源。对于大型核,可以考虑使用积分图(integral image)来加速计算。通过上述步骤,你可以使用OpenCV的boxFilter函数来对图像进行平滑处理或实现模糊效果。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;int main(int argc, char** argv)
{Mat src = imread("880.jpeg", IMREAD_COLOR);if (src.empty()){cout << "Error: Image cannot be loaded!" << endl;return -1;}Mat dst;// 设置方框核的大小Size ksize(5, 5);  // 5x5的核// 应用方框滤波boxFilter(src, dst, -1, ksize, Point(-1, -1), true);namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", src);namedWindow("Blurred Image", WINDOW_NORMAL);imshow("Blurred Image", dst);waitKey(0);return 0;
}注意事项
归一化: 如果normalize参数设置为true,则输出图像中的每个像素值将是核内所有像素值的平均值。如果设置为false,则输出图像中的每个像素值将是核内所有像素值的总和。在某些情况下,不归一化的结果可能会导致像素值溢出。
边界处理: 方框滤波在处理图像边界时可能会出现问题,特别是当核的大小超过边界时。选择适当的边界处理方式可以帮助解决这些问题。
性能: 方框滤波是一种简单快速的滤波方法,但由于它在每个像素上都执行了累加操作,因此在处理大尺寸核时可能会消耗较多资源。对于大型核,可以考虑使用积分图(integral image)来加速计算。通过上述步骤,你可以使用OpenCV的boxFilter函数来对图像进行平滑处理或实现模糊效果。

运行结果1

示例代码2

示例代码下面是一个使用OpenCV C++实现方框滤波的示例代码:#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void applyBoxFilter(const Mat &src, Mat &dst, Size ksize, bool normalize) 
{boxFilter(src, dst, -1, ksize, Point(-1, -1), normalize);
}int main(int argc, char** argv) 
{/*if (argc != 2) {cout << "Usage: ./BoxFilter <Image Path>" << endl;return -1;}*/// 加载图像Mat img = imread("559.jpg", IMREAD_GRAYSCALE);if (!img.data) {cout << "Error opening image" << endl;return -1;}// 定义核大小Size ksize(5, 5);  // 核大小// 初始化输出矩阵Mat filtered;// 应用方框滤波applyBoxFilter(img, filtered, ksize, true);// 显示结果namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", img);namedWindow("Filtered Image", WINDOW_NORMAL);imshow("Filtered Image", filtered);waitKey(0);destroyAllWindows();return 0;
}代码解释
1. 加载图像:使用 imread 函数加载图像。
2. 定义核大小:设置方框滤波器的核大小。
3. 初始化输出矩阵:创建一个新的矩阵来存储滤波后的图像。
4. 应用方框滤波:使用 boxFilter 函数应用方框滤波。
5. 显示结果:使用 imshow 函数显示原始图像和滤波后的图像。

运行结果2

方框滤波的应用

方框滤波器常用于以下场景:

•图像平滑:通过平均相邻像素值来减少图像中的噪声。

•均值滤波:当 normalize 参数为 true 时,方框滤波器相当于均值滤波器。

•非归一化的方框滤波:当 normalize 参数为 false 时,可以用于特殊的图像处理任务,例如累积求和。

非归一化的方框滤波示例

非归一化的方框滤波不将权重归一化,这意味着每个像素的权重保持不变。这在某些特殊情况下是有用的,例如累积求和(Integral Images)。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;void applyNonNormalizedBoxFilter(const Mat &src, Mat &dst, Size ksize)
{boxFilter(src, dst, -1, ksize, Point(-1, -1), false);
}int main(int argc, char** argv)
{//if (argc != 2)//{//	cout << "Usage: ./NonNormalizedBoxFilter <Image Path>" << endl;//	return -1;//}// 加载图像Mat img = imread("559.jpg", IMREAD_GRAYSCALE);if (!img.data){cout << "Error opening image" << endl;return -1;}// 定义核大小Size ksize(5, 5);  // 核大小// 初始化输出矩阵Mat filtered;// 应用非归一化的方框滤波applyNonNormalizedBoxFilter(img, filtered, ksize);// 显示结果namedWindow("Original Image", WINDOW_NORMAL);imshow("Original Image", img);namedWindow("Non-Normalized Filtered Image", WINDOW_NORMAL);imshow("Non-Normalized Filtered Image", filtered);waitKey(0);destroyAllWindows();return 0;
}

运行结果3

性能优化

方框滤波器的计算可以通过积分图像(Integral Images)来加速。积分图像是一种预先计算的数据结构,可以高效地计算任意矩形区域的和。OpenCV提供了 integral 函数来计算积分图像。

积分图像示例

积分图像可以用来高效地实现方框滤波。

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;void applyBoxFilterUsingIntegral(const Mat &src, Mat &dst, Size ksize) 
{Mat integralImg;integral(src, integralImg);int radius = ksize.width / 2;for (int y = radius; y < src.rows - radius; ++y) {for (int x = radius; x < src.cols - radius; ++x) {int top_left = integralImg.at<int>(y - radius, x - radius);int top_right = integralImg.at<int>(y - radius, x + radius);int bottom_left = integralImg.at<int>(y + radius, x - radius);int bottom_right = integralImg.at<int>(y + radius, x + radius);int sum = bottom_right + top_left - top_right - bottom_left;dst.at<uchar>(y, x) = static_cast<uchar>(sum / (ksize.width * ksize.height));}}
}int main(int argc, char** argv) 
{if (argc != 2) {cout << "Usage: ./BoxFilterUsingIntegral <Image Path>" << endl;return -1;}// 加载图像Mat img = imread(argv[1], IMREAD_GRAYSCALE);if (!img.data){cout << "Error opening image" << endl;return -1;}// 定义核大小Size ksize(5, 5);  // 核大小// 初始化输出矩阵Mat filtered = Mat::zeros(img.size(), img.type());// 应用方框滤波applyBoxFilterUsingIntegral(img, filtered, ksize);// 显示结果imshow("Original Image", img);imshow("Filtered Image Using Integral", filtered);waitKey(0);destroyAllWindows();return 0;
}

运行结果4

总结

通过这些示例,你应该能够理解如何在OpenCV中使用C++实现方框滤波。方框滤波器是一个简单但有效的工具,可用于图像平滑和噪声减少。

相关文章:

6.8方框滤波

基本概念 方框滤波&#xff08;Box Filter&#xff09;是一种基本的图像处理技术&#xff0c;用于对图像进行平滑处理或模糊效果。它通过在图像上应用一个固定大小的方框核&#xff08;通常是矩形&#xff09;&#xff0c;计算该区域内像素值的平均值来替换中心像素的值。这种…...

携手SelectDB,观测云实现性能与成本的双重飞跃

在刚刚落下帷幕的2024云栖大会上&#xff0c;观测云又一次迎来了全面革新。携手SelectDB&#xff0c;实现了技术的飞跃&#xff0c;这不仅彰显了观测云在监控观测领域的技术实力&#xff0c;也预示着我们可以为全球用户提供更加高效、稳定的数据监测与分析服务。这一技术升级&a…...

Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)

Redis 数据类型及其应用场景 Redis 是什么? Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库&#xff0c;基于Key/Value结构存储数据&#xff0c;通常用来 缓解高并发场景下对某一资源的频繁请求 &#xff0c;减轻数据库的压力。它支持多种数据类型,如字符串、…...

如何在ChatGPT的帮助下,使用“逻辑回归”技巧完成论文写作?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 逻辑回归作为一种统计分析工具广泛应用&#xff0c;以解决研究中的分类问题。其主要作用在于探讨和量化自变量对因变量的影响&#xff0c;从而揭示潜在的因果关系。 在论文写作中&…...

MySQL 临时表

MySQL 临时表 引言 在数据库管理中,临时表是一种非常有用的工具,尤其是在进行复杂的数据处理和查询时。MySQL 作为一种流行的关系型数据库管理系统,提供了对临时表的支持。本文将详细介绍 MySQL 临时表的概念、用途、创建方法以及管理技巧。 什么是 MySQL 临时表? MySQ…...

个人文章汇总(算法原理算法题)

算法&#xff1a;算法概述 算法&#xff1a;浅谈常见的限流算法 算法&#xff1a;常见hash算法的原理 算法&#xff1a;二分查找法 算法&#xff1a;浅谈约瑟夫算法 算法&#xff1a;费波纳茨数列1 1 2 3 5 8 13 21 算法&#xff1a;快速排序 算法&#xff1a;插入排序 算法&am…...

基于Hive和Hadoop的图书分析系统

本项目是一个基于大数据技术的图书分析系统&#xff0c;旨在为用户提供全面的图书信息和深入的图书销售及阅读行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以…...

阿里rtc云端录制TypeScript版NODE运行

阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...

Web后端开发原理!!!什么是自动配置???什么是起动依赖???

引言&#xff1a; 当然&#xff0c;在我们学习的过程中&#xff0c;得知其然&#xff0c;还得知其所以然。So理解了其原理&#xff0c;更能让我们对其开发的理解&#xff0c;遇到问题&#xff0c;也更能快速找到解决办法&#xff01;&#xff01;&#xff01; 1. SprngBoot-配…...

2-105 基于matlab的GA-WNN预测算法

基于matlab的GA-WNN预测算法。遗传算法优化小波神经网络的步骤&#xff1a;1设种群规模为M。随机生成初始种群N , 采用实数编码对个体Ni编码。2、用1中的种群N训练, WNN参数由初始化获得。3、计算种群N中个体适应度值。满足终止条件则跳至6, 不满足执行4。4、适应度大的个体, 选…...

GPT-o1模型实测:论文选题没思路,ChatGPT-o1带你飞!

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 ChatGPT的最新版本GPT-o1模型&#xff0c;不少博主已经测评并展示了其在处理数学、物理以及代码生成等复杂任务时的独特优势。 和之前的版本相比&#xff0c;它在回答问题的时…...

OpenCV视频I/O(2)视频采集类VideoCapture之检索视频流的各种属性函数get()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 返回指定的 VideoCapture 属性。 VideoCapture 的 get() 函数用于检索视频流的各种属性。这个函数允许你查询视频源的状态和配置&#xff0c;例如…...

基于SpringBoot的学生宿舍管理系统【附源码】

基于SpringBoot的高校社团管理系统&#xff08;源码L文说明文档&#xff09; 4 系统设计 一个成功设计的系统在内容上必定是丰富的&#xff0c;在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值&#xff0c;吸引更多的访问者访问系统&#xf…...

【开源免费】基于SpringBoot+Vue.JS新闻推荐系统(JAVA毕业设计)

本文项目编号 T 056 &#xff0c;文末自助获取源码 \color{red}{T056&#xff0c;文末自助获取源码} T056&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

【每天学个新注解】Day 8 Lombok注解简解(七)—@Getter(lazy=true)

Getter(lazytrue) 生成懒加载的 getter 方法。 1、如何使用 Getter(lazytrue)注解加在一个被private final修饰的属性上&#xff0c;并且为其准备一个初始化方法。 2、代码示例 例&#xff1a; public class LazyGetterExample {Getter(lazy true)private final int exp…...

打造备份一体机,群晖科技平台化战略再进阶

数字经济时代&#xff0c;海量数据不断涌现&#xff0c;并成为核心生产要素&#xff0c;驱动着企业生产方式和商业模式发生深刻变革。 与其他生产要素不同&#xff0c;数据要素具有非稀缺性、非竞争性等特征&#xff0c;且只有在具体业务场景中才能充分释放其价值。尤其是近年…...

Sharding-JDBC笔记03-分库分表代码示例

文章目录 一、水平分库1. 将原有order_db库拆分为order_db_1、order_db_22. 分片规则修改分片策略standardcomplexinlinehintnone 3. 插入测试4. 查询测试5. 使用分库分片键查询测试总结 二、公共表1. 创建数据库2. 在Sharding-JDBC规则中修改3. 数据操作4. 字典操作测试5. 字典…...

气膜健身馆:提升运动体验与健康的理想选择—轻空间

近年来&#xff0c;气膜健身馆作为一种新兴的运动场所&#xff0c;正逐渐受到越来越多健身爱好者的青睐。这种独特的建筑形式不仅提供了良好的运动环境&#xff0c;更在健康和运动表现上展现出诸多优势。 优越的空气质量 气膜结构的核心技术通过内外气压差形成稳定的气膜&#…...

选择更轻松:山海鲸可视化与PowerBI的深度对比

在数据分析与可视化的时代&#xff0c;选择合适的报表工具显得尤为重要。山海鲸可视化和PowerBI是市场上颇受欢迎的两款免费报表软件&#xff0c;各有特色。接下来&#xff0c;我们将从功能、优缺点等方面进行对比&#xff0c;帮助你找到最适合的工具。 山海鲸可视化 山海鲸可…...

Python Daphne库:ASGI服务的高效Web服务器

更多Python学习内容&#xff1a;ipengtao.com 随着 Web 开发技术的不断发展&#xff0c;异步编程逐渐成为构建高性能 Web 应用的主流方式。传统的 WSGI 接口已经不能满足现代异步 Web 应用的需求。ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;作为 WSGI…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...