图像传统处理算法-边缘检测-分割-增强-降噪

news2024/12/26 11:14:20

一、边缘检测

边缘检测的几种微分算子:

一阶微分算子:Roberts、Sobel、Prewitt

二阶微分算子:Laplacian、Log/Marr

非微分算子:Canny

一阶微分算子

1.Roberts: 没有经过图像平滑处理,图像噪声无法得到较好的抑制,但图像边缘定位精度较高。

2. Sobel:引入了类似局部平均的运算,对噪声有平滑作用,能很好的消除噪声的影响。与Prewitt比,Sobel对像素位置做了加权,可以降低边缘模糊程度。

3. Prewitt:去掉部分伪边缘,对噪声有平滑作用。

如何计算边缘幅值与方向呢?以Sobel为例,3*3 Sobel两个方向的算子在图像上滑动,模板与其覆盖的图像3*3区域的9个像素进行卷积,求和后得到此方向的边缘检测幅值。

二阶微分算子

1. Laplacian

拉普拉斯算子数学公式:

2. Log/Marr边缘检测是先进行高斯滤波,再进行拉普拉斯算子进行检测,最后通过找过零点来确定边缘位置。

非微分算子:Canny

使用Canny算子的边缘检测过程如下:

*RGB图像转化为灰度图像;

*对图像进行高斯滤波;

*利用canny算子(图像四个方向:水平、垂直、对角)计算图像梯度,根据**梯度计算图像边缘幅度;

*非极大值抑制,得到真正的边缘->细化;

*双阈值边缘提取;

*结果二值化显示;

二、图像分割

传统图像分割算法

1. 基于阈值的分割方法

阈值法的基本思想是基于图像的灰度特征计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。

阀值分割方法的优缺点:

计算简单,效率较高;

只考虑像素点灰度值本身的特征,一般不考虑空间特征,因此对噪声比较敏感,鲁棒性不高。

2. 基于区域的分割方法

基于区域的分割方法是以直接寻找区域为基础的分割技术,基于区域提取方法有两种基本形式:一种是区域生长,从单个像素出发,逐步合并以形成所需要的分割区域;另一种是从全局出发,逐步切割至所需的分割区域。

区域生长:区域生长是从一组代表不同生长区域的种子像素开始,接下来将种子像素邻域里符合条件的像素合并到种子像素所代表的生长区域中,并将新添加的像素作为新的种子像素继续合并过程,知道找不到符合条件的新像素为止。该方法的关键是选择合适的初始种子像素以及合理的生长准则。

区域生长算法需要解决的三个问题:

(1)选择或确定一组能正确代表所需区域的种子像素;

(2)确定在生长过程中能将相邻像素包括进来的准则;

(3)指定让生长过程停止的条件或规则。

区域分裂合并:区域生长是从某个或者某些像素点出发,最终得到整个区域,进而实现目标的提取。而分裂合并可以说是区域生长的逆过程,从整幅图像出发,不断的分裂得到各个子区域,然后再把前景区域合并,得到需要分割的前景目标,进而实现目标的提取。

区域分裂合并算法优缺点:

(1)对复杂图像分割效果好;

(2)算法复杂,计算量大;

(3)分裂有可能破怪区域的边界。

分水岭算法:是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中每一点像素的灰度值表示该点的海拔高度,每一个局部极小值及其影响区域称为集水盆,而集水盆的边界则形成分水岭。

分水岭对微弱边缘具有良好的响应,图像中的噪声、物体表面细微的灰度变化都有可能产生过度分割的现象,但是这也同时能够保证得到封闭连续边缘。

3. 基于边缘检测的分割方法

基于边缘检测的图像分割算法试图通过检测包含不同区域的边缘来解决分割问题。通常不同区域的边界上像素的灰度值变化比较剧烈,如果将图片从空间域通过傅里叶变换到频率域,边缘就对应着高频部分,这是一种非常简单的边缘检测算法。

边缘检测的优缺点:

(1)边缘定位准确;

(2)速度快;

(3)不能保证边缘的连续性和封闭性;

(4)在高细节区域存在大量的碎边缘,难以形成一个大区域,但是又不宜将高细节区域分成小碎片;

由于上述的(3)(4)两个难点,边缘检测只能产生边缘点,而非完整意义上的图像分割过程。这也就是说,在边缘点信息获取到之后还需要后续的处理或者其他相关算法相结合才能完成分割任务。

