图像处理学习笔记(一)
本文主要介绍,以供读者能够理解该技术的定义、原理、应用。
🎬个人简介:一个全栈工程师的升级之路!
📋个人专栏:ISP处理
🎀CSDN主页 发狂的小花
🌄人生秘诀:学习的本质就是极致重复!
目录
1椒盐噪声
2 中值模糊
3 高斯滤波的优化方法(分离高斯滤波)
3 PIL 库
4 Matplotlib
5 Jupyter notebook
6 Python图像处理步骤
7 Numpy 数组和普通数组的区别
7 .bss ..data段
1椒盐噪声
椒盐噪声是**图像中常见的一种噪声,表现为随机分布的白色或黑色像素点**。其特点和处理方法如下:
1. **特点**:
- 表现为图像中的白点或黑点,即在亮的区域出现黑色像素,或在暗的区域出现白色像素。
- 这种噪声通常由图像传感器、传输信道或解码处理等环节产生。
- 由于信号脉冲强度的影响而产生的噪声,算法上相对简单,但会对图像质量造成影响。
2. **处理方法**:
- **中值滤波**:是一种常用的去除椒盐噪声的方法,通过替换像素值为其邻近像素的中值来消除噪声。
- **排序滤波**:类似于中值滤波,通过排序邻近像素值并选择中间值替换原有像素值来减少噪声的影响。
总的来说,了解和掌握椒盐噪声的特点和处理方法对于图像处理是非常重要的,因为噪声会直接影响到图像分割、特征提取、图像识别等后续处理步骤的效果。
2 中值模糊
中值模糊的原理是**基于统计排序的非线性滤波方法**。
中值模糊是一种图像处理技术,它通过**选取像素邻域内的中值来替代中心像素的值**,从而达到模糊图像的效果。这种方法对于去除图像中的椒盐噪声(即随机出现的白点或黑点)特别有效。与线性滤波器如均值模糊和高斯模糊不同,中值模糊不会对图像造成模糊问题,因为它不是通过平均像素值来实现平滑效果,而是通过选择一系列像素中的中值来实现。
具体来说,中值模糊的处理步骤如下:
1. **选择滑动窗口大小**:确定一个奇数大小的窗口,这个窗口将在图像上滑动,用于选取像素进行排序。
2. **对窗口内像素进行排序**:在每个窗口位置,对窗口内的像素值进行排序。
3. **取中值替代中心像素**:将排序后的中值作为当前窗口中心像素的新值。
4. **移动窗口**:窗口按照一定步长移动到下一个位置,重复上述过程,直到整个图像处理完毕。
总的来说,中值模糊因其独特的处理方式,在保持图像边缘锐度的同时,能有效减少噪声,尤其适用于那些细节丰富或包含大量尖角、线条的图像。由于其不依赖于像素的统计特性,因此在不知道噪声具体分布的情况下也能使用,这在一定程度上增加了其适用性和灵活性。在实际应用中,中值模糊通常通过OpenCV库中的`cv2.medianBlur()`函数来实现,该函数接受一个参数,即滑动窗口的大小。
3 高斯滤波的优化方法(分离高斯滤波)
高斯滤波的优化方法通常包括以下几种:
分离高斯滤波:由于高斯函数具有可分离性,可以将二维高斯滤波器分解为两个一维滤波器的顺序应用,这大大减少了计算量。首先应用一个一维高斯滤波器进行水平方向的卷积,然后再用另一个一维高斯滤波器进行垂直方向的卷积。
StackBlur近似:这种方法通过多次应用均值滤波器来近似高斯滤波的效果。虽然这种方法并不是精确的高斯滤波,但在某些情况下可以作为一种快速近似方法。
频域高斯滤波:在频率域中实现高斯滤波也是一种优化方法。通过将图像转换到频率域,应用高斯滤波器,然后再转换回空间域,有时可以更高效地处理图像。
此外,对于小半径的高斯滤波器,可以通过查表或其他优化算法来减少计算量,因为小半径意味着需要处理的数据量更少。
#include <iostream>
#include <string>
#include <vector>
#include <chrono>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <math.h>
#include <stdint.h>using namespace std;
using namespace cv;// 定义常量
#define PI 3.14159265358979323846
#define SIGMA 1.0
#define KERNEL_SIZE 5// 定义一维高斯函数
float gaussian(int x, float sigma) {return exp(-x * x / (2 * sigma * sigma)) / (sqrt(2 * PI) * sigma);
}// 定义二维高斯函数
float gaussian2d(int x, int y, float sigma) {return exp(-(x * x + y * y) / (2 * sigma * sigma)) / (2 * PI * sigma * sigma);
}// 定义分离高斯滤波函数
void separable_gaussian_filter(unsigned char* input, unsigned char* output, int width, int height, float sigma) {// 创建水平方向的高斯核float kernel[KERNEL_SIZE];for (int i = 0; i < KERNEL_SIZE; i++) {kernel[i] = gaussian(i - KERNEL_SIZE / 2, sigma);}// 对输入图像进行水平方向的卷积for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {float sum = 0;for (int k = 0; k < KERNEL_SIZE; k++) {int index = x + k - KERNEL_SIZE / 2;if (index >= 0 && index < width) {sum += input[y * width + index] * kernel[k];}}output[y * width + x] = (unsigned char)(sum + 0.5); // 四舍五入取整}}// 创建垂直方向的高斯核float kernel2[KERNEL_SIZE];for (int i = 0; i < KERNEL_SIZE; i++) {kernel2[i] = gaussian(i - KERNEL_SIZE / 2, sigma);}// 对输出图像进行垂直方向的卷积for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {float sum = 0;for (int k = 0; k < KERNEL_SIZE; k++) {int index = y + k - KERNEL_SIZE / 2;if (index >= 0 && index < height) {sum += output[index * width + x] * kernel2[k];}}output[y * width + x] = (unsigned char)(sum + 0.5); // 四舍五入取整}}
}int main() {// 读取输入图像数据(此处省略)uint8_t inputBuff[640*400];uint8_t outputBuff[640*400];int width = 640; // 图像宽度int height = 400; // 图像高度Mat img = imread("./data/left.png", 0);cout << img.cols << img.rows << endl;// 640x400,400 rows 640 colsfor (int i = 0;i < height;i++){for (int j = 0;j < width;j++){inputBuff[i*width+j] = img.ptr<uint8_t>(i)[j];}}unsigned char* input = inputBuff; // 输入图像数据数组unsigned char* output = outputBuff; // 输出图像数据数组// 调用分离高斯滤波函数separable_gaussian_filter(input, output, width, height, SIGMA);cv::Mat out_image = cv::Mat(cv::Size(640,400), CV_8UC1, output);cv::imshow("Image",img);cv::imshow("OUTImage",out_image);cv::waitKey(0);return 0;
}
3 PIL 库
PIL库,全称Python Imaging Library,是一个功能强大且易于使用的Python图像处理库。
PIL库最初仅支持Python 2.7版本,但由于其长时间未更新,社区的志愿者们在PIL的基础上创建了兼容Python 3的版本,即Pillow库。Pillow库是PIL的一个友好分支,它提供了与PIL相似的接口,并且增加了许多新特性和改进,同时支持Python 3。Pillow库是目前广泛使用的Python图像处理库,它提供了一系列强大的功能,包括但不限于:
图像的打开、读写和保存:可以使用Pillow库中的Image模块轻松地打开各种格式的图像文件,并进行读写操作。
图像转换:Pillow支持图像格式的转换,以及颜色空间的转换,如RGB与灰度之间的转换。
图像编辑:可以对图像进行裁剪、旋转、翻转、调整大小等各种编辑操作。
图像合成:可以将多个图像层叠合并,或者将图像的一部分粘贴到另一张图像上。
绘制几何图形和文字:Pillow库还提供了在图像上绘制几何形状和文字的功能。
4 Matplotlib
**Matplotlib是一个强大的Python绘图库,广泛用于数据可视化**。
Matplotlib是Python中一个非常流行的绘图库,它提供了丰富的功能来帮助用户创建各种静态、动态甚至交互式的图表。以下是关于Matplotlib的一些详细信息:
- **作用**:Matplotlib能够生成多种类型的图形,如线图、散点图、柱状图、饼图等。它支持多种操作系统和后端,可以输出到屏幕或者保存为各种格式的图像文件。此外,Matplotlib可以与NumPy和SciPy等科学计算库集成,使得数据分析和机器学习领域的可视化任务变得更加便捷。
- **安装方法**:安装Matplotlib通常可以通过pip命令来完成,使用`pip install matplotlib`即可轻松安装。不过,由于Matplotlib依赖于一些其他包,可能需要确保系统中已经安装了这些依赖包。
- **基本用法**:在绘制图形时,通常会结合使用Matplotlib中的`pyplot`模块,它提供了类似于MATLAB的接口。例如,要绘制一个简单的正弦函数图形,可以使用`plt.plot(x, np.sin(x))`来绘制曲线,其中`x`是一组数值,`np.sin(x)`是对应的正弦值。
- **应用场景**:Matplotlib适用于需要进行数据可视化的各种场景,特别是在数据科学和机器学习领域。它可以帮助研究人员和开发者更好地理解数据模式和趋势,以及在模型训练过程中监控进度和性能。
总的来说,Matplotlib是一个非常有用的工具,无论是对于数据分析师还是科研人员,都是一个很好的选择。通过学习Matplotlib的基本用法和高级特性,可以有效地提升数据分析和可视化的能力。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef gaussian(x, mu, sigma):return 1 / (sigma * np.sqrt(2 * np.pi)) * np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))def gaussian_2d(x, y, mu, sigma):return 1 / (2 * np.pi * sigma ** 2) * np.exp(-((x - mu[0]) ** 2 + (y - mu[1]) ** 2) / (2 * sigma ** 2))x = np.linspace(-10, 10, 1000)
y = gaussian(x, 0, 1)plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('y')
plt.title('Gaussian Function')
# plt.show()
plt.savefig('Gaussian1d.jpg')x = np.linspace(-10, 10, 100)
y = np.linspace(-10, 10, 100)
X, Y = np.meshgrid(x, y)
Z = gaussian_2d(X, Y, [0, 0], 1)fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, Z)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# plt.show()
plt.savefig('Gaussian2d.jpg')
5 Jupyter notebook
在Jupyter Notebook中运行代码并显示图像的具体步骤如下:
打开终端或命令提示符。
输入jupyter notebook并按Enter键,这将在你的默认浏览器中打开Jupyter Notebook。
在Jupyter Notebook的主界面,点击右上角的“New”按钮,然后选择“Python 3”(或者你安装的其他Python版本)。
在新打开的Notebook中,你可以在单元格中编写Python代码。
为了显示图像,你可以使用matplotlib库。确保你已经安装了matplotlib和numpy(如果需要的话)。
选中包含代码的单元格,按Shift + Enter运行单元格中的代码。
如果一切正常,图像将在单元格下方显示。
在Notebook的菜单栏中,点击“File”然后选择“Save and Checkpoint”来保存你的工作。
完成工作后,可以在菜单栏中选择“File” -> “Close and Halt”来关闭Notebook。
如果你在Notebook中运行matplotlib绘图代码,图像应该会直接在输出区域显示。如果在Jupyter Notebook中仍然遇到问题,请确保你的matplotlib后端配置正确。你可以通过以
6 Python图像处理步骤
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np# 打开彩色图像
image = Image.open('./cat.png')# 将图像转换为 NumPy 数组
image_array = np.array(image)# 分离通道
red_channel = image_array[:, :, 0]green_channel = image_array[:, :, 1]blue_channel = image_array[:, :, 2]# 显示原始图像和各个通道
plt.subplot(221), plt.imshow(image), plt.title('Original Image')plt.subplot(222), plt.imshow(blue_channel, cmap='Blues'), plt.title('Blue Channel')plt.subplot(223), plt.imshow(green_channel, cmap='Greens'), plt.title('Green Channel')plt.subplot(224), plt.imshow(red_channel, cmap='Reds'), plt.title('Red Channel')# 保存图像到文件plt.savefig('output.png')
这段代码的主要功能是打开一张彩色图像,将其转换为NumPy数组,然后分离出红、绿、蓝三个通道,并将原始图像和各个通道的图像显示出来。
详细解释:
1. 导入所需的库:PIL(Python Imaging Library)用于处理图像,numpy用于处理数组,matplotlib.pyplot用于绘图。
2. 使用PIL库的Image模块打开一张名为'cat.png'的彩色图像。
3. 将图像转换为NumPy数组,方便后续处理。
4. 分离出图像的红、绿、蓝三个通道。
5. 使用matplotlib.pyplot绘制子图,分别显示原始图像和各个通道的图像。
6. 最后一行代码注释掉了`plt.show()`,改为使用`plt.savefig('rgb.png')`将图像保存为'rgb.png'文件。
7 Numpy 数组和普通数组的区别
Numpy中的数组(ndarray)与Python原生的数组(list)主要有以下区别:
1. 存储方式:ndarray是连续的内存块,而list则是指向对象的指针的集合。这意味着ndarray在存储和访问数据时更加高效,因为它们在内存中的位置是连续的,而不是分散的。
2. 数据类型:ndarray中的所有元素都必须具有相同的数据类型,而list可以包含不同类型的元素。这使得ndarray在执行数值计算时更加高效,因为它不需要处理不同数据类型的转换。
3. 函数库支持:Numpy提供了大量用于操作ndarray的函数,这些函数在执行数学运算、线性代数、统计等方面的任务时非常高效。相比之下,list没有这些专门针对其结构的函数库。
4. 性能:由于ndarray的存储方式和数据类型的特点,它们在执行大规模数值计算时通常比list更快。此外,Numpy还利用了向量化计算的优势,可以对整个数组进行操作,而无需使用循环。
5. 索引和切片:ndarray支持更灵活的索引和切片操作,例如整数数组、布尔数组等。这使得在处理数据时更加方便和高效。
6. 广播:Numpy具有广播功能,可以自动将形状不同的数组扩展到相同的形状并进行逐元素操作。这使得在进行数学运算时更加方便,而无需手动处理不同形状的数组。
总之,Numpy中的ndarray与Python原生的list相比,具有更高的性能、更丰富的功能和更好的兼容性。在进行数值计算和数据处理时,ndarray通常是更好的选择。
7 .bss ..data段
1、bss段(Block Started Symbol,意为“以符号开始的块”),只是简单维护地址空间中开始和结束的地址,在实际运行对内存区域有效地清零即可。bss段存放 全局未初始化/初始化为0、静态未初始化/初始化为0的变量, 在磁盘上并不占用相应的磁盘空间。
2、data段,存放的是 全局初始化(初始化非0)、静态初始化(初始化非0)的变量,在磁盘中占用相应的磁盘空间,这些变量在程序开始之前具有具体值,是可执行文件的一部分,当程序执行运行时,将可执行文件加载到内存中,读取相应的变量值。
3、bss段维护的是0值的数据变量,不需要占据相应的磁盘空间,data段存放的是具体有效非0值,需要占据相应的磁盘空间,以供程序运行时加载读取相应的值。两者分开维护管理, 有效地降低可执行文件占据磁盘的容量,否则初始化化数据项越多,可执行文件越大,运行时加载到内存所需要的时间消耗越大。
🌈我的分享也就到此结束啦🌈
如果我的分享也能对你有帮助,那就太好了!
若有不足,还请大家多多指正,我们一起学习交流!
📢未来的富豪们:点赞👍→收藏⭐→关注🔍,如果能评论下就太惊喜了!
感谢大家的观看和支持!最后,☺祝愿大家每天有钱赚!!!欢迎关注、关注!
相关文章:
图像处理学习笔记(一)
本文主要介绍,以供读者能够理解该技术的定义、原理、应用。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:ISP处理 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就…...
duckdb学习-1
DuckDB is a fast in-process analytical database DuckDB supports a feature-rich SQL dialect complemented with deep integrations into client APIs 在notebook中使用duckdb 安装 pip install duckdb 示例代码: #> pip install jupysql #> pip install duckdb-en…...
GEE高阶案例——Landsat/Sentinel/MODIS影像进行缨帽变换一行代码实现
本教程的主要目的是利用eemont中的tasseledCap()的函数进行缨帽变换实现。 在 eemont 中,可使用扩展到 ee.Image 和 ee.ImageCollection 对象的 tasseledCap 方法计算缨帽亮度、绿度和湿度组件。只需从支持的平台加载图像,然后使用 tasseledCap 添加分量带即可。 代码: !p…...
数独游戏(c++题解)
题目描述 给出一个的表格,部分格子已经填好数。请填完所有空白格子,使得表格每一行、每一列、每个的九宫格,都恰好填满这9个数字。 输入格式 9行9列的方阵状态,0代表空格。 输出格式 输出完成后的方阵状态,每一个…...
【开发方案】Android 应用双卡搜网功能
一、功能简介 需求:开机自动开始搜网并显示网络列表 那么就不能将相关类做成单例,不能将subId、phoneId等卡相关的属性作为UI、服务的全局变量。 二、流程设计 NetworkSelectReceiver:监听开机广播,触发拉起搜网服务 NetworkOperatorService:搜网服务,完成后调起用户…...

