SIFT算法

news2024/11/18 21:50:17

文章目录

  • 1. SIFT算法简介
    • 1.1 SIFT特征检测步骤
    • 1.2 SIFT算法的特点
  • 2. SIFT算法原理
    • 2.1 尺度空间
      • 2.1.1 多分辨率金字塔
      • 2.1.2 高斯金字塔
      • 2.1.3 高斯尺度空间(使用不同的参数)
    • 2.2 DoG空间极值检测(查找关键点)
    • 2.3 删除不好的极值点(特征点)
    • 2.4 求取特征点的主方向
    • 2.5 生成特征描述
  • 3. SIFT算法在OpenCV中的应用
  • 4. SIFT算法进行图像分类的思路
  • 5. 源码仓库地址

1. SIFT算法简介

SIFT (Scale-invariant feature transform),尺度不变特征转换,是一种图像局部特征提取算法,它通过在不同的尺度空间中寻找极值点(特征点,关键点)的精确定位和主方向,构建关键点描述符来提取特征。SIFT提取的关键点具有尺度不变性、旋转不变性,而且不会因光照、仿射变换和噪音等因素而干扰。SIFT所查找到的关键点是一些十分突出、不会因光照、仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

1.1 SIFT特征检测步骤

SIFT特征检测主要分为以下四步:

  1. 尺度空间的极值检测:搜索所有尺度空间上的图像,通过高斯微分函数来识别潜在的对尺度和旋转不变的兴趣点;

  2. 特征点定位:在每个候选的位置上,通过一个拟合精细模型来确定位置尺度,关键点的选取依据他们的稳定程度;

  3. 特征方向赋值:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向,后续的所有操作都是对于关键点的方向、尺度和位置进行变换,从而提供这些特征的不变性;

  4. 特征点描述:在每个特征点周围的邻域内,在选定的尺度上测量图像的局部梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变换。

在这里插入图片描述

1.2 SIFT算法的特点

  1. 图像的局部特征,对旋转、尺度缩放、亮度变化保持不变,对视角变化、仿射变换、噪声也保持一定程度的稳定性。

  2. 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。

  3. 多量性,即使是很少几个物体也可以产生大量的SIFT特征。

  4. 高速性,经优化的SIFT匹配算法甚至可以达到实时性。

  5. 可扩展性,可以很方便的与其他的特征向量进行联合。

2. SIFT算法原理

2.1 尺度空间

在一定的范围内,无论物体是大还是小,人眼都可以分辨出来,然而计算机要有相同的能力却很难,在未知的场景中,计算机视觉并不能够提供物体的尺度大小,其中的一种方法是把物体不同尺度下的图像都提供给机器,让机器能够对物体在不同尺度下有一个统一的认知,在建立统一认知的过程中,要考虑的就是图像在不同的尺度下都存在的特点。

2.1.1 多分辨率金字塔

早期的图像多尺度通常使用图像金字塔的表示形式,图像金字塔是同一图像在不同分辨率下得到的一组结果,生成过程包含:

  1. 对原始图像进行平滑;

  2. 对平滑后的图像进行下采样。

降采样后得到一系列不断尺寸缩小的图像。显然,一个传统的金字塔中,每一层的图像是其上一层图像长、高的各一半。多分辨率的图像金字塔虽然生成简单,但其本质是降采样,图像的局部特征则难以保持,也就是无法保持特征的尺度不变性。

在这里插入图片描述

2.1.2 高斯金字塔

在这里插入图片描述

*高斯金字塔的构建可以分为两步:*

  1. 对图像做高斯平滑;

  2. 对平滑后的图像做下采样。

为了让尺度体系其连续性,在简单下采样的基础上增加了高斯滤波,一副图像可以产生几组(octave)图像,一组图像包括几层(interval)图像。

*高斯金字塔分布情况(o组s层):*

容易看出,高斯金字塔有多组,每组又有多层,一组的多个层之间的尺度是不一样的,也就是使用的高斯参数σ不同,相邻两层之间的尺度相差一个比例因子k,如果每组有S层,则 k = 2 1 / S k=2^{1/S} k=21/S,上一组图像的最底层图像是由下一组中尺度为2σ的图像进行因子为2的降采样得到的(高斯金字塔是从底层开始建立的),高斯金字塔构建完成之后,将相邻的金字塔相减就得到了DoG金字塔。

