ubuntu22.04@laptop OpenCV Get Started: 007_color_spaces

news2024/11/30 12:41:52

ubuntu22.04@laptop OpenCV Get Started: 007_color_spaces

  • 1. 源由
  • 2. 颜色空间
    • 2.1 RGB颜色空间
    • 2.2 LAB颜色空间
    • 2.3 YCrCb颜色空间
    • 2.4 HSV颜色空间
  • 3 代码工程结构
    • 3.1 C++应用Demo
    • 3.2 Python应用Demo
  • 4. 重点分析
    • 4.1 interactive_color_detect
    • 4.2 interactive_color_segment
    • 4.3 data_analysis
      • 4.3.1 黄色
      • 4.3.2 红色
      • 4.3.3 蓝色
      • 4.3.4 绿色
      • 4.3.5 橙色
  • 5. 总结
  • 6. 参考资料
  • 7. 补充

1. 源由

在本章中,将了解计算机视觉中使用的流行颜色空间,并将其用于基于颜色的分割。

  • 不同颜色空间定义
  • 基于颜色图像分割

记得曾经有人谈到,什么是科学? 或者说对于我们来说科学的定义是什么?

Science is a rigorous, systematic endeavor that builds and organizes knowledge in the form of testable explanations and predictions about the world.

这里话题稍微展开一些,因为,从工程技术的角度来说,个人感觉国内目前更多偏于浮躁,注重功利性。因为,目前工程技术在企业、社会上更多的认知是解决问题。

从个人的观点来看,其实科学的定义在wiki百科上讲的非常清楚,换言之,讲的是逻辑和道理。

  • 知识体系
  • 可解释
  • 可预测

因为企业的逐利性,社会的导向性,过于表面的注重解决实际应用问题,而忽略了逻辑和道理。导致很多表现上只要解决问题,就觉得好了,成功了。而真正的本质没有讲清楚或者深入研究清楚,进而无法将科学更好的应用于生产力。

通常也是大家可以看到,很多人似乎能解决问题,但是无法用言语表达清楚,甚至用纸笔记录下来,因为这些问题的解决是一种表象,内部实质问题没有了解清楚。

我可能多说了很多“废话”,希望国内这种浮躁的科学技术作风能有所改善!

2. 颜色空间

颜色空间可以简单的理解为色彩在不同坐标系下的展开方式。

正交坐标系统,通常理解为不同单位向量之间是解耦的关系。对于非正交系统来说,单位向量有松耦合,甚至紧耦合的关系。而颜色在不同坐标系统下的展开也会影响到对于特征的判断。

在计算机视觉里面也有类似的问题,这是一个物理到计算机语言的表达过程。这里就凸显基础学科的重要性,通过定义,基本原理和逻辑来给出解决方案。当然应用方面,“拿来主义”也能出色的完成工作,但是背后的逻辑思路,以及遇到复杂问题的分析能力将会在后续的研发、研究上阻碍技术的发展。

希望通过这些点滴思考,能够对于当下社会浮躁研发氛围有所触发和讨论。当然,总的方向是好的,只不过。。。。

大体上计算机视觉上有以下颜色空间:

  • RGB颜色空间
  • LAB颜色空间
  • YCrCb颜色空间
  • HSV颜色空间

2.1 RGB颜色空间

定义:

A linear combination of Red, Green, and Blue values.
The three channels are correlated by the amount of light hitting the surface.

下面是同一个物体在不同光照条件下的对比分析:

在这里插入图片描述

  • 显著的感知不一致性
  • 色度(颜色相关信息)和亮度(强度相关信息)数据的混合

换句话说:其坐标系是非解耦的,有相关性;当亮度变化的时候,RGB都会发生变化。

默认读入的文件数据就是BGR格式:

C++:

//C++
bright = cv::imread('cube1.jpg')
dark = cv::imread('cube8.jpg')

Python:

#python
bright = cv2.imread('cube1.jpg')
dark = cv2.imread('cube8.jpg')

2.2 LAB颜色空间

定义:

L – Lightness ( Intensity ).
a – color component ranging from Green to Magenta.
b – color component ranging from Blue to Yellow.