图论基础|深度优先dfs、广度优先bfs
dfs 与 bfs 区别 提到深度优先搜索(dfs),就不得不说和广度优先搜索(bfs)有什么区别 先来了解dfs的过程,很多录友可能对dfs(深度优先搜索),bfs(广度优先搜索…...
Python从入门到精通秘籍十七
一、Python的构造方法 在Python中,构造方法是一个特殊的方法,用于创建和初始化类的实例。构造方法的名称是__init__(),它在创建对象时自动调用。 下面是一个示例代码来详细解释Python的构造方法: class Person:def __init__(se…...

Java——抽象类和接口
目录 1.抽象类 1.概念: 2.语法 3.特性 2.接口 1.概念 2.语法 3.特性 1.抽象类 1.概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的…...
React—— props校验(非typescript校验类型)
非typescript环境下,当我们在封装组件的时候,接受props时传入的内容,需要做类型检测,那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候,就约定props的格式、类型等 实现步骤: 导入 …...

Go——map操作及原理
一.map介绍和使用 map是一种无序的基于key-value的数据结构,Go语言的map是引用类型,必须初始化才可以使用。 1. 定义 Go语言中,map类型语法如下: map[KeyType]ValueType KeyType表示键类型ValueType表示值类型 map类型的变量默认…...

网络安全实训Day9
写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义:通过定义策略和规则来限制哪些流量能经过防火墙,哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…...
kubernetes实战(1)之虚拟机centos搭建k8s集群
一,环境准备 centos7系统,每个系统2c2g,40g,centos7下载地址:centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 # 每个节点分别设置对应主机名 hostnamectl set-hostname master hostnamectl set-hostname …...

基于python+vue分类信息服务平台移动端的设计与实现flask-django-php-nodejs
分类信息服务平台是在Android操作系统下的应用平台。为防止出现兼容性及稳定性问题,框架选择的是django,Android与后台服务端之间的数据存储主要通过MySQL。用户在使用应用时产生的数据通过 python等语言传递给数据库。通过此方式促进分类信息服务平台信…...

【蓝牙协议栈】【BLE】低功耗蓝牙配对绑定过程分析(超详细)
1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待!…...

MySQL表内容的增删查改
在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…...

Java的三大特性之一——多态(完)
前言 http://t.csdnimg.cn/0CAuc 在上一篇我们已经详讲了继承特性,在这我们将进行最后一个也是最重要的特性讲解——多态 在讲解之前我们需要具备对向上转型以及方法重写的初步了解,这有助于我们对多态的认识 1.向上转型 即实际就是创建一个子类对象…...

算法-最短路径
图的最短路径问题是一个经典的计算机科学和运筹学问题,旨在找到图中两个顶点之间的最短路径。这种问题在多种场景中都有应用,如网络路由、地图导航等。 解决图的最短路径问题有多种算法,其中最著名的包括: 1.迪杰斯特拉算法 (1).…...

【软考---系统架构设计师】特殊的操作系统介绍
目录 一、嵌入式系统(EOS) (1)嵌入式系统的特点 (2)硬件抽象层 (3)嵌入式系统的开发设计 二、实时操作系统(RTOS) (1)实时性能…...
大模型: 提示词工程(prompt engineering)
文章目录 一、什么是提示词工程二、提示词应用1、提示技巧一:表达清晰2、提示词技巧2:设置角色 一、什么是提示词工程 提示词工程主要是用于优化与大模型交互的提示或查询操作,其目的在于能够更加准确的获取提问者想要获取的答案,…...
RabbitMQ的事务机制
想要保证发送者一定能把消息发送给RabbitMQ,一种是通过Confirm机制,另一种就是通过事务机制。 RabbitMQ的事务机制,允许生产者将一组操作打包成一个原子事务单元,要么全部执行成功,要么全部失败。事务提供了一种确保消…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...