在以后的研究当中,用于提取初始边缘点的自适应阈值选取、用于图像的层次分割的更大区域的选取以及如何确认重要边缘以去除假边缘将变得非常重要。

4. 基于主动轮廓模型的分割方法

在实现主动轮廓模型时,可以灵活的选择约束力、初始轮廓和作用域等,以得到更佳的分割效果。利用曲线演化来检测目标的一类方法,基于此可以得到精确的边缘信息。其基本思想是,先定义初始曲线C,然后根据图像数据得到能量函数,通过最小化能量函数来引发曲线变化,使其向目标边缘逐渐逼近,最终找到目标边缘。这种动态逼近方法所求得的边缘曲线具有封闭、光滑等优点。

5. 基于深度学习的分割方法(简单介绍)

A、基于特征编码

在特征提取领域中VGG和ResNet是两个非常有统治力的方法。

VGG

通过反复地堆叠3*3的小型卷积核和2*2的最大池化层,构建了16~19层的深度神经网络。

几点说明:

*感受野很小的滤波器:3×3(这是捕获左/右,上/下,中心概念的最小尺寸)。

*1×1卷积滤波器,可以看作输入通道的线性变换(后面加relu的是非线性)。

*卷积步长固定为1个像素;卷积层输入的空间填充要满足卷积之后保留空间分辨率,即3×3卷积层的填充为1个像素。

*空间池化由五个最大池化层进行,这些层在一些卷积层之后(不是所有的卷**积层之后都是最大池化)。在2×2像素窗口上进行最大池化,步长为2。

之后是三个全连接(FC)层。

*最后一层是soft-max层。所有网络中全连接层的配置是相同的。

*在多个迁移学习任务中的表现要优于googLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。

 *虽然网络层数加深,但VGG在训练的过程中比AlexNet收敛的要快一些,主要因为:

  (1)使用小卷积核和更深的网络进行的正则化;

  (2)在特定的层使用了预训练得到的数据进行参数的初始化。

理解1*1卷积核的作用

(1)采用非线性激活函数可以提高模型的非线性能力;

(2)专注于跨通道的特征组合;

(3)对feature map在channel层级进行降维或升维。?

ResNet

Resnet出现的背景:深度学习网络在堆叠到一定深度的时候会出现梯度消失的现象,导致误差升高效果变差,后向传播时无法将梯度反馈到前面的网络层,使得前方的网络层的参数难以更新,训练效果变差。

梯度消失或者梯度爆炸解决方案:对输入数据和中间层的数据进行归一化(BN)操作,这种方法可以保证网络在反向传播中采用随机梯度下降(SGD),从而让网络达到收敛。

不退化不是我们的目的,我们希望有更好性能的网络。  resnet学习的是残差函数F(x) = H(x) - x, 这里如果F(x) = 0, 那么就是上面提到的恒等映射。事实上,resnet是“shortcut connections”的在connections是在恒等映射下的特殊情况,它没有引入额外的参数和计算复杂度。通过使用ResNet Unit成功训练出了152层的神经网络。

Resnet核心:

对残差块做了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1, 如下图。新结构中的中间3x3的卷积层首先在一个降维1x1卷积层下减少了计算,然后在另一个1x1的卷积层下做了还原,既保持了精度又减少了计算量。

ResNet的优缺点:

1)引入了全新的网络结构(残差学习模块),形成了新的网络结构,可以使网络尽可能地加深;

2)使得前馈/反馈传播算法能够顺利进行,结构更加简单;

3)恒等映射地增加基本上不会降低网络的性能;

4)建设性地解决了网络训练的越深,误差升高,梯度消失越明显的问题;

5)由于ResNet搭建的层数众多,所以需要的训练时间也比平常网络要长。

B、基于区域选择(regional proposal based)

Regional proposal 在计算机视觉领域是一个非常常用的算法,尤其是在目标检测领域。其核心思想就是检测颜色空间和相似矩阵,根据这些来检测待检测的区域。然后根据检测结果可以进行分类预测。

Stage Ⅰ:R-CNN

Stage Ⅱ:Fast R-CNN:目标检测

Stage Ⅲ:Faster R-CNN:目标检测

Stage Ⅳ:Mask R-CNN:主要完成了三件事情:目标检测,目标分类,像素级分割。

Stage Ⅴ:Mask Scoring R-CNN

