opencv 傅里叶变换(低通滤波 + 高通滤波)

文章目录

  • 1、傅里叶变换
  • 2、通过numpy实现
  • 3、高通滤波器
  • 5、通过opencv实现傅里叶变换
  • 6、低通滤波器
  • 7、C++实现傅里叶变换

1、傅里叶变换

时域分析:以时间作为参照物,世间万物都是随着时间变化而变化,并且不会停止
频域分析:认为世间万物都是静止的,永恒不变的

通过以下制作饮料的过程可以很好的理解傅里叶变换。

1、从时域分析:就是六点零一放了1块冰糖,3颗红豆,2颗绿豆,4块西红柿,1杯纯净水,六点零二放了1块冰糖。。。。随着时间的变化一直在变化

在这里插入图片描述
2、从频域角度分析:不在是以时间为参照物了,而是这个事情的频率,1分钟放1块冰糖,2分钟放3粒红豆,3分钟放2粒绿豆,4分钟放4块西红柿,5分钟放1杯水。
在这里插入图片描述

下面这两个图都是描述同一个事情,可以更明显看出,两者的区别。
在这里插入图片描述
在两个角度去看周期函数的变化
在这里插入图片描述

任何连续的周期信号,可以由一组适当的正𫠊曲线组成

相为:三个开始起点不一致的余𫠊函数,组成了这个曲线
在这里插入图片描述
在这里插入图片描述

2、通过numpy实现

通过将原图进行傅里叶变换,得到频域图像,获得高频和低频,对高频和低频进行操作之后,进行逆变换回原图像达到对图像进行特色操作:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等
1、低通滤波器:只保留低频信息,去掉高频信息,会去掉边缘特征信息,会让图像变模糊
2、高频滤波器:只保留高频信息,去掉低频信息,会增强图像的边缘和特征信息,但是会失去一些细节信息
在这里插入图片描述
在这里插入图片描述

def test9():img = cv2.imread("1.jpg", 0)# 执行傅里叶变换,转化为频域f = np.fft.fft2(img)# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)fshift = np.fft.fftshift(f)# 通过将其转换为(0-255)中result = 20 * np.log(np.abs(fshift))# 原图显示# 创建窗口一行两列,第一咧plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('orginal')# 不用坐标系plt.axis('off')# 傅里叶变换之后的图plt.subplot(122)plt.imshow(result, cmap='gray')plt.title('result')plt.axis('off')plt.show()

在这里插入图片描述

从频域转换会原图像(因为没有做任何操作,所以输出图像不会发生改变)

def test10():img = cv2.imread("1.jpg", 0)# 执行傅里叶变换,转化为频域f = np.fft.fft2(img)# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)fshift = np.fft.fftshift(f)# 低频谱从中心移动到左上角(相当于又移回去)ishift = np.fft.ifftshift(fshift)# 从频域转换回原图像iimg = np.fft.ifft2(ishift)iimg = np.abs(iimg)# 原图显示# 创建窗口一行两列,第一咧plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('orginal')# 不用坐标系plt.axis('off')# 傅里叶变换之后的图plt.subplot(122)plt.imshow(iimg, cmap='gray')plt.title('result')plt.axis('off')plt.show()

在这里插入图片描述

3、高通滤波器

前面已经说过,高通滤波器是去除所有低频信息,达到图像增强的效果但是会失去一些细节信息。
在这里插入图片描述

def test11():img = cv2.imread("1.jpg", 0)# 执行傅里叶变换,转化为频域f = np.fft.fft2(img)# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)fshift = np.fft.fftshift(f)# 高宽 创建高通滤波器rows, cols = img.shapecrows, ccols = int(rows / 2), int(cols / 2)# 前面我们将低频信息移动到图像中间来了# 这里将低频信息全部设置为0,达到去掉低频信息目的fshift[crows - 30:crows + 30, ccols - 30:ccols + 30] = 0ifshift = np.fft.ifftshift(fshift)# 将频谱逆变换到图像iimg = np.fft.ifft2(ifshift)iimg = np.abs(iimg)plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('orginal')# 不用坐标系plt.axis('off')# 傅里叶变换之后的图plt.subplot(122)plt.imshow(iimg, cmap='gray')plt.title('result')plt.axis('off')plt.show()

在这里插入图片描述

5、通过opencv实现傅里叶变换

使用opencv中的函数实现
在这里插入图片描述