高斯金字塔的组数:
o = [ l o g 2 m i n ( m , n ) ] − a o=[log_2min(m,n)]-a o=[log2min(m,n)]a
o表示高斯金字塔的层数,m,n分别是图像的行和列。减去的系数a可以在 0 – log2min(m,n) 之间的任意值,和具体需要的金字塔的顶层图像的大小有关。

高斯模糊参数可由下面的关系得到:
σ ( o , s ) = σ 0 ∗ 2 o + s S σ(o,s)=σ_0*2^\frac{o+s}{S} σ(o,s)=σ02So+s
其中o为所在的组,s为所在的层,σ0为初始的尺度,S为每组的层数。

*同组内相邻层的图像尺度间的关系:*
σ s + 1 = k ∗ σ s = 2 1 S ∗ σ s σ_{s+1}=k*σ_s=2^\frac{1}{S}*σ_s σs+1=kσs=2S1σs
*相邻组之间的尺度关系:*
σ o + 1 = 2 ∗ σ o σ_{o+1}=2*σ_o σo+1=2σo
上一组图像的底层是由前一组图像的倒数第二层图像隔点采样生成的,这样可以保证尺度的连续性。

2.1.3 高斯尺度空间(使用不同的参数)

我们要精确表示的物体都是通过一定的尺度来反映的,现实世界的物体也总是通过不同尺度的观察而得到不同的变化。

尺度空间的理论最早在1962年提出,主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的尺度空间表示序列,对这些序列进行尺度空间主轮廓的提取,并以该主轮廓作为一种特征向量,实现边缘、角点检测和不同分辨率上的特征提取等。

尺度空间中各个尺度图像的模糊程度逐渐变大,能够模拟人在距离由近到远时目标在视网膜上的形成过程,尺度越大,图像越模糊。

图像和高斯函数进行卷积运算能够对图像进行模糊,且不同尺度的高斯核可以得到不同程度的模糊图像,一幅图像的高斯尺度空间可以通过图像和不同尺度的高斯核卷积得到:
L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x,y,σ)=G(x,y,σ)*I(x,y) L(x,y,σ)=G(x,y,σ)I(x,y)
其中,G是高斯函数:
G ( x , y , σ ) = 1 2 π σ 2 e x 2 + y 2 2 σ 2 G(x,y,σ)=\frac{1}{2πσ^2}e^\frac{x^2+y^2}{2σ^2} G(x,y,σ)=2πσ21e2σ2x2+y2
其中,σ是尺度空间因子,是高斯正态分布的标准差,反映了图像被模糊的程度,其值越大图像越模糊,对应的尺度也就越大,L(x,y,σ)对应高斯尺度空间。

T Lindeber在文献《Scale-space theory: a basic tool for analyzing structures at different scales》中证明,高斯核是唯一可以产生多尺度空间的核。

*高斯模糊性质:*

  1. 高斯模糊具有圆对称性。

  2. 高斯模糊具有线性可分的性质,可以在二维图像上对两个独立的一维空间分别进行计算,大大的减小了运算次数。

  3. 对一副图像进行多次连续高斯模糊的效果与一次更大的高斯模糊可以产生同样的效果,大的高斯模型的半径是所用多个高斯模糊半径平方和的平方根。

  4. 例如:使用半径分别为6和8的两次高斯模糊变换得到的效果等同于一次半径为10的高斯模糊的效果: 6 2 + 8 2 \sqrt{6^2+8^2} 62+82 =10,根据这个关系,使用多个连续较小的高斯模糊处理不会比单个高斯较大处理时间要少。

*构造尺度空间的目的:*

为了检测出来在不同尺度下都存在的特征点,而检测特征点较好的算子是高斯拉普拉斯(LoG),即Δ2G:
Δ 2 = ə 2 ə x 2 + ə 2 ə y 2 Δ^2=\frac{ə^2}{əx^2}+\frac{ə^2}{əy^2} Δ2=əx2ə2+əy2ə2
LoG的缺点:虽然其能够较好的检测到图像中的特征点,但是运算量过大。通常可以使用DoG(差分高斯,Different of Gaussian)来近似计算LoG。设k为相邻两个高斯尺度空间的比例因子,则DoG定义为:
D ( x , y , σ ) = [ G ( x , y , k σ ) − G ( x , y , σ ) ] ∗ I ( x , y ) = L ( x , y , k σ ) − L ( x , y , σ ) D(x,y,σ)=[G(x,y,kσ)−G(x,y,σ)]∗I(x,y)=L(x,y,kσ)−L(x,y,σ) D(x,y,σ)=[G(x,y,)G(x,y,σ)]I(x,y)=L(x,y,)L(x,y,σ)
其中,L(x,y,σ)是图像的高斯尺度空间。