C.基于RNN的图像分割

在语义分割领域,基于区域选择的几个算法主要是由前人的有关于目标检测的工作渐渐延伸到语义分割的领域的.

ReSeg模型

MDRNNs(Multi-Dimensional Recurrent Neural Networks)模型

D.基于上采样/反卷积的分割方法

FCN:在FCN当中的反卷积-升采样结构中,图片会先进性上采样(扩大像素);再进行卷积——通过学习获得权值。

优缺点:

*FCN对图像进行了像素级的分类,从而解决了语义级别的图像分割问题;

*FCN可以接受任意尺寸的输入图像,可以保留下原始输入图像中的空间信息;

*得到的结果由于上采样的原因比较模糊和平滑,对图像中的细节不敏感;

*对各个像素分别进行分类,没有充分考虑像素与像素的关系,缺乏空间一致性。

SetNet:旨在解决自动驾驶或者智能机器人的图像语义分割深度网络,SegNet基于FCN,与FCN的思路十分相似,只是其编码-解码器和FCN的稍有不同,其解码器中使用去池化对特征图进行上采样,并在分各种保持高频细节的完整性;而编码器不使用全连接层,因此是拥有较少参数的轻量级网络:

SetNet的优缺点:

*保存了高频部分的完整性;

*网络不笨重,参数少,较为轻便;

*对于分类的边界位置置信度较低;

*对于难以分辨的类别,例如人与自行车,两者如果有相互重叠,不确定性会增加。

 

三、图像增强

图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度,减少噪点等。

增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则为高通滤波器,当然增强一副图像是为最后获取图像有用信息服务为主。

一般的算法流程可为:

图像去燥(低通滤波器)

增加清晰度(对比度)(高通滤波器)

灰度化或者获取图像边缘特征

或者对图像进行卷积、二值化等

1. 直方图均衡化

 图像对比度增强的方法可以分为两种:直接对比度增强方法,间接对比度增强方法。直方图拉伸和直方图均衡化是常见的间接对比度增强方法。

直方图拉伸是利用对比度拉伸对直方图进行调整,扩大前景和背景灰度的差别。

直方图均衡化则是利用累积函数对灰度值进行调整,实现对比度的增强。

直方图均衡化处理原理:将原始图像的灰度图从比较集中的某个灰度区间均匀分布在整个灰度空间中,实现对图像的非线性拉伸,重新分配图像像素值。

算法的本质是重新分布图像的像素值。增加了许多局部的对比度,整体的对比度没有进行太大改变,所以应用图像为图像有用数据的对比度相近时,例如:X光图像,可以将曝光过度或曝光不足照片进行更好的显示,或者是背景及前景太亮或太暗的图像非常有用。

算法当然也有缺点,具体表现为:变换后的图像灰度级减少,某些细节减少;某些图像有高峰值,则处理后对比度不自然的过分增强。

算法伪代码:

        1、计算原始灰度图像的像素概率分布

         2、根据像素概率分布获取图像累积分布函数

        3、根据映射函数(均衡化)获取变换后的图像

2. 基于拉普拉斯算子的图像增强

 利用拉普拉斯算子进行图像增强本质是利用图像的二次微分对图像进行锐化,在图像领域中微分是锐化,积分是模糊,利用二次微分对图像进行锐化即利用邻域像素提高对比度。

3. 基于Log变换的图像增强

   对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:

对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

4. 基于伽马变换的图像增强

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:

伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的。

  γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。

伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。

四、图像降噪

图像预处理算法的好坏直接关系到后续图像处理的效果,如图像分割、目标识别、边缘提取等,为了获取高质量的数字图像,很多时候都需要对图像进行降噪处理,尽可能的保持原始信息完整性(即主要特征)的同时,又能够去除信号中无用的信息。

一般的图像处理,微小的细节对图像降噪的后续处理程序影响不太明显,但是当处理对象为医学图像时,这样的小失误是不被允许的,因为在医疗诊断或治疗中,每一个微小的失误都会影响医师的治疗方法甚至威胁到患者的生命。这就要求更多的研究者来投入时间和精力研究新的降噪技术,以达到降噪并同时仍能保留足够细节信息的目的。

目前常用的图像去噪算法大体上可非为两类,即空域像素特征去噪算法和变换域去噪算法。前者是直接地在图像空间中进行的处理,后者是间接地在图像变换域中进行处理。