def test12():img = cv2.imread("1.jpg", 0)# dft返回的是两个通道的频域,0是频域实部分,1是频域图像虚部分# DFT_COMPLEX_OUTPUT输出复数dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)dftshift = np.fft.fftshift(dft)idftshift = np.fft.ifftshift(dftshift)# 傅里叶逆变换iimg = cv2.idft(idftshift)# magnitude函数频域图像的幅度谱# result = 20 * np.log(cv2.magnitude(dftshift[:, :, 0], dftshift[:, :, 1]))result = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('orginal')# 不用坐标系plt.axis('off')# 傅里叶变换之后的图plt.subplot(122)plt.imshow(result, cmap='gray')plt.title('result')plt.axis('off')plt.show()

在这里插入图片描述

6、低通滤波器

创建一个mask,将中心位置设为1,其他位置设为0,然后和频谱图像相乘之后就只保留了低频信息了

在这里插入图片描述

def test13():img = cv2.imread("1.jpg", 0)# # 执行傅里叶变换dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)ifshift = np.fft.fftshift(dft)# 创建低通滤波器rows, cols = img.shapemask = np.zeros((rows, cols, 2), np.int8)crows, ccols = int(rows / 2), int(cols / 2)mask[crows - 30:crows + 30, ccols - 30:ccols + 30] = 1fshift = ifshift * maskishift = np.fft.ifftshift(fshift)io = cv2.idft(ishift)result = cv2.magnitude(io[:, :, 0], io[:, :, 1])plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('orginal')# 不用坐标系plt.axis('off')# 傅里叶变换之后的图plt.subplot(122)plt.imshow(result, cmap='gray')plt.title('result')plt.axis('off')plt.show()

在这里插入图片描述

7、C++实现傅里叶变换

傅里叶变换:cv::dft()
执行一维或二维浮点数组的正向或反向离散傅里叶变换。

#include <opencv2/core.hpp>
函数说明:void cv::dft( InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0 );
输入参数:(1)src					输入数组。可以是实数也可以是复数。(2)dst					输出数组。其大小和类型取决于flags。(3)flags = 0				转换标志。cv::DFT_INVERSE 				执行1D或2D逆变换,而不是默认的正转换。cv::DFT_SCALE 					缩放比例标识符,输出的结果会以1/N进行缩放。N=数组元素的数量cv::DFT_ROWS 					对输入矩阵的每一行执行正变换或逆变换。能够同时处理多个向量,并减少3D和高维变换的开销。cv::DFT_COMPLEX_OUTPUT 			一维或二维实数数组正变换。cv::DFT_REAL_OUTPUT 			一维或二维复数数组逆变换。cv::DFT_COMPLEX_INPUT 			指定输入为实数输入。输入必须有2个通道。cv::DCT_INVERSE					执行逆1D或2D转换,而不是默认的正向转换。cv::DCT_ROWS 					对输入矩阵的每一行执行正变换或逆变换。能够同时处理多个向量,并减少3D和高维变换的开销。(4)nonzeroRows = 0		默认值为0。若设为非零值,dft函数会将该值作为非零行的有效区间长度,只对非零行进行处理,提高计算效率。

傅里叶反变换:cv::idft()
计算一维或二维阵列的离散傅里叶反变换。
默认情况下,dft和idft都不会缩放结果。因此,您应该显式地将DFT_SCALE传递给dft或idft中的一个,以使这些变换相互逆。

#include <opencv2/core.hpp>
函数说明:void cv::idft( InputArray src, OutputArray dst, int flags = 0, int nonzeroRows = 0 );
输入参数:(1)src					输入数组。可以是实数也可以是复数。(2)dst					输出数组。其大小和类型取决于flags。(3)flags = 0				转换标志。cv::DFT_INVERSE 				执行1D或2D逆变换,而不是默认的正转换。cv::DFT_SCALE 					缩放比例标识符,输出的结果会以1/N进行缩放。N=数组元素的数量cv::DFT_ROWS 					对输入矩阵的每一行执行正变换或逆变换。能够同时处理多个向量,并减少3D和高维变换的开销。cv::DFT_COMPLEX_OUTPUT 			一维或二维实数数组正变换。cv::DFT_REAL_OUTPUT 			一维或二维复数数组逆变换。cv::DFT_COMPLEX_INPUT 			指定输入为实数输入。输入必须有2个通道。cv::DCT_INVERSE					执行逆1D或2D转换,而不是默认的正向转换。cv::DCT_ROWS 					对输入矩阵的每一行执行正变换或逆变换。能够同时处理多个向量,并减少3D和高维变换的开销。(4)nonzeroRows = 0		默认值为0。若设为非零值,dft函数会将该值作为非零行的有效区间长度,只对非零行进行处理,提高计算效率。