下面是同一个物体在不同光照条件下的对比分析:
在这里插入图片描述

  • 感知均匀的颜色空间,近似于我们感知颜色的方式
  • 独立于设备(捕捉或显示)
  • 在Adobe Photoshop中广泛使用
  • 通过一个复杂的变换方程与RGB颜色空间相关的。

BGR转换:
C++:

//C++
cv::cvtColor(bright, brightLAB, cv::COLOR_BGR2LAB);
cv::cvtColor(dark, darkLAB, cv::COLOR_BGR2LAB);

Python:

#python
brightLAB = cv2.cvtColor(bright, cv2.COLOR_BGR2LAB)
darkLAB = cv2.cvtColor(dark, cv2.COLOR_BGR2LAB)

2.3 YCrCb颜色空间

定义:

Y – Luminance or Luma component obtained from RGB after gamma correction.
Cr = R – Y ( how far is the red component from Luma ).
Cb = B – Y ( how far is the blue component from Luma ).

下面是同一个物体在不同光照条件下的对比分析:
在这里插入图片描述

  • 亮度与LAB类似的
  • 与LAB相比,即使在室外图像中,红色和橙色之间的感知差异也较小
  • 白色的所有三个组成部分都发生了变化

BGR转换:
C++:

//C++
cv::cvtColor(bright, brightYCB, cv::COLOR_BGR2YCrCb);
cv::cvtColor(dark, darkYCB, cv::COLOR_BGR2YCrCb);

Python:

#python
brightYCB = cv2.cvtColor(bright, cv2.COLOR_BGR2YCrCb)
darkYCB = cv2.cvtColor(dark, cv2.COLOR_BGR2YCrCb)

2.4 HSV颜色空间

定义:

H – Hue ( Dominant Wavelength ).
S – Saturation ( Purity / shades of the color ).
V – Value ( Intensity ).

下面是同一个物体在不同光照条件下的对比分析:
在这里插入图片描述

  • H分量在两个图像中都非常相似,这表明即使在照明变化的情况下颜色信息也是完整的
  • S分量在两幅图像中也非常相似
  • V分量捕捉落在其上的光量,因此它会因照明变化而变化
  • 室外和室内图像的红色部分的值之间存在巨大差异。这是因为色调表示为一个圆形,而红色处于起始角度。因此,它可以取介于[300360]和[0,60]之间的值

BGR转换:
C++:

//C++
cv::cvtColor(bright, brightHSV, cv::COLOR_BGR2HSV);
cv::cvtColor(dark, darkHSV, cv::COLOR_BGR2HSV);

Python:

#python
brightHSV = cv2.cvtColor(bright, cv2.COLOR_BGR2HSV)
darkHSV = cv2.cvtColor(dark, cv2.COLOR_BGR2HSV)

3 代码工程结构

3.1 C++应用Demo

C++应用Demo工程结构:

007_color_spaces/CPP$ tree . -L 1
.
├── CMakeLists.txt
├── interactive_color_detect.cpp
├── interactive_color_segment.cpp
├── images
└── pieces

2 directories, 3 files

C++示例编译前,确认OpenCV安装路径:

$ find /home/daniel/ -name "OpenCVConfig.cmake"
/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/
/home/daniel/OpenCV/opencv/build/OpenCVConfig.cmake
/home/daniel/OpenCV/opencv/build/unix-install/OpenCVConfig.cmake


$ export OpenCV_DIR=/home/daniel/OpenCV/installation/opencv-4.9.0/lib/cmake/opencv4/

C++应用Demo工程编译执行:

$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release
$ cd ..
$ ./build/interactive_color_detect
$ ./build/interactive_color_segment

3.2 Python应用Demo

Python应用Demo工程结构:

007_color_spaces/Python$ tree . -L 1
.
├── data_analysis.py
├── interactive_color_detect.py
├── interactive_color_segment.py
├── images
└── pieces

2 directories, 3 files

Python应用Demo工程执行:

$ sudo apt-get install tcl-dev tk-dev python-tk python3-tk
$ workoncv-4.9.0
$ pip install PyQt5 PySide2
$ python interactive_color_detect.py
$ python interactive_color_segment.py
$ python data_analysis.py