DoG是如何得到的:将相邻的两个高斯空间的图像相减即可得到DoG响应图像,为了得到DoG响应图像,要先构建高斯尺度空间,而高斯的尺度空间可以在图像金字塔将采用的基础上加上高斯滤波得到,也就是对图像金字塔的每层图像使用不同的参数σ进行高斯模糊,使得每层金字塔有多张高斯模糊过的图像,降采样时,金字塔上边一组图像的第一章是由其下面一组图像倒数第三张降采样得到的。

2.2 DoG空间极值检测(查找关键点)

关键点是一些十分突出的点,不会因光照条件的改变而消失,比如角点、边缘点、暗区域的亮点和亮区域的暗点,既然两幅图像中有相同的景物,那么使用某种方法分别提取各自的稳定点,这些点之间会有相应的匹配点。

所谓关键点,就是在不同尺度空间的图像下检测出的具有方向信息的局部极值点。

为了寻找尺度空间的极值点,每个像素点要和其图像域(同一尺度空间)和尺度域(相邻的尺度空间)的所有相邻点进行比较,当其大于(或者小于)所有相邻点时,该点就是极值点。如图所示,中间的检测点要和其所在图像的3×3邻域8个像素点,以及其相邻的上下两层的3×3领域18个像素点,共26个像素点进行比较。

从上面的描述中可以知道,每组图像的第一层和最后一层是无法进行比较取得极值的。为了满足尺度变换的连续性,在每一组图像的顶层继续使用高斯模糊生成3幅图像,高斯金字塔每组有S+3层图像,DoG金字塔的每组有S+2组图像。

在这里插入图片描述

DoG在计算上只需相邻尺度高斯平滑后图像相减,因此简化了计算。

2.3 删除不好的极值点(特征点)

通过比较检测得到的DoG的局部极值点实在离散的空间搜索得到的,由于离散空间是对连续空间采样得到的结果,因此在离散空间找到的极值点不一定是真正意义上的极值点,因此要设法将不满足条件的点剔除掉。可以通过尺度空间DoG函数进行曲线拟合寻找极值点,这一步的本质是去掉DoG局部曲率非常不对称的点。

要剔除掉的不符合要求的点主要有两种:

  1. 低对比度的特征点

  2. 不稳定的边缘响应点

2.4 求取特征点的主方向

经过上面的步骤已经找到了在不同尺度下都存在的特征点,为了实现图像旋转不变性,需要给特征点的方向进行赋值。利用特征点邻域像素的梯度分布特性来确定其方向参数,再利用图像的梯度直方图求取关键点局部结构的稳定方向。

找到了特征点,也就可以得到该特征点的尺度σ,也就可以得到特征点所在的尺度图像:L(x,y,σ)=G(x,y,σ)∗I(x,y)。

计算以特征点为中心、以3×1.5σ * 3×1.5σ为半径的区域图像的幅角和幅值,每个点L(x,y)的梯度的模m(x,y)以及方向θ(x,y)可通过下面的公式求得:
m ( x , y ) = [ L ( x + 1 , y ) − L ( x − 1 , y ) ] 2 + [ L ( x , y + 1 ) − L ( x , y − 1 ) ] 2 m(x,y)=\sqrt{[L(x+1,y)-L(x-1,y)]^2+[L(x,y+1)-L(x,y-1)]^2} m(x,y)=[L(x+1,y)L(x1,y)]2+[L(x,y+1)L(x,y1)]2

θ ( x , y ) = a r c t a n L ( x , y + 1 ) − L ( x , y − 1 ) L ( x + 1 , y ) − L ( x − 1 , y ) θ(x,y)=arctan\frac{L(x,y+1)-L(x,y-1)}{L(x+1,y)-L(x-1,y)} θ(x,y)=arctanL(x+1,y)L(x1,y)L(x,y+1)L(x,y1)

计算得到梯度方向后,就要使用直方图统计特征点邻域内像素对应的梯度方向和幅值。梯度方向的直方图的横轴是梯度方向的角度(梯度方向的范围是0到360度,直方图每36度一个柱共10个柱,或者没45度一个柱共8个柱),纵轴是梯度方向对应梯度幅值的累加,在直方图的峰值就是特征点的主方向。使用高斯函数对直方图进行平滑以增强特征点近的邻域点对关键点方向的作用,并减少突变的影响。