计算相位谱:cv::phase()
计算由x和y的对应元素组成的每个2D矢量的旋转角度。计算公式:angle(I)=atan2(y(I), x(I))
角度估计精度约为0.3度。当x(I)=y(I)=0时,对应角(I)设为0

#include <opencv2/core.hpp>
函数说明:void cv::phase( InputArray x, InputArray y, OutputArray angle, bool angleInDegrees = false );
输入参数:(1)x					输入二维矢量的x坐标的浮点数组。(2)y					输入二维矢量的y坐标数组。它必须和x有相同的大小和类型。(3)angle				角度。输出与x大小和类型相同的数组。(4)angleInDegrees = false		当为true时,该函数以度数计算角度,否则以弧度计算。

计算幅度谱:cv::magnitude()
计算由x和y数组的相应元素组成的2D向量的大小。计算公式:dst(I) = sqrt(x(I)^2 + y(I)^2)

#include <opencv2/core.hpp>
函数说明:void cv::magnitude( InputArray x, InputArray y, OutputArray magnitude );
输入参数:(1)x					输入二维矢量的x坐标的浮点数组。(2)y					输入二维矢量的y坐标数组。它必须和x有相同的大小和类型。(3)magnitude 			幅值。输出与x大小和类型相同的数组。

计算x和y的坐标:cv::polarToCart()
通过二维矢量的大小和角度来计算x和y的坐标。估计坐标的相对精度约为1e-6。
计算公式:x(I) = magnitude(I) * cos(angle(I))
计算公式:y(I) = magnitude(I) * sin(angle(I))

#include <opencv2/core.hpp>
函数说明:void cv::polarToCart( InputArray magnitude, InputArray angle, OutputArray x, OutputArray y, bool angleInDegrees = false );
输入参数:(1)magnitude			输入二维矢量(大小)的浮点数组。若为空矩阵,则假设所有的大小都是=1;若不为空,则必须具有与angle相同的大小和类型。(2)angle				输入二维矢量(角度)的浮点数组。(3)x					二维矢量的x坐标输出数组。它有相同的尺寸和类型的角度。(4)y					二维矢量的y坐标输出数组。它有相同的尺寸和类型的角度。(5)angleInDegrees = false  	当为true时,输入角以度数表示,否则以弧度表示。

获取最适合傅里叶正变换的宽 / 高:cv::getOptimalDFTSize()
DFT(傅里叶正变换)性能不是向量大小的单调函数。因此,当您计算两个数组的卷积或执行数组的频谱分析时,通常有必要在输入数据中填充零,以获得比原始数组转换速度快得多的更大的数组。大小为2的幂(2,4,8,16,32,…)的数组处理速度最快。但是,数组的大小是2、3和5的乘积(例如,300 = 55322)的处理效率也很高。

