6.1均值滤波

news2024/9/20 20:19:17

目录

实验原理

示例代码

运行结果

注意事项

总结

实验代码

运行结果


实验原理

https://zhuanlan.zhihu.com/p/76188487

在OpenCV中,cv::blur函数用于对图像进行均值滤波(Mean Filter),这是一种线性滤波技术,主要用于平滑图像和去除噪声。均值滤波是一种线性滤波技术,它通过替换每个像素值为其邻域内的平均值来平滑图像,从而减少图像中的噪声。均值滤波器对于减少高斯噪声特别有效,但它可能会模糊边缘和其他细节。

函数原型

void blur(InputArray src, OutputArray dst, Size ksize, 
        Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT );

参数说明
src: 输入图像,它可以是多通道图像。
dst: 处理后的图像,与输入图像具有相同的尺寸和类型。
ksize: 内核大小,指定卷积核的大小,通常是一个正方形核,指定为一个 Size 对象。例如,Size(5, 5) 表示使用一个5x5的内核进行卷积操作。
anchor: 锚点位置,即内核相对于像素的位置。默认情况下(Point(-1, -1)),锚点位于内核中心。
borderType: 边界处理方式。当内核的一部分超出图像边界时,需要对这部分进行某种处理。默认为 BORDER_DEFAULT,通常意味着使用 BORDER_REFLECT_101。

常见的边界处理方式包括:
•BORDER_CONSTANT:用指定的常数值填充边界。
•BORDER_REPLICATE:边界像素值向外扩展。
•BORDER_REFLECT:反射边界,如12345反射为45454。
•BORDER_WRAP:循环边界,如12345循环为34512。


工作原理
均值滤波器的工作原理是对图像中的每个像素应用一个卷积核(Kernel),该核中的每个元素都是相等的权重(通常是1除以核的大小)。卷积核中的所有元素值相加求平均值,然后将这个平均值赋给当前像素点。

示例代码

下面是一个使用C++和OpenCV进行均值滤波的简单示例:

#include "pch.h"
#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
	// 加载图像
	cv::Mat img = cv::imread("2B.png", cv::IMREAD_COLOR); // 读取彩色图像

	if (img.empty())
	{
		std::cout << "Could not open or find the image" << std::endl;
		return -1;
	}

	// 定义内核大小
	int kernel_size = 5; // 5x5 的内核
	cv::Size ksize(kernel_size, kernel_size);

	// 创建一个空的输出图像
	cv::Mat dst;

	// 应用均值滤波
	cv::blur(img, dst, ksize);

	// 显示结果
	cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
	cv::imshow("Original Image", img);

	cv::namedWindow("Blurred Image", cv::WINDOW_NORMAL);
	cv::imshow("Blurred Image", dst);

	cv::waitKey(0);

	return 0;
}

运行结果

去除脸上毛孔

注意事项

  • 内核大小: 内核大小的选择会影响滤波的效果。较大的核可以产生更强烈的平滑效果,但可能会丢失更多的细节;较小的核则可以保留更多细节,但平滑效果较弱。
  • 性能: 在处理大图像或者使用大内核时,均值滤波可能比较耗时。
  • 边界效应: 在图像边界处,由于部分内核超出图像范围,因此边界上的像素可能会受到不同类型的处理,这取决于所选的边界类型。边界处理borderType参数决定了如何处理图像边缘的像素。

总结

均值滤波是一种简单有效的图像平滑方法,适用于去除图像中的噪声和平滑图像。通过调整卷积核的大小,可以控制平滑的程度。但是,它也会使图像中的边缘变得模糊,因此在某些应用中可能不是最佳选择。如果需要保留边缘细节,可以考虑使用其他类型的滤波器,如高斯滤波或者双边滤波。

实验代码

#include "pch.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
//定义全局变量
Mat g_srcImage;         //定义输入图像
Mat g_dstImage;         //定义目标图像

const int g_nTrackbarMaxValue = 9;      //定义轨迹条最大值
int g_nTrackbarValue;                   //定义轨迹条初始值
int g_nKernelValue;                     //定义kernel尺寸

void on_kernelTrackbar(int, void*);     //定义回调函数