4. 重点分析

4.1 interactive_color_detect

  • cvtColor(src, dst, code)

获取图像数据中一个点的色彩坐标数据:

C++:

Vec3b bgrPixel(img.at<Vec3b>(y, x));
        
Mat3b hsv,ycb,lab;
// Create Mat object from vector since cvtColor accepts a Mat object
Mat3b bgr (bgrPixel);
        
//Convert the single pixel BGR Mat to other formats
cvtColor(bgr, ycb, COLOR_BGR2YCrCb);
cvtColor(bgr, hsv, COLOR_BGR2HSV);
cvtColor(bgr, lab, COLOR_BGR2Lab);
        
//Get back the vector from Mat
Vec3b hsvPixel(hsv.at<Vec3b>(0,0));
Vec3b ycbPixel(ycb.at<Vec3b>(0,0));
Vec3b labPixel(lab.at<Vec3b>(0,0));

Python:

# get the value of pixel from the location of mouse in (x,y)
bgr = img[y,x]

# Convert the BGR pixel into other colro formats
ycb = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2YCrCb)[0][0]
lab = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2Lab)[0][0]
hsv = cv2.cvtColor(np.uint8([[bgr]]),cv2.COLOR_BGR2HSV)[0][0]

4.2 interactive_color_segment

  • inRange(src, lowerb, upperb, dst )
  • bitwise_and(src1, src2, dst, mask)

使用mask过滤图像数据:

C++:

// Get values from the BGR trackbar
BMin = getTrackbarPos("BMin", "SelectBGR");
GMin = getTrackbarPos("GMin", "SelectBGR");
RMin = getTrackbarPos("RMin", "SelectBGR");

BMax = getTrackbarPos("BMax", "SelectBGR");
GMax = getTrackbarPos("GMax", "SelectBGR");
RMax = getTrackbarPos("RMax", "SelectBGR");

minBGR = Scalar(BMin, GMin, RMin);
maxBGR = Scalar(BMax, GMax, RMax);

// Get values from the HSV trackbar
HMin = getTrackbarPos("HMin", "SelectHSV");
SMin = getTrackbarPos("SMin", "SelectHSV");
VMin = getTrackbarPos("VMin", "SelectHSV");

HMax = getTrackbarPos("HMax", "SelectHSV");
SMax = getTrackbarPos("SMax", "SelectHSV");
VMax = getTrackbarPos("VMax", "SelectHSV");

minHSV = Scalar(HMin, SMin, VMin);
maxHSV = Scalar(HMax, SMax, VMax);

// Get values from the LAB trackbar
LMin = getTrackbarPos("LMin", "SelectLAB");
aMin = getTrackbarPos("AMin", "SelectLAB");
bMin = getTrackbarPos("BMin", "SelectLAB");

LMax = getTrackbarPos("LMax", "SelectLAB");
aMax = getTrackbarPos("AMax", "SelectLAB");
bMax = getTrackbarPos("BMax", "SelectLAB");

minLab = Scalar(LMin, aMin, bMin);
maxLab = Scalar(LMax, aMax, bMax);

// Get values from the YCrCb trackbar
YMin = getTrackbarPos("YMin", "SelectYCB");
CrMin = getTrackbarPos("CrMin", "SelectYCB");
CbMin = getTrackbarPos("CbMin", "SelectYCB");

YMax = getTrackbarPos("YMax", "SelectYCB");
CrMax = getTrackbarPos("CrMax", "SelectYCB");
CbMax = getTrackbarPos("CbMax", "SelectYCB");

minYCrCb = Scalar(YMin, CrMin, CbMin);
maxYCrCb = Scalar(YMax, CrMax, CbMax);

// Convert the BGR image to other color spaces
original.copyTo(imageBGR);
cvtColor(original, imageHSV, COLOR_BGR2HSV);
cvtColor(original, imageYCrCb, COLOR_BGR2YCrCb);
cvtColor(original, imageLab, COLOR_BGR2Lab);

// Create the mask using the min and max values obtained from trackbar and apply bitwise and operation to get the results
inRange(imageBGR, minBGR, maxBGR, maskBGR);
resultBGR = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultBGR, maskBGR);