#include <opencv2/core.hpp>
函数说明:int cv::getOptimalDFTSize( int vecsize);
输入参数:		vecsize					给定向量。如果vecsize太大(非常接近INT_MAX),则返回一个负数。
返回值:			N						返回大于或等于vecsize的最小数 N。
// 傅里叶变换
// 高频:变化剧烈的灰度分量,列如边界
// 低频:变化缓慢的灰度分量,例如一边大海
// 高频滤波器:只保留高频,会使得图像细节增强
// 低频滤波器:只保留低频,会使图像变模糊
void test_f()
{Mat img = imread("H:\\数据集\\已标注\\images\\datas\\all_datas\\1616003650999.jpg", IMREAD_GRAYSCALE);img.convertTo(img, CV_32F);// 数据准备// 离散傅里叶变换的运行速度与图像的大小有很大的关系,当图像的尺寸使2,3,5的整数倍时,计算速度最快// 为了达到快速计算的目的,经常通过添加新的边缘像素的方法获取最佳图像尺寸int w1 = getOptimalDFTSize(img.rows);int h1 = getOptimalDFTSize(img.cols);Mat padding;copyMakeBorder(img, padding, 0, w1-img.rows, 0, h1-img.cols, BORDER_CONSTANT,Scalar::all(0));// 执行傅里叶变换// 为傅立叶变换的结果分配存储空间// 将plannes数组组合成一个多通道的数组,两个同搭配,分别保存实部和虚部// 傅里叶变换的结果使复数,这就是说对于每个图像原像素值,会有两个图像值// 此外,频域值范围远远超过图象值范围,因此至少将频域储存在float中// 所以我们将输入图像转换成浮点型,并且多加一个额外通道来存储复数部分Mat planes[] = { Mat_<float>(padding),Mat::zeros(padding.size(),CV_32F) };Mat complexI;// planes[0]是实部,planes[1]是虚部merge(planes, 2,complexI);cout << complexI.size() << endl;cout << planes->size() << endl;dft(complexI, complexI, DFT_SCALE | DFT_COMPLEX_OUTPUT);split(complexI, planes);// 计算幅度普和相位谱Mat ph,mag,idft;phase(planes[0], planes[1], ph);magnitude(planes[0], planes[1], mag);// 重新排列傅里叶图像中的象限,使得原点位于图像中心int cx = mag.cols/2;int cy = mag.rows/2;Mat q1 = mag(Rect(0, 0, cx, cy));Mat q2 = mag(Rect(cx, 0, cx, cy));Mat q3 = mag(Rect(0, cy, cx, cy));Mat q4 = mag(Rect(cx, cy, cx, cy));// 变换左上角和右下角象限Mat tmp;q1.copyTo(tmp);q4.copyTo(q1);tmp.copyTo(q4);// 变换右上角和左下角q2.copyTo(tmp);q3.copyTo(q2);tmp.copyTo(q3);imshow("mag", mag);// 对频域进行滤波操作// 对频域进行滤波操作 高频滤波器,也可以直接这句代替// mag(Rect(cx - 30, cy - 30, 30 * 2, 30 * 2)) = 0;// 如果像素距离图像中心的水平偏差(abs(i - mag.cols / 2))或垂直偏差(abs(j - mag.rows / 2))大于图像尺寸的十分之一(mag.cols / 10 或 mag.rows / 10),则满足条件。for (int i = 0; i < mag.cols; i++) {for (int j = 0; j < mag.rows; j++) {if (abs(i - mag.cols / 2) > mag.cols / 10 || abs(j - mag.rows / 2) > mag.rows / 10)// 0表示低通、1表示高通mag.at<float>(j, i) = 1;}}imshow("mag1", mag);//3.4、变换左上角和右下角象限q1.copyTo(tmp);q4.copyTo(q1);tmp.copyTo(q4);//3.5、变换右上角和左下角象限q2.copyTo(tmp);q3.copyTo(q2);tmp.copyTo(q3);//(4)傅里叶逆变换polarToCart(mag, ph, planes[0], planes[1]);//由幅度谱mag和相位谱ph恢复实部planes[0]和虚部planes[1]merge(planes, 2, idft);dft(idft, idft, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT);//  & -2 操作用于将宽度和高度向下取整为偶数img = idft(cv::Rect(0, 0, img.cols & -2, img.rows & -2));img.convertTo(img, CV_8U);imshow("3", img);waitKey(0);
}

在这里插入图片描述

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

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

相关文章

使用PDFBox调整PDF每页格式

目录 一、内容没有图片 二、内容有图片 maven依赖&#xff0c;这里使用的是pdfbox的2.0.30版本 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency>…

【Android】【Bluetooth Stack】蓝牙电话协议分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

VS Code 跳板机登录服务器(手打密码+秘钥登录)

目录 0.为什么要用跳班机登陆服务器&#xff1f; 1.VS Code插件安装及ssh安装 2.密码链接方式 1&#xff09;添加ssh设置&#xff0c;设置主机 2)设置跳板机 Tips:可以直接通过窗口连接文件管理 3.密钥连接方式&#xff08;更安全更方便&#xff09; 1&#xff09;mac版…

C# 对App.config、Web.config的appSettings节点数据进行加密

appSettings加密原因&#xff0c;就是因为容易暴露服务器账号和密码&#xff0c;而且客户也不允许 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令&#xff1b;aspnet_regiis是提供了直接对配置文件加密的功能的&#xff1b;并且使用aspnet_regiis加密的配置节点在读取…

部署Zabbix Agents添加使能监测服务器_Linux平台_Yum源/Archive多模式

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

使用C语言采用概率分析与随机算法求解特征序列长度下界-以抛硬币问题为例

