6.8方框滤波

news2024/11/17 13:40:16

基本概念

方框滤波(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++实现方框滤波。方框滤波器是一个简单但有效的工具,可用于图像平滑和噪声减少。

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

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

相关文章

C# + SQLiteExpert 进行(cipher)加密数据库开发+Costura.Fody 清爽发布

一&#xff1a;让 SQLiteExpert 支持&#xff08;cipher&#xff09;加密数据库 SQLiteExpert 作为SQlite 的管理工具&#xff0c;默认不支持加密数据库的&#xff0c;使其成为支持&#xff08;cipher&#xff09;加密数据库的管理工具&#xff0c;需要添加e_sqlcipher.dll &…

服务器端请求伪造(SSRF)漏洞解析

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关SSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法规内…

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp

准备国庆之际&#xff0c;客户要搭个 H5 商城系统&#xff0c;这系统好不容易开发好啦&#xff0c;就差选个合适的服务器上线。那可真是挑花了眼&#xff0c;不知道哪款性价比高呀&#xff01;就像在琳琅满目的选择前。最终慧眼识珠&#xff0c;选择了华为云 Flexus X。至于为什…

嵌入式学习--数据结构+算法

嵌入式学习--数据结构算法 数据结构 1.1数据 1.2逻辑结构 1.3存储结构 1&#xff09;顺序存储结构 2&#xff09;链式存储结构 1.4操作&#xff08;数据的运算&#xff09; 算法 2.1算法与程序 2.2算法与数据结构 2.3算法的特性 2.4如何评价一个算法的好坏&#xff1f; 2.5时间…

在IDEA中构建Jar包,安装Jar包到Maven仓库并在Maven项目中使用

文章目录 0. 关于本文1. IDEA构建Jar包1.1 准备一份Java代码&#xff08;就是你要构建工件的代码&#xff09;1.2 进行如下步骤构建工件 2. 关于Maven3. 将Jar包安装到Maven仓库4. 使用安装的Jar包依赖 0. 关于本文 本文内容&#xff1a; 借助IDEA构建Jar包将Jar包安装到Mave…

设计模式之门面(Facade)模式

前言 在组建构建过程中&#xff0c;某些接口之间直接的依赖常常会带来很多问题、甚至跟本无法实现。采用添加一层&#xff08;间接&#xff09;稳定接口&#xff0c;来隔离本来互相紧密关联的接口是一种常见的解决方案 定义 “接口隔离” 模式。为子系统中的一组接口提供一个一…

【北京二号卫星】

北京二号卫星 北京二号卫星是中国自主研制的高分辨率遥感卫星之一&#xff0c;具有多方面的特点和广泛的应用价值。以下是对北京二号卫星的详细介绍&#xff1a; 一、基本信息 名称&#xff1a;北京二号类型&#xff1a;民用商业遥感卫星星座组成&#xff1a;由三颗高分辨率卫…

【PDCCH(一)】

LTE/NR中&#xff0c;采用了OFDM正交频分复用方式&#xff0c;也就是在频域上使用多个子载波&#xff0c;这些子载波互相正交&#xff1b;在时域上采用帧结构的方式&#xff0c;用不同的帧结构去区分不同的用户&#xff0c;不同的资源&#xff0c;信道等等。 所以我们常常把时间…

校园外卖系统SpringBoot免费分享

今天我们分享一个非常实用的校园外卖系统&#xff0c;基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的瑞吉外卖案例项目&#xff0c;经过站长的进一步改进和优化&#xff0c;提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue…

web前端-CSS引入方式

一、内部样式表 内部样式表(内嵌样式表)是写到html页面内部,是将所有的 CSS 代码抽取出来,单独放到一个<styie>标签中。 注意: ① <style>标签理论上可以放在 HTML文档的任何地方&#xff0c;但一般会放在文档的<head>标签中 ② 通过此种方式&#xff0c;可…

【多样化的思想】基于执行档案的测试

下面我们讨论另一种关于多样性的观点。我们知道&#xff0c;对被测对象而言&#xff0c;测试输入空间代表的是各种可能的外部环境条件。如果两个测试输入点距离比较远&#xff0c;说明在这两个点上&#xff0c;被测对象所面对的外部环境条件很不一样&#xff0c;所以我们说&…

RabbitMQ的高级特性-消息确认机制

对于RabbitMQ发送消息到消费端的可靠性保障 引入&#xff1a;发送者发送消息后&#xff0c;到达消费端之后会出现一下两种情况&#xff1a; ①消息处理成功 ②消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第两种情况, 就会造成消息丢失&#xff0…

fmql之字符驱动设备(3)-并发与竞争

学会使用设备树后&#xff0c;要学习linux驱动编写中容易出现的”并发与竞争“。 代码是在之前代码的基础上进行修改。 并发与竞争 &#xff08;本部分来自于正点原子pdf&#xff09; 什么是并发与竞争&#xff0c;为什么会出现并发与竞争&#xff1a; 要保护的内容是&#…

基于TSN的实时通信网络延迟评估技术

论文标题&#xff1a;A TSN-based Technique for Real-Time Latency Evaluation in Communication Networks 作者信息&#xff1a; Alberto Morato, Claudio Zunino, Manuel Cheminod, Stefano Vitturi&#xff0c;来自意大利国家研究委员会&#xff0c;CNR-IEIIT。电子邮件:…

深度学习实战TT100K中国交通标志检测【数据集+YOLOv5模型+源码+PyQt5界面】

AI深度学习TT100k交通标志识别 文章目录 研究背景代码下载链接一、效果演示1.1 图像演示1.2 视频演示 二、技术原理2.1 整体流程2.2 TT100K中国交通标志数据集介绍2.3 YOLOV5 TT100K中国交通标志检测原理2.3.1 概述2.3.2 输入层2.3.3 Backbone层2.3.4 Backbone层2.3.5 Head层 2…

【人人保-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【时时三省】(C语言基础)指针笔试题6

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 笔试题6 首先aa&#xff3b;2&#xff3d;&#xff3b;5&#xff3d;是二维数组 也就是说它有两行第一行是1 2 3 4 5 第二行是6 7 8 9 10 然后&aa取出的数组的地址 &aa1就直接跳到第…

第1章 C++初识

1.1 编写第一个C程序 1.打开Visual Studio点击"创建新项目" 2.点击"空项目"&#xff0c;并点击"下一步" 3.设置"项目名称"并"设置地址" 4.打开项目后&#xff0c;右击"源文件"并选择"添加"的"新建…

国产操作系统(统信UOS)网络安全等级保护基础安全加固

统一操作系统UOS是由多家企业共同打造的中文国产操作系统。 一、设置口令复杂度策略和有效期 首先安装libpam-pwquality依赖包 口令复杂度策略通过libpam-pwquality依赖包进行设置 依赖包的安装命令&#xff1a;sudo apt-get install libpam-pwquality。 依赖包的查看方式执…

新茶饮卷出海,本土化成胜败关键

爱扬格说&#xff1a;“在那海水酣睡的宫殿里&#xff0c;铺满了多少奇珍异宝。”如今&#xff0c;新茶饮品牌正掀起出海狂潮&#xff0c;挖掘来自海外市场的财富机会。 近日&#xff0c;茶百道股价实现十连涨。消息面上&#xff0c;公司在韩国首尔建大站新店正式对外营业。根…