得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点。

2.5 生成特征描述

通过以上的步骤已经找到了SIFT特征点位置、尺度和方向信息,下面就需要使用一组向量来描述关键点也就是生成特征点描述子,这个描述符不只包含特征点,也含有特征点周围对其有贡献的像素点。描述子应具有较高的独立性,以保证匹配率。

特征描述符的生成大致有三个步骤:

  1. 校正旋转主方向,确保旋转不变性。

  2. 生成描述子,最终形成一个128维的特征向量。

  3. 归一化处理,将特征向量长度进行归一化处理,进一步去除光照的影响。

为了保证特征矢量的旋转不变性,要以特征点为中心,在附近邻域内将坐标轴旋转θθ角度,即将坐标轴旋转为特征点的主方向,旋转后邻域内的像素的新坐标为:
[ x ’ y ’ ] = [ c o s θ − s i n θ s i n θ c o s θ ] [ x y ] \left[ \begin{matrix} x^\text{'} \\ y^\text{'} \end{matrix} \right]=\left[ \begin{matrix} cosθ & -sinθ \\ sinθ & cosθ \end{matrix}\right]\left[ \begin{matrix} x \\ y \end{matrix} \right] [xy]=[cosθsinθsinθcosθ][xy]
旋转之后的主方向为中心取8x8的窗口,左图中央为当前关键点的位置,每个小格代表Wie关键点邻域所在尺度空间的一个像素,求取每个像素的梯度幅值和方向,箭头方向代表梯度方向,长度代表梯度幅值,然后利用高斯窗口对其进行加权运算,最后在每个4x4的小块上绘制8个方向的梯度直方图,计算每个梯度方向的累加值,即可形成一个种子点,如右图所示,每个特征的由4个种子点组成,每个种子点有8个方向的向量信息,这种邻域方向性信息联合增强了算法的抗噪能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。

在这里插入图片描述

不同于求主方向,此时每个种子区域的梯度直方图在0-360之间划分为8个方向区间,每个区间为45度,即每个种子点有8个方向的梯度强度信息。

在实际计算的过程中,为了增强匹配的稳健性,Lowe建立对每个关键点使用4x4共16个种子点来描述,这样一个关键点就会产生128维的SIFT特征向量。

在这里插入图片描述

通过对特征点周围的像素进行分块,计算块内梯度直方图,生成具有独特性的向量,这个向量是该区域图像信息的一种抽象,具有唯一性。

综上,SIFT特征对旋转、尺度缩放、亮度等有鲁棒性,是一种非常稳定的局部特征,在图像处理和计算机视觉领域具有很重要的作用,其本身也比较复杂。

  1. DoG尺度空间的极值检测:

首先构造DoG尺度空间,在SIFT中使用不同参数的高斯模糊来表示不同的尺度空间,而构造尺度空间是为了检测在不同尺度下都存在的特征点,特征点的检测比较常用的方法是高斯拉普拉斯,但是LoG的运算量是比较大的,Marr和Hidreth指出可以使用DoG(高斯差分)来近似计算LoG,所以在DoG的尺度空间下检测极值点。

  1. 删除不稳定的极值点:

低对比度的极值点+不稳定的边缘响应点

  1. 确定特征的的主方向:

以特征点的为中心、以3×1.5σ * 3×1.5σ为半径的领域内计算各个像素点的梯度的幅角和幅值,然后使用直方图对梯度的幅角进行统计。直方图的横轴是梯度的方向,纵轴为梯度方向对应梯度幅值的累加值,直方图中最高峰所对应的方向即为特征点的方向。

  1. 生成特征描述子:

首先将坐标轴旋转为特征点的方向,以特征点为中心的16x16的窗口的像素的梯度幅值和方向,将窗口内的像素分为16块,每块是其像素内8个方向的直方图统计,共可以形成128维的特征向量。

3. SIFT算法在OpenCV中的应用

SIFT算法在OpenCV中主要包括以下几个函数:

  1. cv2.xfeatures2d.SIFT_create():实例化SIFT

  2. sift.detect():找出关键点

  3. cv2.drawKeypoints():画出关键点

  4. sift.compute():根据关键点计算SIFT向量

测试代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('lenna.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 得到特征点
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)  # 关键点
img = cv2.drawKeypoints(gray, kp, img)