什么是随机噪声呢?相比于图像的真实信号来说随机噪声就是一种或高或低呈现出不确定变化的一种信号,如下图所示虚线代表真实信号,红蓝线表示的就是随机噪声信号,所有的随机噪声信号求和后结果为0。

由于这个零和特点,目前几乎所有的空域降噪算法都是基于这个理论为出发点来进行降噪处理的。

空域像素特征去噪算法

基于空域像素特征的方法,是通过分析在一定大小的窗口内,中心像素与其他相邻像素之间在灰度空间的直接联系,来获取新的中心像素值的方法,因此往往都会存在一个典型的输入参数,即滤波半径r。此滤波半径可能被用于在该局部窗口内计算像素的相似性,也可能是一些高斯或拉普拉斯算子的计算窗口。在邻域滤波方法里面,最具有代表性的滤波方法有以下几种:

(1) 算术均值滤波与高斯滤波

算术均值滤波用像素邻域的平均灰度来代替像素值,适用于脉冲噪声,因为脉冲噪声的灰度级一般与周围像素的灰度级不相关,而且亮度高出其他像素许多。

均值滤波结果A'(i,j)随着L(滤波半径)取值的增大而变得越来越模糊,图像对比度越来越小。经过均值处理之后,噪声部分被弱化到周围像素点上,所得到的结果是噪声幅度减小,但是噪声点的颗粒面积同时变大,所以污染面积反而增大。为了解决这个问题,可以通过设定阈值,比较噪声和邻域像素灰度,只有当差值超过一定阈值时,才被认为是噪声。不过阈值的设置需要考虑图像的总体特性和噪声特性,进行统计分析。

高斯滤波矩阵的权值,随着与中心像素点的距离增加,而呈现高斯衰减的变换特性。这样的好处在于,离算子中心很远的像素点的作用很小,从而能在一定程度上保持图像的边缘特征。通过调节高斯平滑参数,可以在图像特征过分模糊和欠平滑之间取得折中。与均值滤波一样,高斯平滑滤波的尺度因子越大,结果越平滑,但由于其权重考虑了与中心像素的距离,因此是更优的对邻域像素进行加权的滤波算法。

(2) 统计中值滤波

中值滤波首先确定一个滤波窗口及位置(通常含有奇数个像素),然后将窗口内的像素值按灰度大小进行排序,最后取其中位数代替原窗口中心的像素值。

无论是中值滤波还是加权滤波,两者受窗口的尺寸大小影响非常大。一种对中值滤波的改进是自适应中值滤波,它首先判断窗口内部的中心像素是否是一个脉冲,如果不是,则输出标准中值滤波的结果;如果是,则通过继续增大窗口滤波尺寸来寻找非脉冲的中值,因此该方法相比较原始的统计中值滤波器,在保持清晰度和细节方面更优。

(3) 双边滤波

这是一种非线性的保边滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。双边滤波器之所以可以达到保边去噪的效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。

(4) 引导滤波(guided filter)

(5) NLM(Non-Local means)算法

前面基于邻域像素的滤波方法,基本上只考虑了有限窗口范围内的像素灰度值信息,没有考虑该窗口范围内像素的统计信息如方差,也没有考虑整个图像的像素分布特性,和噪声的先验知识。

针对其局限性,NLM算法被提出,该算法使用自然图像中普遍存在的冗余信息来去噪声。与常用的双线性滤波、中值滤波等利用图像局部信息来滤波不同的是,它利用了整幅图像来进行去噪,以图像块为单位在图像中寻找相似区域,再对这些区域求平均,能够比较好地去掉图像中存在的高斯噪声。

变换域去噪算法

图像变换域去噪算法的基本思想其实就是首先进行某种变换,将图像从空间域转换到变换域,然后从频率上把噪声分为高中低频噪声,用这种变换域的方法就可以把不同频率的噪声分离,之后进行反变换将图像从变换域转换到原始空间域,最终达到去除图像噪声的目的。

图像从空间域转换到变换域的方法很多,其中最具代表性的有傅里叶变换、离散余弦变换、小波变换以及多尺度几何分析方法等。

BM3D

空域中NLM算法和变换域中小波萎缩法效果都很好。BM3D就是融合了spatial denoise和tranform denoise,从而可以得到最高的峰值信噪比。它先吸取了NLM中的计算相似块的方法,然后又融合了小波变换域去噪的方法。

