图像处理基础(4):高斯滤波器详解
本文主要介绍了高斯滤波器的原理及其实现过程
高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的模板系数都是相同的为1;而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小。
什么是高斯滤波器
既然名称为高斯滤波器,那么其和高斯分布(正态分布)是有一定的关系的。一个二维的高斯函数如下:
其中
为点坐标,在图像处理中可认为是整数;
是标准差。要想得到一个高斯滤波器的模板,可以对高斯函数进行离散化,得到的高斯函数值作为模板的系数。例如:要产生一个
的高斯滤波器模板,以模板的中心位置为坐标原点进行取样。模板在各个位置的坐标,如下所示(x轴水平向右,y轴竖直向下)
这样,将各个位置的坐标带入到高斯函数中,得到的值就是模板的系数。
对于窗口模板的大小为
,模板中各个元素值的计算公式如下:
这样计算出来的模板有两种形式:小数和整数。
· 小数形式的模板,就是直接计算得到的值,没有经过任何的处理;
· 整数形式的,则需要进行归一化处理,将模板左上角的值归一化为1,下面会具体介绍。使用整数的模板时,需要在模板的前面加一个系数,系数为
,也就是模板系数和的倒数。
高斯模板的生成
知道模板生成的原理,实现起来也就不困难了
void generateGaussianTemplate(double window[][11], int ksize, double sigma)
{static const double pi = 3.1415926;int center = ksize / 2; // 模板的中心位置,也就是坐标的原点double x2, y2;for (int i = 0; i < ksize; i++){x2 = pow(i - center, 2);for (int j = 0; j < ksize; j++){y2 = pow(j - center, 2);double g = exp(-(x2 + y2) / (2 * sigma * sigma));g /= 2 * pi * sigma;window[i][j] = g;}}double k = 1 / window[0][0]; // 将左上角的系数归一化为1for (int i = 0; i < ksize; i++){for (int j = 0; j < ksize; j++){window[i][j] *= k;}}
}
需要一个二维数组,存放生成的系数(这里假设模板的最大尺寸不会超过11);第二个参数是模板的大小(不要超过11);第三个参数就比较重要了,是高斯分布的标准差。
生成的过程,首先根据模板的大小,找到模板的中心位置ksize/2。 然后就是遍历,根据高斯分布的函数,计算模板中每个系数的值。
需要注意的是,最后归一化的过程,使用模板左上角的系数的倒数作为归一化的系数(左上角的系数值被归一化为1),模板中的每个系数都乘以该值(左上角系数的倒数),然后将得到的值取整,就得到了整数型的高斯滤波器模板。
下面截图生成的是,大小为
的模板
对上述解结果取整后得到如下模板:
这个模板就比较熟悉了,其就是根据
的高斯函数生成的模板。
至于小数形式的生成也比较简单,去掉归一化的过程,并且在求解过程后,模板的每个系数要除以所有系数的和。具体代码如下:
void generateGaussianTemplate(double window[][11], int ksize, double sigma)
{static const double pi = 3.1415926;int center = ksize / 2; // 模板的中心位置,也就是坐标的原点double x2, y2;double sum = 0;for (int i = 0; i < ksize; i++){x2 = pow(i - center, 2);for (int j = 0; j < ksize; j++){y2 = pow(j - center, 2);double g = exp(-(x2 + y2) / (2 * sigma * sigma));g /= 2 * pi * sigma;sum += g;window[i][j] = g;}}//double k = 1 / window[0][0]; // 将左上角的系数归一化为1for (int i = 0; i < ksize; i++){for (int j = 0; j < ksize; j++){window[i][j] /= sum;}}
}
的小数型模板。
值的意义及选取
通过上述的实现过程,不难发现,高斯滤波器模板的生成最重要的参数就是高斯分布的标准差
。标准差代表着数据的离散程度,如果
较小,那么生成的模板的中心系数较大,而周围的系数较小,这样对图像的平滑效果就不是很明显;反之,
较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。
来看下一维高斯分布的概率分布密度图:
横轴表示可能得取值x,竖轴表示概率分布密度F(x),那么不难理解这样一个曲线与x轴围成的图形面积为1。
(标准差)决定了这个图形的宽度,可以得出这样的结论:
越大,则图形越宽,尖峰越小,图形较为平缓;
越小,则图形越窄,越集中,中间部分也就越尖,图形变化比较剧烈。这其实很好理解,如果sigma也就是标准差越大,则表示该密度分布一定比较分散,由于面积为1,于是尖峰部分减小,宽度越宽(分布越分散);同理,
当越小时,说明密度分布较为集中,于是尖峰越尖,宽度越窄!
于是可以得到如下结论:
越大,分布越分散,各部分比重差别不大,于是生成的模板各元素值差别不大,类似于平均模板;
越小,分布越集中,中间部分所占比重远远高于其他部分,反映到高斯模板上就是中心元素值远远大于其他元素值,于是自然而然就相当于中间值得点运算。
基于OpenCV的实现
在生成高斯模板好,其简单的实现和其他的空间滤波器没有区别,具体代码如下:
void GaussianFilter(const Mat &src, Mat &dst, int ksize, double sigma)
{CV_Assert(src.channels() || src.channels() == 3); // 只处理单通道或者三通道图像const static double pi = 3.1415926;// 根据窗口大小和sigma生成高斯滤波器模板// 申请一个二维数组,存放生成的高斯模板矩阵double **templateMatrix = new double*[ksize];for (int i = 0; i < ksize; i++)templateMatrix[i] = new double[ksize];int origin = ksize / 2; // 以模板的中心为原点double x2, y2;double sum = 0;for (int i = 0; i < ksize; i++){x2 = pow(i - origin, 2);for (int j = 0; j < ksize; j++){y2 = pow(j - origin, 2);// 高斯函数前的常数可以不用计算,会在归一化的过程中给消去double g = exp(-(x2 + y2) / (2 * sigma * sigma));sum += g;templateMatrix[i][j] = g;}}for (int i = 0; i < ksize; i++){for (int j = 0; j < ksize; j++){templateMatrix[i][j] /= sum;cout << templateMatrix[i][j] << " ";}cout << endl;}// 将模板应用到图像中int border = ksize / 2;copyMakeBorder(src, dst, border, border, border, border, BorderTypes::BORDER_REFLECT);int channels = dst.channels();int rows = dst.rows - border;int cols = dst.cols - border;for (int i = border; i < rows; i++){for (int j = border; j < cols; j++){double sum[3] = { 0 };for (int a = -border; a <= border; a++){for (int b = -border; b <= border; b++){if (channels == 1){sum[0] += templateMatrix[border + a][border + b] * dst.at(i + a, j + b);}else if (channels == 3){Vec3b rgb = dst.at(i + a, j + b);auto k = templateMatrix[border + a][border + b];sum[0] += k * rgb[0];sum[1] += k * rgb[1];sum[2] += k * rgb[2];}}}for (int k = 0; k < channels; k++){if (sum[k] < 0)sum[k] = 0;else if (sum[k] > 255)sum[k] = 255;}if (channels == 1)dst.at(i, j) = static_cast(sum[0]);else if (channels == 3){Vec3b rgb = { static_cast(sum[0]), static_cast(sum[1]), static_cast(sum[2]) };dst.at(i, j) = rgb;}}}// 释放模板数组for (int i = 0; i < ksize; i++)delete[] templateMatrix[i];delete[] templateMatrix;
}
只处理单通道或者三通道图像,模板生成后,其滤波(卷积过程)就比较简单了。不过,这样的高斯滤波过程,其循环运算次数为
,其中m,n为图像的尺寸;ksize为高斯滤波器的尺寸。这样其时间复杂度为
,随滤波器的模板的尺寸呈平方增长,当高斯滤波器的尺寸较大时,其运算效率是极低的。为了,提高滤波的运算速度,可以将二维的高斯滤波过程分解开来。
分离实现高斯滤波
由于高斯函数的可分离性,尺寸较大的高斯滤波器可以分成两步进行:首先将图像在水平(竖直)方向与一维高斯函数进行卷积;然后将卷积后的结果在竖直(水平)方向使用相同的一维高斯函数得到的模板进行卷积运算。具体实现代码如下:
// 分离的计算
void separateGaussianFilter(const Mat &src, Mat &dst, int ksize, double sigma)
{CV_Assert(src.channels()==1 || src.channels() == 3); // 只处理单通道或者三通道图像// 生成一维的高斯滤波模板double *matrix = new double[ksize];double sum = 0;int origin = ksize / 2;for (int i = 0; i < ksize; i++){// 高斯函数前的常数可以不用计算,会在归一化的过程中给消去double g = exp(-(i - origin) * (i - origin) / (2 * sigma * sigma));sum += g;matrix[i] = g;}// 归一化for (int i = 0; i < ksize; i++)matrix[i] /= sum;// 将模板应用到图像中int border = ksize / 2;copyMakeBorder(src, dst, border, border, border, border, BorderTypes::BORDER_REFLECT);int channels = dst.channels();int rows = dst.rows - border;int cols = dst.cols - border;// 水平方向for (int i = border; i < rows; i++){for (int j = border; j < cols; j++){double sum[3] = { 0 };for (int k = -border; k <= border; k++){if (channels == 1){sum[0] += matrix[border + k] * dst.at(i, j + k); // 行不变,列变化;先做水平方向的卷积}else if (channels == 3){Vec3b rgb = dst.at(i, j + k);sum[0] += matrix[border + k] * rgb[0];sum[1] += matrix[border + k] * rgb[1];sum[2] += matrix[border + k] * rgb[2];}}for (int k = 0; k < channels; k++){if (sum[k] < 0)sum[k] = 0;else if (sum[k] > 255)sum[k] = 255;}if (channels == 1)dst.at(i, j) = static_cast(sum[0]);else if (channels == 3){Vec3b rgb = { static_cast(sum[0]), static_cast(sum[1]), static_cast(sum[2]) };dst.at(i, j) = rgb;}}}// 竖直方向for (int i = border; i < rows; i++){for (int j = border; j < cols; j++){double sum[3] = { 0 };for (int k = -border; k <= border; k++){if (channels == 1){sum[0] += matrix[border + k] * dst.at(i + k, j); // 列不变,行变化;竖直方向的卷积}else if (channels == 3){Vec3b rgb = dst.at(i + k, j);sum[0] += matrix[border + k] * rgb[0];sum[1] += matrix[border + k] * rgb[1];sum[2] += matrix[border + k] * rgb[2];}}for (int k = 0; k < channels; k++){if (sum[k] < 0)sum[k] = 0;else if (sum[k] > 255)sum[k] = 255;}if (channels == 1)dst.at(i, j) = static_cast(sum[0]);else if (channels == 3){Vec3b rgb = { static_cast(sum[0]), static_cast(sum[1]), static_cast(sum[2]) };dst.at(i, j) = rgb;}}}delete[] matrix;
}
代码没有重构较长,不过其实现原理是比较简单的。首先得到一维高斯函数的模板,在卷积(滤波)的过程中,保持行不变,列变化,在水平方向上做卷积运算;接着在上述得到的结果上,保持列不边,行变化,在竖直方向上做卷积运算。这样分解开来,算法的时间复杂度为
,运算量和滤波器的模板尺寸呈线性增长。
在OpenCV也有对高斯滤波器的封装GaussianBlur,其声明如下:
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize,double sigmaX, double sigmaY = 0,int borderType = BORDER_DEFAULT );
二维高斯函数的标准差在x和y方向上应该分别有一个标准差,在上面的代码中一直设其在x和y方向的标准是相等的,在OpenCV中的高斯滤波器中,可以在x和y方向上设置不同的标准差。
下图是自己实现的高斯滤波器和OpenCV中的GaussianBlur的结果对比
上图是
的高斯滤波器,可以看出两个实现得到的结果没有很大的区别。
总结
高斯滤波器是一种线性平滑滤波器,其滤波器的模板是对二维高斯函数离散得到。由于高斯模板的中心值最大,四周逐渐减小,其滤波后的结果相对于均值滤波器来说更好。
高斯滤波器最重要的参数就是高斯分布的标准差
,标准差和高斯滤波器的平滑能力有很大的能力,
越大,高斯滤波器的频带就较宽,对图像的平滑程度就越好。通过调节
参数,可以平衡对图像的噪声的抑制和对图像的模糊。
相关文章:
图像处理基础(4):高斯滤波器详解
本文主要介绍了高斯滤波器的原理及其实现过程 高斯滤波器是一种线性滤波器,能够有效的抑制噪声,平滑图像。其作用原理和均值滤波器类似,都是取滤波器窗口内的像素的均值作为输出。其窗口模板的系数和均值滤波器不同,均值滤波器的…...
outlook附件限制最大5m如何解决
Outlook 附件大小限制为 5MB,通常由邮件服务器(如 Exchange、Office 365、Gmail 等)或本地 Outlook 配置决定。可以采取以下几种方法来解决该限制问题: 解决方案 1:调整服务器端限制(管理员权限)…...
Word常见问题:嵌入图片无法显示完整
场景:在Word中,嵌入式图片显示不全,一部分图片在文字下方。如: 问题原因:因段落行距导致 方法一 快捷方式 选中图片,通过"ctrl1"快捷调整为1倍行距 方法二 通过工具栏调整 选中图片࿰…...
【面试题】java基础概念
以下是关于这道面试题的回答,包括JDK中一些相关概念的区别以及JIT的原理: JDK中相关概念区别 JDK、JRE和JVM JDK(Java Development Kit):是Java开发工具包,它包含了JRE和一系列开发工具。JDK提供了编译、…...
WebSocket实现私聊私信功能
目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接: 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 后面将继续完善,待更新... 后端 pom.xml…...
进程的哪些内存类型容易引起内存泄漏
相信你在平时的工作中,应该遇到过下面这些场景: 伴随着服务器中的后台任务持续地运行,系统中可用内存越来越少; 应用程序正在运行时忽然被 OOM kill 掉了; 进程看起来没有消耗多少内存,但是系统内存就是不够…...
用着很顺手的电脑亮度随心随意调节
一、功能介绍 显示高级设置,可以调节屏幕RGB色彩。 娱乐亮度,一键娱乐亮度调节。 护眼亮度,保护眼睛,减少蓝光。 恢复正常,一键恢复到默认模块。 二、问题解答 1、亮度更改后显示器无变化!软件根本都没…...
图片生成Prompt编写技巧
1. 图片情绪(场景氛围) 一张图片一般都会有一个情绪基调,因为作画本质上也是在传达一些情绪,一般都会借助图片的氛围去转达。例如:比如家庭聚会一般是欢乐、喜乐融融。断壁残垣一般是悲凉。还有萧瑟、孤寂等。 2.补充细…...
博客之星2024年度总评选——我的年度创作回顾与总结
2024年,是我在CSDN博客上持续耕耘、不断成长的一年。在此,与大家分享一下我的年度创作回顾与总结。 一、创作成长与突破 在人工智能领域,技术迭代迅速,知识更新频繁。为了保持自己的竞争力,在今年,我始终…...
前端Vue2项目使用md编辑器
项目中有一个需求,要在前端给用户展示内容,内容有 AI 生成的,返回来的是 md 格式,所以需要给用户展示 md 格式,并且管理端也可以编辑这个 md 格式的文档。 使用组件库 v-md-editor。 https://code-farmer-i.github.i…...
Docker核心命令与Yocto项目的高效应用
随着软件开发逐渐向分布式和容器化方向演进,Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程,大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具,与 Docker 的结合进一步增强了开发…...
kong 网关和spring cloud gateway网关性能测试对比
该测试只是简单在同一台机器设备对spring cloud gateway网关和kong网关进行对比,受限于笔者所拥有的资源,此处仅做简单评测。 一、使用spring boot 的auth-service作为服务提供者 该服务提供了一个/health接口,接口返回"OK"&…...
DDoS攻击防护能力测试:Python版脚本
引言 在互联网服务日益复杂和流量持续增长的今天,确保服务器能够应对高并发请求并具备良好的抗DDoS攻击的能力至关重要。声明以下代码仅在合法的前提下使用。 工具设计原理 脚本的核心在于它能够创建多个线程来并发执行不同的攻击方法,从而实现对目标…...
白玉微瑕:闲谈 SwiftUI 过渡(Transition)动画的“口是心非”(下)
概述 秃头小码农们都知道,SwiftUI 不仅仅是一个静态 UI 构建框架那么简单,辅以海量默认或自定义的动画和过渡(Transition)特效,我们可以将 App 界面的绚丽升华到极致。 不过,目前 SwiftUI 中的过渡&#x…...
5.4 解锁 OpenAI - Translator:模块设计,构建翻译系统的 “基石”
OpenAI-Translator 模块设计 OpenAI-Translator 作为一款基于 OpenAI GPT 模型的智能翻译助手,其模块设计至关重要。为了保证翻译的高效性、准确性与可扩展性,系统需要一个结构清晰、功能强大的模块化设计。本文将对 OpenAI-Translator 的各个模块进行详细解析,涵盖其核心功…...
数据分析 变异系数
目录 变异系数的应用场景包括: 特点: 注意事项: np.nanvar——方差,np.sanstd标准差 简单来讲就是平均值/标准差 变异系数(Coefficient of Variation, CV)是一种相对量的变异指标,常用于衡…...
C语言——编译与链接
目录 前言 一程序的两种环境 1翻译环境 2执行环境 二预处理 1预处理符号 2#define 2.1#define 定义标识符 2.2#define 定义宏 2.2.1#和## 2.3带副作用的宏参数 2.4宏和函数的比较 2.5命名约定 3#undef 4命令行定义 5条件编译 5.1单分支 5.2多分支 5.3判断是…...
NewStar CTF week1 web wp
谢谢皮蛋 做这题之前需要先去学习一些数据库的知识 1 order by 2 1可以理解为输入的id,是一个占位符,按第二列排序用来测试列数,如果没有两列则会报错-1 union select 1,2 -1同样是占位符,union的作用是将注入语句合并到原始语句…...
Android BitmapShader简洁实现马赛克,Kotlin(一)
Android BitmapShader简洁实现马赛克,Kotlin(一) 这一篇, Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)-CSDN博客 基于PorterDuffXfermode实现马…...
NavVis手持激光扫描帮助舍弗勒快速打造“数字孪生”工厂-沪敖3D
在全球拥有近100家工厂的舍弗勒,从2016年开启数字化运营进程,而当前制造、库存、劳动力和物流的数字化,已无法支持其进一步简化工作流程,亟需数字化物理制造环境,打造“数字孪生”工厂。 NavVis为其提供NavVis VLX 3…...
web服务器 网站部署的架构
WEB服务器工作原理 Web web是WWW(World Wide Web)的简称,基本原理是:请求(客户端)与响应(服务器端)原理,由遍布在互联网中的Web服务器和安装了Web浏览器的计算机组成 客户端发出请求的方式:地址栏请求、超链接请求、表单请求 …...
ecovadis验厂相关要求
EcoVadis验厂的相关要求主要包括以下几个方面: 一、企业基本资质要求 合法注册与运营:企业必须是合法注册并运营的法人实体,具备合法的经营资质,如营业执照、税务登记证等。无严重违法记录:在过去三年内,…...
SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别
目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言,Python也是高级编程语言;不是框架(框架:一般用于大型复杂需求项目,用于快速开发)具有三大特性,所谓Jav…...
Spring Boot中选择性加载Bean的几种方式
说明:用过Spring框架的都知道其自动装配的特性,本文介绍几种选择性加载Bean的方式。Spring自动装配参考以下两篇文章: 基于SpringBoot的三层架构开发&统一响应结果 SpringBoot自动装配原理简单分析 ConditionalOnProperty Conditiona…...
【JVM】垃圾收集器详解
你将学到 1. Serial 收集器 2. ParNew 收集器 3. Parallel Scavenge 收集器 4. Serial Old 收集器 5. Parallel Old 收集器 6. CMS 收集器 7. G1 收集器 在 Java 中,垃圾回收(GC)是自动管理内存的一个重要机制。HotSpot JVM 提供了多种…...
【实用技能】如何在Stimulsoft产品中使用用户函数,快速创建报表及仪表盘
Stimulsoft Ultimate (原Stimulsoft Reports.Ultimate)是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能,Stimulsoft Ultimate包含了…...
MySQL四种隔离级别
MySQL的隔离级别是在事务这个大主题下面产生的说法。 那么什么是事务,事务就是一组sql语句,要么全部执行成功,要么都不执行,不能只执行成功其中的部分sql。事务的最终目的是为了保证数据库数据的完整性、一致性和可用性。 要保…...
Unity入门1
安装之后无法获得许可证,可以考虑重装 新建项目 单击空白处生成脚本 双击c#文件 会自动打开vstudio 检查引用 如果没有引用,重开vstu,或者重新加载项目 hierarchy层级 scenes场景 assets资产 inspector督察 icon图标 资源链接&…...
qml Loader详解
1、概述 QML Loader是Qt Quick框架中的一个关键元素,它允许开发者动态地加载和卸载QML组件。这种动态加载机制对于提升应用程序的性能、响应速度和用户体验至关重要。通过Loader,应用程序可以在需要时才加载特定的组件,而不是在启动时一次性…...
《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: 《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风…...
web端ActiveMq测试工具
如何用vue3创建简单的web端ActiveMq测试工具? 1、复用vue3模板框架 创建main.js,引入APP文件,createApp创建文件,并加载element插件,然后挂载dom节点 2、配置vue.config.js脚本配置 mport { defineConfig } from "vite&qu…...
1561. 你可以获得的最大硬币数目
class Solution:def maxCoins(self, piles: List[int]) -> int:piles.sort()res,n0,len(piles)for i in range(n//3):respiles[n-2-2*i]return res这里如果"你"想要获取最大,那么从最大的开始找 每隔俩算一个最大累计,Bob默认自己从最小那找…...
NIO | 什么是Java中的NIO —— 结合业务场景理解 NIO (二)
实时通信应用 的主流技术 并非NIO , 整理本文的目的是 更好的理解 NIO 。 在现代的 即时聊天应用中,使用 WebSocket、MQTT 或 SignalR 等协议更为普遍。 若您想了解 当前主流的有关 实时通信应用 的技术 , 请移步他文。 (一) 业务场景 实…...
GD32L233RB 驱动数码管
1.数码管有8段A、B、C、D、E、F、G 和 H小数点 以及片选信号(DIG) DIG用来选择那一位,A-G 用来显示段 静态显示每次只能一次显示单个位 动态显示(动态扫描)所有的位显示结束要在10ms左右 显示2ms 消光1ms 实…...
AIGC视频生成模型:Stability AI的SVD(Stable Video Diffusion)模型
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Stability AI的视频生成模型SVD(Stable Video Diffusion)模型,这家公司在图像生成领域富有盛名,开发并维护了知名开源项目SD系列…...
Linux 系统错误处理简介
Linux 系统错误处理简介 1. errno:错误代码的载体2. strerror():错误信息的翻译官3. perror():便捷的错误信息输出4. 系统调用与库函数的区别5. 错误处理的最佳实践 在 C/C 程序开发中,我们经常需要处理各种错误情况 Linux 系统提…...
systemC示例
main.cpp #include <memory> using namespace std; #include "top.h" int sc_main(int i, char *av[]) { // 关闭关于 IEEE 1666 标准中过时特性的警告 sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING); cout <…...
C++打字模拟
改进于 文宇炽筱_潜水 c版的打字效果_c自动打字-CSDN博客https://blog.csdn.net/2401_84159494/article/details/141023898?ops_request_misc%257B%2522request%255Fid%2522%253A%25227f97863ddc9d1b2ae9526f45765b1744%2522%252C%2522scm%2522%253A%252220140713.1301023…...
国产低功耗带LCD驱动和触摸按键功能的MCU
以下是国产低功耗、集成LCD驱动和触摸按键功能的MCU精选型号及其核心特性,结合性能、功耗和适用场景进行综合推荐: 1.灵动微MM32L0130系列 257 核心特性:低功耗:待机模式功耗低至100nA,支持多种低功耗模式。 LCD驱动&a…...
在 imx93 平台调试 nau88c10 声卡
一、环境介绍 linux 版本:6.6.52 soc:imx9331 codec:nau88c10 使用的内核文件为 Image,dtb 文件为:imx93-11x11-evk.dtb 二、硬件检查 i2s 信号线要接对 i2c 控制信号建议为 4.7k 上拉 codec 供电可以按参考设计…...
机器学习-分类算法评估标准
一. 准确率 accuracy 将预测结果和测试集的目标值比较,计算预测正确的百分比 准确率越高说明模型效果越好 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier #加载鸢尾花…...
美区TikTok解封后如何回归使用?
随着2025年初美区TikTok解封的消息引起了广泛关注,许多用户纷纷开始重新关注这一全球最受欢迎的短视频平台。在经历了数月的禁用期后,TikTok在美国市场的回归,代表了这一平台的巨大潜力和挑战。从用户的使用习惯,到平台的内容策略…...
行人识别检测数据集,yolo格式,PASICAL VOC XML,COCO JSON,darknet等格式的标注都支持,准确识别率可达99.5%
作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C,go等语言开发经验,mysql,mongo,redis等数据库,设计模…...
grafana + Prometheus + node_exporter搭建监控大屏
本文介绍生产系统监控大屏的搭建,比较实用也是实际应用比较多的方式,希望能够帮助大家对监控系统有一定的认识。 0、规划 grafana主要是展示和报警,Prometheus用于保存监控数据,node_exporter用于实时采集各个应用服务器的事实状…...
【腾讯云】docker创建网络遇到Unable to enable SKIP DNAT rule
docker创建网络遇到Unable to enable SKIP DNAT rule 背景 今天打算在服务器上安装es,但是在创建网络时,提示 Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER…...
DeepSeek R1模型解读与使用
DeepSeek在推出R1预览版两个月后,发布了R1的正式版本,并且开源了模型,开放了API调用。我们直接来解读一下这款模型。 这是官方的性能评测图。从左到右分别是DeepSeek-R1,o1正式版,32B蒸馏版R1,o1-mini&…...
AI新玩法:Flux.1图像生成结合内网穿透远程生图的解决方案
文章目录 前言1. 本地部署ComfyUI2. 下载 Flux.1 模型3. 下载CLIP模型4. 下载 VAE 模型5. 演示文生图6. 公网使用 Flux.1 大模型6.1 创建远程连接公网地址 7. 固定远程访问公网地址 前言 在这个AI技术日新月异的时代,图像生成模型已经成为了创意工作者和开发者手中…...
api开发如何确保通过非官方库解析口令的合法性?
通过非官方库解析淘宝口令可能存在违反淘宝平台规则以及法律法规的风险,很难完全确保其合法性。如果确实有需求,可从以下几个方面尽量降低风险,提高合法性: 了解法律法规 《中华人民共和国网络安全法》:需确保解析行为…...
第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)
1.ThreadGroup 与 Thread 在Java程序中, 默认情况下, 新的线程都会被加入到main线程所在的group中, main线程的group名字同线程名。如同线程存在父子关系一样, Thread Group同样也存在父子关系。图6-1就很好地说明了父子thread、父…...
如何使用Python脚本将本地项目上传到 GitHub
前言 这里我们通过创建一个新的github仓库,来测试我们的脚本能否上传我们本地的项目,并且进行更新。首先你需要先安装 Git,关于这部分我好像没有记录过,这里我搜索看了一下,这篇博客写的Git安装详解应该是比较齐全的&…...