plt.subplot(121), plt.imshow(gray, 'gray'), plt.title('Gray Image'), plt.axis('off')
plt.subplot(122), plt.imshow(img, 'gray'), plt.title('Keypoints Image'), plt.axis('off')
plt.show()

# 计算特征
# kp为关键点keypoints
# des为描述子descriptors
kp, des = sift.compute(gray, kp)
print(np.array(kp).shape) #(203,)
print(des.shape) #(203, 128),128维向量

效果如下:

在这里插入图片描述

4. SIFT算法进行图像分类的思路

通过比较待识别图片与训练图集中的每一张图片的sift描述子的个数,找出匹配度最高的那张图片所在的类别,则该类别就被判定为待识别图片的类别。

如以下代码所示,有40类图片,每类图片5张:首先计算待识别图片的des描述子,然后依次比较每一类中每一张图片与该描述子的匹配数之和(平均匹配数),则匹配数之和(平均匹配数)最大的一类判定为与待识别图片为同一类。

在这里插入图片描述

5. 源码仓库地址

🌼 图像处理、机器学习的常用算法汇总

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

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

相关文章

二、Kafka生产与消费全流程

Kafka生产与消费全流程 Kafka是一款消息中间件,消息中间件本质就是收消息与发消息,所以这节课我们会从一条消息开始生产出发,去了解生产端的运行流程,然后简单的了解一下broker的存储流程,最后这条消息是如何被消费者…

JVM笔记(一)

走进JVM JVM相对于Java应用层的学习难度更大,**开篇推荐掌握的预备知识:**C/C(关键)、微机原理与接口技术、计算机组成原理、操作系统、数据结构与算法、编译原理(不推荐刚学完JavaSE的同学学习),如果没有掌握推荐的一…

javac 无效的目标发行版: xx

一、检查系统JDK版本 java --version 如果不符合&#xff0c;重新配置系统环境。 二、检查IDEA设置 1、项目结构->项目->SDK和语言级别 2、 项目结构->模块->设置每一个模块的语言级别。 3、java编译器&#xff0c;模块预言级别。 三、检查pom文件 <!--Licens…

qt学习——基本使用、对象树、按钮、信号与槽

初识qt **qt****qt命名规范以及相关快捷键的使用****QPushButton****对象树****点击按钮关闭窗口****信号和槽****标准的信号和槽****自定义信号和槽****带参数的自定义信号和槽传参以及函数的二义性问题** qt qt命名规范以及相关快捷键的使用 优点:Qt相对于C&#xff0c;有一…

华为OD机试真题 JavaScript 实现【狼羊过河】【2022Q4 100分】,附详细解题思路

一、题目描述 一农夫带着m只羊&#xff0c;n只狼过河&#xff0c;农夫有一条可载x只狼/羊的船&#xff1b;农夫在时或者羊的数量大于狼时&#xff0c;狼不会攻击羊&#xff1b; 农夫在不损失羊的情况下&#xff0c;运输几次可以完成运输&#xff1f; 返程不计入次数。 二、…

Vue中如何进行表单联动与级联选择?

Vue中如何进行表单联动与级联选择&#xff1f; 表单联动和级联选择是Vue.js中常见的功能。表单联动是指在一个表单中&#xff0c;当某一个输入框的值发生变化时&#xff0c;其他输入框的值也会随之改变。级联选择是指在一个选择框中&#xff0c;当选择一个选项时&#xff0c;另…

领域建模之数据模型设计方法论 | 京东云技术团队

本文通过实际业务需求场景建模案例&#xff0c;为读者提供一种业务模型向数据模型设计的方法论&#xff0c;用于指导实际开发中如何进行业务模型向数据模型转化抽象&#xff0c;并对设计的数据模型可用性、扩展性提供了建议性思考。通过文章&#xff0c;读者可以收获到业务模型…

linux 漏洞升级、初次安装 mysql

文章目录 适用安装遇到问题 适用 1、为解决Mysql漏洞而需要离线升级mysql版本&#xff1b; 2、初次安装Mysql也可以参考本文&#xff1b; 安装 提示&#xff1a;首次安装可跳过第二步、第三步 一、查看CentOS7系统自带mariadb # 查看系统自带的Mariadb [rootiZ2ze3hm3gyjy…

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念&#xff0c;体现了看待线程同步的不同角度&#xff0c;在Java和数据库中都有此概念对应的实际应用。 1.乐观锁 顾名思义&#xff0c;就是很乐观&#xff0c;每次去拿数据的时候都认为别人不会修改&#xff0c;所以不会上…