BM3D算法总共有两大步骤,分为基础估计(Step1)和最终估计(Step2)。在这两大步中,分别又有三小步:相似块分组,协同滤波和聚合。

Stpe1:基础估计

(1) 相似块分组:首先在噪声图像中选择一些大小的参照块(考虑到算法复杂度,不用每个像素点都选参照块,通常隔3个像素为一个步长进行选取,复杂度降到1/9),在参照块的周围适当大小区域内进行搜索,寻找若干个差异度最小的块,并把这些块整合成一个3维的矩阵。

(2) 协同滤波:形成若干个三维的矩阵之后,首先将每个三维矩阵中的二维的块(即噪声图中的某个块)进行二维变换,可采用小波变换或DCT变换等。二维变换结束后,在矩阵的第三个维度进行一维变换,变换完成后对三维矩阵进行硬阈值处理,将小于阈值的系数置0,然后通过在第三维的一维反变换和二维反变换得到处理后的图像块。

(3) 聚合:此时,每个二维块都是对去噪图像的估计。这一步分别将这些块融合到原来的位置,每个像素的灰度值通过每个对应位置的块的值加权平均,权重取决于置0的个数和噪声强度。

Step2:最终估计

具体的步骤从流程图可看出和Step1基本一样,不同的有两处:

一处是聚合过程将会得到两个三维数组:噪声图形成的三维矩阵和基础估计结果的三维矩阵。

另一处是协同滤波中用维纳滤波(Wiener Filtering)代替了硬阈值处理。

降噪算法总结

BM3D算法是目前传统算法中效果最好的去噪算法,相比于NLM噪声更少,图像细节恢复更多,但算法复杂度实在太高,除非解决计算性能问题,不然至少工业界是无法容忍几分钟的处理时间进行降噪处理。

图像去噪难点在于区别高频信号(如纹理、边缘)和噪声,去噪常用思想是利用图像的相似性。空域去噪是认为相近的点相似,通过平滑可以降低随机性的噪声,效果较好的去噪方法大多是多种方法结合,既能很好地保持边缘信息,又能去除图像中的噪声,比如将中值滤波和小波滤波结合起来进行滤波。

基本上传统的去噪算法都是从噪音图像中找出规律后再进行相对应的去噪处理。那么如果从有噪音的图片本身无法找到规律,我们是否也可以借助其他类似但又没有噪音的图片,来总结图片具有的固有属性呢?(深度学习方法)

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

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

相关文章

Proactive Privacy-preserving Learning for Retrieval 论文笔记

论文名称Proactive Privacy-preserving Learning for Retrieval作者Peng-Fei Zhang (University of Queensland)会议/出版社AAAI 2021pdf📄在线pdf代码无代码概要: 本文提出了一种针对检索系统隐私保护的方法,称为 PPL。训练一个生成器&#…

SPARKSQL3.0-Optimizer阶段源码剖析

一、前言 阅读本节需要先掌握【SPARKSQL3.0-Analyzer阶段源码剖析】 Optimizer阶段是对Analyzer分析阶段的逻辑计划【logicalPlan】做进一步的优化,将应用各种优化规则对一些低效的逻辑计划进行转换 例如将原本用户不合理的sql进行优化,如谓词下推&am…

PCB设计仿真之探讨源端串联端接

作者:一博科技高速先生成员 孙宜文 上期高速线生简单介绍了反射原理也提到了源端串联端接,笔者借此篇文章再深入探讨下,本文使用Sigrity Topology Explorer 17.4仿真软件。 搭建一个简单的电路模型,给一个上升沿和下降沿均为0.5…

学会使用这些电脑技巧,可以让你在工作中受益无穷

技巧一:设置计算机定时关机 第一步:快捷键win r打开运行窗口。 第二步:输入:shutdown -s -t 3600,其中数字3600表示3600秒,就是设置3600秒后关机。第三步:按确定完成设置。如果你想取消设置&…

吃透这份高并发/调优/分布式等350道面试宝典,已涨30k

前言 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试必备系列文章的初衷。 整理自己学过的知识,总结,让其成为一套体系,方便日后查阅。现在不少 Java …

【MySQL运行原理篇】底层运行结构

MySQL整体架构图 简略版图 1.1连接管理 一句话:负责客户端连接服务器的部分 网络连接层, 对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。服务器上维护一…