inRange(imageHSV, minHSV, maxHSV, maskHSV);
resultHSV = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultHSV, maskHSV);

inRange(imageYCrCb, minYCrCb, maxYCrCb, maskYCrCb);
resultYCrCb = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultYCrCb, maskYCrCb);

inRange(imageLab, minLab, maxLab, maskLab);
resultLab = Mat::zeros(original.rows, original.cols, CV_8UC3);
bitwise_and(original, original, resultLab, maskLab);

// Show the results
imshow("SelectBGR", resultBGR);
imshow("SelectYCB", resultYCrCb);
imshow("SelectLAB", resultLab);
imshow("SelectHSV", resultHSV);

Python:

# Get values from the BGR trackbar
BMin = cv2.getTrackbarPos('BGRBMin','SelectBGR')
GMin = cv2.getTrackbarPos('BGRGMin','SelectBGR')
RMin = cv2.getTrackbarPos('BGRRMin','SelectBGR')
BMax = cv2.getTrackbarPos('BGRBMax','SelectBGR')
GMax = cv2.getTrackbarPos('BGRGMax','SelectBGR')
RMax = cv2.getTrackbarPos('BGRRMax','SelectBGR')
minBGR = np.array([BMin, GMin, RMin])
maxBGR = np.array([BMax, GMax, RMax])

# Get values from the HSV trackbar
HMin = cv2.getTrackbarPos('HMin','SelectHSV')
SMin = cv2.getTrackbarPos('SMin','SelectHSV')
VMin = cv2.getTrackbarPos('VMin','SelectHSV')
HMax = cv2.getTrackbarPos('HMax','SelectHSV')
SMax = cv2.getTrackbarPos('SMax','SelectHSV')
VMax = cv2.getTrackbarPos('VMax','SelectHSV')
minHSV = np.array([HMin, SMin, VMin])
maxHSV = np.array([HMax, SMax, VMax])

# Get values from the LAB trackbar
LMin = cv2.getTrackbarPos('LABLMin','SelectLAB')
AMin = cv2.getTrackbarPos('LABAMin','SelectLAB')
BMin = cv2.getTrackbarPos('LABBMin','SelectLAB')
LMax = cv2.getTrackbarPos('LABLMax','SelectLAB')
AMax = cv2.getTrackbarPos('LABAMax','SelectLAB')
BMax = cv2.getTrackbarPos('LABBMax','SelectLAB')
minLAB = np.array([LMin, AMin, BMin])
maxLAB = np.array([LMax, AMax, BMax])

# Get values from the YCrCb trackbar
YMin = cv2.getTrackbarPos('YMin','SelectYCB')
CrMin = cv2.getTrackbarPos('CrMin','SelectYCB')
CbMin = cv2.getTrackbarPos('CbMin','SelectYCB')
YMax = cv2.getTrackbarPos('YMax','SelectYCB')
CrMax = cv2.getTrackbarPos('CrMax','SelectYCB')
CbMax = cv2.getTrackbarPos('CbMax','SelectYCB')
minYCB = np.array([YMin, CrMin, CbMin])
maxYCB = np.array([YMax, CrMax, CbMax])

# Convert the BGR image to other color spaces
imageBGR = np.copy(original)
imageHSV = cv2.cvtColor(original,cv2.COLOR_BGR2HSV)
imageYCB = cv2.cvtColor(original,cv2.COLOR_BGR2YCrCb)
imageLAB = cv2.cvtColor(original,cv2.COLOR_BGR2LAB)

# Create the mask using the min and max values obtained from trackbar and apply bitwise and operation to get the results         
maskBGR = cv2.inRange(imageBGR,minBGR,maxBGR)
resultBGR = cv2.bitwise_and(original, original, mask = maskBGR)         

maskHSV = cv2.inRange(imageHSV,minHSV,maxHSV)
resultHSV = cv2.bitwise_and(original, original, mask = maskHSV)

maskYCB = cv2.inRange(imageYCB,minYCB,maxYCB)
resultYCB = cv2.bitwise_and(original, original, mask = maskYCB)         