int main()
{
	g_srcImage = imread("A3.jpeg");

	//判断图像是否加载成功
	if (g_srcImage.empty())
	{
		cout << "图像加载失败!" << endl;
		return -1;
	}
	else
		cout << "图像加载成功!" << endl << endl;

	namedWindow("原图像", WINDOW_NORMAL);     //定义窗口显示属性
	imshow("原图像", g_srcImage);

	g_nTrackbarValue = 1;
	namedWindow("均值滤波", WINDOW_NORMAL);   //定义滤波后图像显示窗口属性

	//定义轨迹条名称和最大值
	char kernelName[20];
	sprintf(kernelName, "kernel尺寸 %d", g_nTrackbarMaxValue);

	//创建轨迹条
	createTrackbar(kernelName, "均值滤波", &g_nTrackbarValue, g_nTrackbarMaxValue, on_kernelTrackbar);
	on_kernelTrackbar(g_nTrackbarValue, 0);

	waitKey(0);

	return 0;
}

void on_kernelTrackbar(int, void*)
{
	//根据输入值重新计算kernel尺寸
	g_nKernelValue = g_nTrackbarValue * 2 + 1;

	//均值滤波函数
	blur(g_srcImage, g_dstImage, Size(g_nKernelValue, g_nKernelValue));

	imshow("均值滤波", g_dstImage);
}
 

运行结果

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

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

相关文章

科技信贷业务怎么寻找客户?

在科技信贷业务领域&#xff0c;寻找客户的痛点主要集中在以下几个方面&#xff1a; 1.风险评估难题&#xff1a;科技型企业尤其是初创企业&#xff0c;往往缺乏足够的历史数据和抵押物&#xff0c;这使得金融机构在评估其信用风险时面临较大挑战。由于科技企业的研发周期长、…

视频监控系统布局策略:EasyCVR视频汇聚平台构建高效、全面的安全防线

随着科技的飞速发展&#xff0c;视频监控系统已成为现代社会安全防范的重要组成部分&#xff0c;广泛应用于公共场所、企业园区、住宅小区等各个领域。一个科学合理的视频监控系统布局与选型策略&#xff0c;不仅能够显著提升安全监控的效率和效果&#xff0c;还能在关键时刻提…

我用 GPT 学占星

最近对占星赶兴趣&#xff0c;但是看到星盘中好多名词&#xff0c;不懂是什么意思&#xff1f;所以直接问 gpt &#xff0c; 发现回答的真的很棒&#x1f389; &#xff01; 假如我想知道各个状态的具体是根据什么数据来显示的&#xff1f; 分分钟解决了我的问题&#xff1b; 我…

OpenFeign请求拦截器,注入配置属性类(@ConfigurationProperties),添加配置文件(yml)中的token到请求头

一、需求 OpenFeign请求拦截器&#xff0c;注入配置属性类&#xff08;ConfigurationProperties&#xff09;&#xff0c;添加配置文件&#xff08;yml&#xff09;中的token到请求头 在使用Spring Boot结合OpenFeign进行微服务间调用时&#xff0c;需要在发起HTTP请求时添加一…

【Linux高级命令】1_进程和端口相关命令

文章目录 一、重启和关机的命令【了解】二、进程2.1 查看系统进程&#xff1a;ps 【重点】2.1.1 grep结合管道符去查找特定的进程信息 2.2 实时查看系统的进程信息&#xff1a;top2.3 关闭进程&#xff1a;kill【重点】 三、端口3.1 查看系统监听端口&#xff1a;netstat【重点…

Notepad++ 下载安装教程

目录 1.下教程 2.安装教程 1.下教程 Downloads | Notepad (notepad-plus-plus.org) 进入下载地址后选择最新版点击连接 点击链接后&#xff0c;向下滑动&#xff0c;下载适合自己电脑版本的安装包 这里大家没有梯子可能打不开页面&#xff0c;可以直接从本文开头下载。 2.安…

【vscode】vscode paste image插件设置

本文首发于 ❄️慕雪的寒舍 vscode编辑md文件的时候&#xff0c;如果想插入图片&#xff0c;自带的粘贴只会粘贴到当前目录下&#xff0c;也没有文件重命名&#xff0c;很不友好。 在扩展商店里面有mushan的Paste Image插件&#xff0c;相比自带的&#xff0c;更加友好一点。但…

物联网之ESP32控制舵机、通过网页设置舵机角度、Web服务、舵机原理、接线、Arduino、WiFi、Http

MENU 前言原理硬件电路设计软件程序设计LEDC输出PWM信号使用第三方库控制舵机网页控制舵机 前言 舵机在电子产品中非常常见&#xff0c;比如四足机器人、固定翼航模等都有应用&#xff0c;因此学习舵机对电子制作非常有意义。本文章使用Arguino的PWM对SG90舵机旋转角度控制。 原…

什么是Hash冲突?如何解决Hash冲突?