社交媒体营销策略——如何病毒式传播:增加受众范围的9个技巧

关键词:社交媒体营销、病毒式传播、受众 社交营销人员知道创建病毒式帖子并不是他们最重要的目标。事实上,这可能会分散他们接触目标受众和照顾团队心理健康的注意力。 这并不意味着您无法从病毒式传播的帖子和活动中学到一些东西。战略性病毒式营销可提…

5分钟搞懂https原理

概念 https(超文本传输安全协议)是一种以安全为基础的HTTP传输通道。 在了解HTTPS之前,我们首先来认识一下http: http(超文本传输协议),HTTP是tcp/ip族中的协议之一,也是互联网上…

React项目使用craco(由create-react-app创建项目)

适用:使用 create-react-app 创建项目,不想 eject 项目但想对项目中 wepback 进行自定义配置的开发者。 1.使用 create-react-app创建一个项目(已有项目跳过此步) $ npx create-react-app my-project 2.进入项目目录,…

一些http和tomcat知识补充

HTTP和HTTPS的区别  概念    HTTP英文全称是Hyper Text Transfer Protocol,超文本传输协议,用于在Web浏览器和网站服务器之间传递信息。 HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和…

D. Sequence and Swaps(思维)

Problem - 1455D - Codeforces 你的任务是使该序列排序(如果条件a1≤a2≤a3≤⋯≤an成立,它就被认为是排序的)。 为了使序列排序,你可以执行以下操作的任何次数(可能是零):选择一个整数i&#…

数据结构 | 带头双向循环链表【无懈可击的链式结构】

不要被事物的表面现象所迷惑~🌳前言🌳结构声明🌳接口算法实现🍎动态开辟&初始化【Init】🍎尾插【PushBack】🍎尾删【PopBack】🍎头插【PushFront】🍎头删【PopFront】&#x1f4…

思科防火墙应用NAT

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一.思科防火墙的NAT 一种有四种, 二.动态NAT 配置 三.动态PAT配置 四…

哪些城市有PMP考试考点?PMP考试考场都在哪?

有不少伙伴对PMP的考试点存在一定的疑问,全国PMP考试具体考点位置是在哪呢? 根据过往常用考点,我们给大家汇总了2022年PMP考试全国考场地址,一起来看看吧! 表格信息来自基金会官网11月27日PMP报名通知,仅作…

Spring Security多种用户定义方式

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 Spring Security中存在两种类型的AutnenticationManager,一种是全局的AuthenticationManager,一种是局…

原版畅销36万册!世界级网工打造TCP/IP圣经级教材,第5版终现身

关于TCP/IP 现代网络中,以窃取信息或诈骗为目的的网站频频出现,蓄意篡改数据以及信息泄露等犯罪行为也在与日俱增。很多情况下,人们可能会认为人性本善,在享受着网络所带来的便捷性的同时,也就降低了对网络犯罪的设防…

深入理解java虚拟机:类文件结构(2)

文章目录Class类文件结构2.6 方法表集合2.7 属性表集合3. Class文件结构的发展Class类文件结构 接着上一篇,我们继续补充 2.6 方法表集合 Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方式,方法表的结构如同字段表一样&#x…

算法设计与分析 SCAU17964 水桶打水

17964 水桶打水 时间限制:1000MS 代码长度限制:10KB 提交次数:25 通过次数:9 题型: 编程题 语言: G;GCC;VC;JAVA Description 有n个人&#xff08;n<100000&#xff09;带着大大小小的水桶容器&#xff08;每人一个水桶&#xff09;排队到r个&#xff08;r<1000&#…

JS基础习题

1.JavaScript变量命名规则 1.在JavaScript中以下&#xff0c;以下哪些变量名是非法的&#xff08;会导致程序报错&#xff09;&#xff1f; 1person name var $orderwera23 uiuiuqwer4_23aser2 A .1person&#xff0c;name B .name&#xff0c;var C .$orderwera23&#xff0c…

怎么自制小程序?【自己制作小程序】

说到制作小程序&#xff0c;有些动手能力比较强的小伙伴可能就在想怎么自制小程序。想自制小程序&#xff0c;至少也是需要会一些编程代码的&#xff0c;如果不懂代码就只能找其他方法了。那么怎么自制小程序呢&#xff1f; 现在市面上有很多的小程序制作工具&#xff0c;可以…