maskLAB = cv2.inRange(imageLAB,minLAB,maxLAB)
resultLAB = cv2.bitwise_and(original, original, mask = maskLAB)         

# Show the results
cv2.imshow('SelectBGR',resultBGR)
cv2.imshow('SelectYCB',resultYCB)
cv2.imshow('SelectLAB',resultLAB)
cv2.imshow('SelectHSV',resultHSV)

4.3 data_analysis

在4.2章节中,已经通过一个范围来对图像进行过滤,通过示例,可以看出RGB来进行过滤,在亮度发生变化的时候,其分类的效果非常差,简直不可用。

从实际情况来看,期望在颜色分量上,能够存在一个稳定的区间来进行过滤或判别。

本章节采用颜色空间色坐标上的数值来看图像的一致性(可辨性)。

  • RGB空间:GB,RB,GR
  • HSV空间:SH
  • YCrCb空间:CbCr
  • LAB空间:BA

由图可以看出,总体上LAB颜色空间的线性比例关系是最好,最易于用来进行颜色判别的。

详见代码:data_analysis.py

4.3.1 黄色

黄色

4.3.2 红色

红色

4.3.3 蓝色

蓝色

4.3.4 绿色

绿色

4.3.5 橙色

在这里插入图片描述

5. 总结

经过上面实验和讨论,可以比较清晰的看出,在颜色空间做颜色分类的时候,亮度(光照)对于RGB色坐标的影响是比较大的。

在计算机视觉应用这块,当遇到颜色分类的时候,可以使用LAB颜色空间,基于该AB坐标与亮度非耦合的特性来做分割应用会更加合适。

6. 参考资料

【1】ubuntu22.04@laptop OpenCV Get Started
【2】ubuntu22.04@laptop OpenCV安装
【3】ubuntu22.04@laptop OpenCV定制化安装

7. 补充

学习是一种过程,这里关于《ubuntu22.04@laptop OpenCV Get Started》的记录也是过程。因此,很多重复的代码或者注释,就不会展开讨论,甚至提及。

有兴趣了解更多的朋友,请从[《ubuntu22.04@laptop OpenCV Get Started》](ubuntu22.04@laptop OpenCV Get Started)开始,一个章节一个章节的了解,循序渐进。

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

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

相关文章

docker 2:安装

docker 2&#xff1a;安装 ‍ ubuntu 安装 docker sudo apt install docker.io‍ 把当前用户放进 docker 用户组&#xff0c;避免每次运行 docker 命都要使用 sudo​ 或者 root​ 权限。 sudo usermod -aG docker $USER​id $USER ​看到用户已加入 docker 组 ​​ ‍ …

【深度学习】S2 数学基础 P1 线性代数(上)

目录 基本数学对象标量与变量向量矩阵张量降维求和非降维求和累计求和 点积与向量积点积矩阵-向量积矩阵-矩阵乘法 深度学习的三大数学基础 —— 线性代数、微积分、概率论&#xff1b; 自本篇博文以下几遍博文&#xff0c;将对这三大数学基础进行重点提炼。 本节博文将介绍线…

LeetCode、72. 编辑距离【中等,二维DP】

文章目录 前言LeetCode、72. 编辑距离【中等&#xff0c;二维DP】题目链接与分类二维DP 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容…

C++笔记1:操纵符输入输出

C操纵符用来控制输出控制&#xff0c;一是输出的形式&#xff0c;二是控制补白的数量和位置。本文记录一下&#xff0c;在一些笔试的ACM模式可能有用。其中1-4节的部分是关于格式化输入输出操作&#xff0c;5-6节的部分是关于未格式化输入输出操作。 1. 控制布尔值的格式 一般…

嵌入式Qt 计算器界面设计

一.计算器界面设计 计算机界面程序分析&#xff1a; 需要用到的组件&#xff1a; 界面设计&#xff1a; 界面设计实现&#xff1a; 实验1&#xff1a;计算器界面设计 #include <QtGui/QApplication> #include <QWidget> //主窗口 #include <QLineEdit> //文…

医院排队叫号系统的设计与实践