目录 一丶什么是Hash冲突 二丶如何解决Hash冲突 简介&#xff1a;Hash叫做‘散列表’&#xff0c;就是把任意长度输入&#xff0c;通过散列算法&#xff0c;变成固定长度输出&#xff0c;该输出结果是散列值。其实这种转换是一种压缩映射&#xff0c;散列表的空间通常小于输入…

深入解析EF Core并发控制:乐观与悲观策略的全面对比与实战应用

1. 前言 在使用EF Core开发应用程序时&#xff0c;并发控制是确保数据一致性的重要机制。EF Core 提供了两种主要的并发控制策略&#xff1a;乐观并发控制和悲观并发控制。它们各自有不同的应用场景和实现方式。本文将详细介绍这两种并发控制的区别、常见的应用场景&#xff0…

fastadmin 文件上传七牛云

1-安装七牛云官方SDK composer require qiniu/php-sdk 2-七牛云配置 <?phpnamespace app\common\controller;use Qiniu\Storage\BucketManager; use think\Config; use Qiniu\Auth; use Qiniu\Storage\UploadManager; use think\Controller; use think\Db;/*** 七牛基类*…

python操作kafka

一、参考阿里云的官方链接&#xff1a; 使用Python SDK接入Kafka收发消息_云消息队列 Kafka 版(Kafka)-阿里云帮助中心 二、安装python环境 三、添加python依赖库 pip install confluent-kafka1.9.2 四、新建一个setting.py文件配置信息 kafka_setting {sasl_plain_user…

爆改YOLOv8|利用SCConv改进yolov8-即轻量又涨点

1&#xff0c;本文介绍 SCConv&#xff08;空间和通道重构卷积&#xff09;是一种高效的卷积模块&#xff0c;旨在优化卷积神经网络&#xff08;CNN&#xff09;的性能&#xff0c;通过减少空间和通道的冗余来降低计算资源的消耗。该模块由两个核心组件构成&#xff1a; 空间重…

斯坦福UE4 C++课学习补充25:寻路EQS

文章目录 一、创建EQS二、修改行为树三、查询上下文 一、创建EQS 场景查询系统EQS&#xff1a;可用于收集场景相关的数据。然后该系统可以使用生成器&#xff0c;通过各种用户定义的测试就这些数据提问&#xff0c;返回符合所提问题类型的最佳项目Item。 EQS的一些使用范例包…

Unity【Colliders碰撞器】和【Rigibody刚体】的应用——小球反弹效果

目录 Collider 2D 定义&#xff1a; 类型&#xff1a; Rigidbody 2D 定义&#xff1a; 属性和行为&#xff1a; 运动控制&#xff1a; 碰撞检测&#xff1a; 结合使用 实用检测 延伸拓展 1、在Unity中优化Collider 2D和Rigidbody 2D的性能 2、Unity中Collider 2D…

香橙派列出附近所有的WiFi

使用 nmcli nmcli 是 NetworkManager 的命令行工具&#xff0c;它可以用来检索和管理网络连接。 nmcli device wifi list这个命令会列出所有周围的WiFi网络。

社区电商系统源码之卷轴模式:商业模式分析

随着互联网技术的发展&#xff0c;电商平台的竞争日益激烈&#xff0c;如何留住用户并提升用户粘性成为了各大电商平台关注的重点。卷轴模式作为一种新兴的用户参与和激励机制&#xff0c;在社区电商系统中得到了广泛的应用。本文将从技术角度探讨卷轴模式在社区电商系统中的实…

rust 命令行工具rsup管理前端npm依赖

学习了一年的 rust 了&#xff0c;但是不知道用来做些什么&#xff0c;也没能赋能到工作中&#xff0c;现在前端基建都已经开始全面进入 rust 领域了&#xff0c;rust 的前端生态是越来越好。但是自己奈何水平不够&#xff0c;想贡献点什么&#xff0c;无从下手。 遂想自己捣鼓…

Leetcode3256. 放三个车的价值之和最大 I

Every day a Leetcode 题目来源&#xff1a;3256. 放三个车的价值之和最大 I 解法1&#xff1a;贪心 从大到下排序矩阵所有值, 记为数组v。 转化此题&#xff1a;从r*c个数中选取3个数分别给到车1&#xff0c;车2&#xff0c;和车3&#xff0c;使得符合条件的三数之和最大。…

rancher upgrade 【rancher 升级】

文章目录 1. 背景2. 下载3. 安装4. 检查5. 测试5.1 创建项目5.2 创建应用5.3 删除集群5.4 注册集群 1. 背景 rancher v2.8.2 升级 v2.9.1 2. 下载 下载charts helm repo add rancher-latest https://releases.rancher.com/server-charts/latest helm repo update helm fetc…