使用C语言采用概率分析与随机算法求解特征序列长度下界 总结 在概率论与随机算法的研究中&#xff0c;我们经常遇到需要求解某类特定事件发生的概率问题。特别是在处理大量独立随机试验时&#xff0c;如何准确评估某类特殊事件&#xff08;如连续正面特征序列&#xff09;出现的…

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径&#xff0c;改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习&#xff0c;你可以根据该技法&#xff0c;去实现&#xff0c;站点自定义皮肤&#xff0c;手机站和电脑站&#xff0c;其他设备站点&#xff0c;在不…

Python核心编程 --- 高级数据类型

Python核心编程 — 高级数据类型 字符串 列表 元组 字典 1.序列 序列&#xff1a;一组按顺序排列的数据集合。 在Python中存在三种内置的序列类型&#xff1a;字符串、列表、元组 优点&#xff1a;可支持索引和切片操作 特点&#xff1a;第一个正索引为0&#xff0c;指…

基于python+vue学生作业管理系统flask-django-nodejs-php

快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生活方式…

【深度学习】基于机器学习的无机钙钛矿材料形成能预测,预测形成能,神经网络,回归问题

文章目录 任务分析数据处理处理离散数值处理缺失值处理不同范围的数据其他注意事项 我们的数据处理模型训练网页web代码、指导 任务分析 简单来说&#xff0c;就是一行就是一个样本&#xff0c;要用绿色的9个数值&#xff0c;预测出红色的那1个数值。 数据处理 在进行深度数…

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

为什么要写这么一篇介绍ArcGis的文章呢&#xff1f;因为大部分人也包括ArcGisdada&#xff0c;在使用ArcMap应用程序创建工程时总以为我们就是使用了ArcGis这个软件的所有。其实不然&#xff0c;在后期的接触和使用中慢慢发现原来ArcMap只是ArcGis这个综合平台的一部分&#xf…

现在阿里云云服务器租用多少钱?一张表,报价单

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

<c语言学习>结构体

结构体类型 为什么要有结构体 我们用c语言描述年龄时候&#xff0c;可以定义一个整形类型来实现&#xff1a; int age; age 18; printf("年龄为%d",age); (c语言描述年龄) 由于年龄这一属性比较单一&#xff0c;类似性别、某游戏角色攻击力、血量都可以用c语言内置…

string类详解及重要函数实现

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;string类 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱们之前也是…

第十三届蓝桥杯物联网试题(省赛)

做后感悟&#xff1a; OLED显示函数需要一直显示&#xff0c;所以在主函数中要一直循环&#xff0c;为了确保这个检错功能error只输出一次&#xff0c;最好用中断串口进行接收数据&#xff0c;数据收完后自动进入中断函数中&#xff0c;做一次数据检查就好了&#xff0c;该开灯…

银行数字人民币系统应用架构设计

2019年10月&#xff0c;01区块链联合数字资产研究院发布了《人民币3.0&#xff1a;中国央行数字货币运行框架与技术解析》&#xff0c;从数字货币界定和人民币发展历程出发&#xff0c;区分了央行数字货币与比特币、移动支付等的区别&#xff0c;全面介绍了央行数字货币的发展历…

Linux设备驱动开发 - 三色LED呼吸灯分析

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 展锐UIS7885呼吸灯介绍呼吸灯调试方法亮蓝灯亮红灯亮绿灯展锐UIS7885呼吸灯DTS配置ump9620 PMIC驱动ump9620中的LED呼吸灯驱动LED的tr…

代码+视频,R语言logistic回归交互项(交互作用)的可视化分析

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技&#xff0c;几乎在高分的SCI中必出现&#xff0c;因为把人群分为亚组后再进行统计可以增强文章结果的可靠性&#xff0c;不仅如此&#xff0c;交互作用还可以使用来进行数据挖掘。在既往文章中&#xff0c;我们已…

【理解机器学习算法】之分类问题的模型评估(ROC-AUC)

ROC曲线&#xff08;接收者操作特性曲线&#xff09;和AUC&#xff08;曲线下面积&#xff09;是在不同阈值设置下&#xff0c;用于分类问题的性能度量工具。下面是它们所代表的含义以及使用方法&#xff1a; ROC曲线 代表含义&#xff1a;ROC曲线是一个图形化的表示&#xf…

掌握收支明细,轻松记录收支明细,一键打印财务自由

在繁忙的生活中&#xff0c;你是否曾感到对个人的财务状况一头雾水&#xff1f;是否曾在需要证明收支情况时手忙脚乱&#xff0c;翻箱倒柜地寻找凭证&#xff1f;今天&#xff0c;我要向你揭示一个简单而高效的方法&#xff0c;帮助你轻松记录收支明细&#xff0c;并一键打印&a…