随着医疗服务需求的增加&#xff0c;医院排队叫号系统成为了现代医院管理的必备工具。它不仅可以提高医院服务效率&#xff0c;减少患者等待时间&#xff0c;还可以优化医院资源利用&#xff0c;提升患者就诊体验。本文将介绍医院排队叫号系统的设计与实践&#xff0c;包括系统…

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …

三分钟教你如何把不要钱的ChatGPT3.5用出花钱4.0的效果!

三分钟教你如何把不要钱的ChatGPT3.5用出花钱4.0的效果&#xff01; 关注微信公众号 DeepGo 计算机杂谈及深度学习记录&分享 上一期我们聊到 ChatGPT4.0确实在各方面都优于3.5 花了钱的就是不一样 但我们有没有办法去弥补这一差距呢&#xff1f; 今天我就来教你 转发出去让…

海量数据处理商用短链接生成器平台 - 4

第六章 架构核心技术-池化思想-异步结合 性能优化最佳实践 第1集 RestTemplate里面的存在的问题你知道多少- Broken pipe错误 项目就更新到第六章了&#xff0c;剩下的内容 放百度网盘里面了&#xff0c;需要的来取。 链接&#xff1a;https://pan.baidu.com/s/19LHPw36dsxPB7…

推荐一门 MIT 的计算机入门课

你好&#xff0c;我是坚持分享干货的 EarlGrey&#xff0c;翻译出版过《Python编程无师自通》、《Python并行计算手册》等技术书籍。 如果我的分享对你有帮助&#xff0c;请关注我&#xff0c;一起向上进击。 计算机科学及编程导论在MIT的课程编号是6.00.1&#xff0c;是计算机…

Pytorch学习03_TensorBoard使用02

Opencv读取图片&#xff0c;获得numpy型数据类型 复制图片的相对路径 目前这种type不适用&#xff0c;考虑用numpy类型 安装opencv&#xff0c;在pytorch环境下 pip install opencv-python 导入numpy import numpy as np 将PIL类型的img转换为 NumPy 数组 img_arraynp.array…

VC++ 绘制折线学习

win32 有三个绘制折线的函数&#xff1b; Polyline&#xff0c;根据给定点数组绘制折线&#xff1b; PolylineTo&#xff0c;除了绘制也更新当前位置&#xff1b; PolyPolyline&#xff0c;绘制多条折线&#xff0c;第一个参数是点数组&#xff0c;第二个参数是一个数组、指…

【教学类-48-04】202402013“天干地支 六十一甲子”.

背景需求&#xff1a; 2024年是甲辰龙年。 “辛亥革命”“甲午海战”"戊戌变法”都有天干地支的身影。 参观历史建筑&#xff0c;不少书法碑刻上都是用天干地支进行年代记名 所以我用Python来制作60一甲子的所有天干地支组合 60一甲子 天干地支的排序 作者&#xff1a;阿…

【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 文章目录 【Kotlin语言学习】系列文章一、Kotlin介绍二、学习路径 一、…

片上网络NoC(4)——直连拓扑

目录 一、前言 二、直连拓扑 三、总结 一、前言 本文中&#xff0c;我们将继续介绍片上网络中拓扑相关的内容&#xff0c;主要介绍直连拓扑&#xff0c;在此之前&#xff0c;我们已经介绍过了拓扑的指标&#xff0c;这将是继续阅读本文的基础&#xff0c;还没有了解相关内容…

GEE:CART(Classification and Regression Trees)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

Spring Boot 笔记 012 创建接口_添加文章分类

1.1.1 实体类添加校验 package com.geji.pojo;import jakarta.validation.constraints.NotEmpty; import lombok.Data;import java.time.LocalDateTime;Data public class Category {private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称NotEmptypriva…

华为机考入门python3--(13)牛客13-句子逆序

分类&#xff1a;列表 知识点&#xff1a; 列表逆序&#xff08;和字符串逆序是一样的&#xff09; my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…

车载诊断协议DoIP系列 —— DoIP应用(Application)需求

车载诊断协议DoIP系列 —— DoIP应用(Application)需求 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一…

Java基于微信小程序的电子竞技信息交流平台

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…