英语中-后置定语

一般说来&#xff0c;形容词放在所修饰名词的前面。单个的现在分词、过去分词以及动名词作定语&#xff0c;都是放在所修饰名词&#xff08;或代词&#xff09;的前面。这些称为前置定语。 例如&#xff1a; a red flower/ an interesting story&#xff0c;这里red, interes…

SaaS人力资源管理系统的Bug

SaaS人力资源管理系统的Bug Bug1【18】 这里我是直接把代码复制过来的&#xff0c;然后就有一个空白 这是因为它的代码有问题&#xff0c;原本的代码如下所示 <el-table-column fixed type"index" label"序号" width"50"></el-table-co…

ssm+java在线考试批改阅卷系统

本次学校在线考试系统的实现过程&#xff0c;它的开发使用B/S结构即浏览器和服务器结构框架&#xff0c;采用SSM框架技术&#xff0c;数据库使用了mysql数据库&#xff0c;页面设计采用了MVC框架&#xff0c;后端采用了SSM框架技术scrip等其他一些脚本语言&#xff0c;使用到在…

hash算法详解

散列算法&#xff08;Hash Algorithm&#xff09;&#xff0c;又称哈希算法&#xff0c;杂凑算法&#xff0c;是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样&#xff0c;散列算法就是一种以较短的信息来保证文件唯一性的标志&#xff0c;这种标志与文件的每一个字…

Java中的动态链接VS操作系统动态链接

在操作系统OS中为了优化内存的使用会采用一种动态链接方式&#xff0c;一个文件想要在操作系统中运行必须经过编译、汇编译、链接、装载等步骤。可以参考Java程序是怎么跑起来的。本篇主要讲解Java栈帧中动态链接部分与操作系统的的动态链接的区别与联系 操纵系统为什么需要动态…

2023年欧洲科学院院士中的华人学者简介

近日&#xff0c;2023年欧洲科学院新当选欧洲科学院院士名单出炉&#xff0c;由于入选学者接受邀请及注册的时间进度不同&#xff0c;入选名单陆续公布&#xff08;截止目前已更新135位&#xff09;。本文知识人网小编仅介绍入选名单中华人学者的情况。 欧洲科学院(Academia Eu…

优化--分类树,我从2s优化到0.1s

1.前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 但就是这样一个简单的分类树查询功能&#xff0c;我们却优化了5次。 到底是怎么回事呢&#xff1f; 2.背景 我们的网站使用了SpringBoot推荐的模板引擎&#xff1a;Thym…

TiDB x Catalyst丨秒级洞悉数据价值,TiDB 帮助“客户成功 SaaS 厂商”提升用户体验

导读 Catalyst 是一家总部位于纽约的 SaaS 创业公司&#xff0c;它提供了一个直观且灵活的客户成功平台&#xff08;Custom Success Platform&#xff09;&#xff0c;可帮助客户成功团队汇聚客户数据&#xff0c;洞悉客户健康状况&#xff0c;推动客户留存和业务增长。目前 C…

「网络编程」第一讲:初识网络_网络基础1

「前言」文章是关于网络编程方面的&#xff0c;今天内容大致是网络基础&#xff0c;讲解下面开始&#xff01; 「归属专栏」网络编程 「笔者」枫叶先生(fy) 「座右铭」前行路上修真我 「枫叶先生有点文青病」 「每篇一句」 青山不改&#xff0c;绿水长流 ——白居易 目录 一、…

chatgpt赋能python:Python怎么建服务器?

Python怎么建服务器&#xff1f; 作为一名具有10年Python编程经验的工程师&#xff0c;我深入研究了Python的一些高级特性&#xff0c;其中包括Python如何建立服务器的方法。Python是一个高级的编程语言&#xff0c;可以轻松创建服务器应用程序&#xff0c;并为您的网站提供高…

redis中的intset集合源码阅读探究;基于7.0+版本

1丶什么是intset Redis 中的 intset&#xff08;整数集合&#xff09;是一种高效的数据结构选择。Intset 具有紧凑的内存布局和快速的插入、删除和查找操作&#xff0c;适用于存储大量整数&#xff0c;并且能够节省内存空间。 2丶先说优点 内存布局&#xff1a;Intset 的内存…