超分之一文读懂SRGAN

article/2025/11/8 22:30:17

在这里插入图片描述

这篇文章介绍SRResNet网络,以及将SRResNet作为生成网络的GAN模型用于超分,即SRGAN模型。这是首篇在人类感知视觉上进行超分的文章,而以往的文章以PSNR为导向,但那些方式并不能让人眼觉得感知到了高分辨率——Photo-Realistic

参考目录:
①:SRResNet概要
②:深度学习端到端超分辨率方法发展历程
③:GAN-李宏毅
④:GAN的理解(内含③中PPT)
⑤:Pytorch源码

Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network

  • Abstract
  • 1 Introduction
  • 2 Method
    • 2.1 Adversarial network architecture
    • 2.2 Perceptual loss function
      • 2.2.1 Content loss
      • 2.2.2 Adversarial loss
  • 3 Experiments
    • 3.1 Data and similarity measures
    • 3.2 Training details and parameters
    • 3.3 Mean opinion score (MOS) testing
    • 3.4 Investigation of content loss
    • 3.5 Performance of the final network
  • 4 Conclusion

Abstract

  1. SRGAN本质上是提供了一种新的Loss function——perceptual loss(感知损失),回忆一下之前的SR都是由MSE损失函数来教会网络如何实现 L R → H R LR\to HR LRHR,因此在本文中作者就会指出MSE的不足之处:其会对图像的细节进行平滑,使得重建的图像虽然有很高的PSNR,但是失去了人肉眼感知的高分辨率感,即论文中的Photo-Realistic。
  2. 在这里插入图片描述
    本文是实现重建图像photo-realistic的首篇文章,其实现了在up-scale factor较大情况下,图像能有更多的重建细节,因此尽管在PSNR并不高的情况下,产生让人肉眼感官更加舒适的 H R HR HR图像(这其实不就是我们做SR的初衷么,这篇文章也告诉我们不一定PSNR高的图像就是我们追求的最终目标,而是photo-realistic)。具体地,引入GAN网络,因为GAN网络可以产生具有高感知质量的图像,而我们最终目标是使用感知loss去训练一个生成网络 G G G,其中感知loss由adversarial-loss和content-loss组成,这个网络主要由Resnet块组成,因此这个生成网络也叫SRResNet。由于GAN还有一个判别网络 D D D,因此整体的网络模型我们称之为SRGAN
  3. PSNR/SSIM并不能体现photo-realistic图像的质量,因此作者提出了一种新的图像质量评价指标来反映测试对象和真实高分辨率图像的相似程度,它就是mean-opinion-score(MOS)

1 Introduction

图像重建细节受限的原因
在这里插入图片描述上图中,每一个矩形框都代表着一个像素,其中红色框未作处理的原图,蓝色是用MSE损失函数作为目标函数产生的训练结果,黄色是用感知损失作为目标函数产生的训练结果。从图中可以看出,蓝色框产生的结果在肉眼看来很模糊,这其实是MSE本质上是像素级基础上平均化的计算,因此自然就会将一些图像细节平滑掉(哪怕蓝色框的PSNR很高,我们也不希望是这样的结果)。


MSE损失函数的局限性
虽然直接优化MSE可以产生较高的PSNR/SSIM,但是在up-scale factor较大的情况下,MSE作为loss function引导的学习无法使得重建图像捕获细节信息。
在这里插入图片描述如上图所示,图二(从左边起第二张)虽然能产生较高的PSNR,但是在我们肉眼看来,明显图3拥有更高的分辨率。这就告诉我们,不能单纯的只把PSNR的提高作为优化目标,我们需要较高的PSNR,但是不能说PSNR就是我们的终极目标,不能以PSNR为唯一的目标,因为SR技术的最终目的还是要让人的肉眼感知更高的图像细节(实现photo-realistic),因此我们接下去就要更改MSE损失函数。

2 Method

I L R 、 I S R 、 I H R I^{LR}、I^{SR}、I^{HR} ILRISRIHR分别是低分辨率图像、重建图像、高分辨率图像(标签)。
我们的目标是训练出一个生成网络 G θ G G_{\theta_G} GθG,其中 θ G = { W 1 : L ; b 1 : L } \theta_G=\{W_{1:L};b_{1:L}\} θG={W1:L;b1:L}是网络参数空间。
我们用mini-batch的方式来估计生成网络的参数:
θ G ^ = a r g m i n θ G 1 N ∑ n = 1 N l S R ( G θ G ( I n L R ) , I n H R ) . (1) \hat{\theta_G} = argmin_{\theta_G}\frac{1}{N}\sum^N_{n=1}l^{SR}(G_{\theta_G}(I_n^{LR}), I_n^{HR}).\tag{1} θG^=argminθGN1n=1NlSR(GθG(InLR),InHR).(1)其中, G θ G ( ⋅ ) G_{\theta_G}(\cdot) GθG()表示生成网络输出的重建图像 I S R I^{SR} ISR l S R l^{SR} lSR就是后面2.2节要介绍的感知loss。

2.1 Adversarial network architecture

这一节将对对SRGAN中的生成网络和判别网络进行描述。
GAN解决的是一个MM问题,也就是min-max类型问题,具体的,对于GAN网络来说,其目标函数可定义为:
min ⁡ θ G max ⁡ θ D E I H R ∼ p t r a i n ( I H R ) [ l o g D θ D ( I H R ) ] + E I L R ∼ p G ( I L R ) [ l o g ( 1 − D θ D ( G θ G ( I L R ) ) ) ] . (2) \min_{\theta_G}\max_{\theta_D}\mathbb{E}_{I^{HR}\sim p_{train}(I^{HR})}[log D_{\theta_D}(I^{HR})] + \mathbb{E}_{I^{LR}\sim p_G(I^{LR})}[log(1-D_{\theta_D}(G_{\theta_G}(I^{LR})))].\tag{2} θGminθDmaxEIHRptrain(IHR)[logDθD(IHR)]+EILRpG(ILR)[log(1DθD(GθG(ILR)))].(2)
①:首先我们来看内层的maximization部分,相当于固定 θ G \theta_G θG不动,来学习调整 θ D \theta_D θD,也就是说内层是Discrimination(判别)网络的目标函数,为的是训练一个判别器网络 θ D \theta_D θD在这里插入图片描述它背后的思想就是给 I H R I^{HR} IHR(标签)打一个高的分数,给经过生成网络出来的 I S R I^{SR} ISR一个低的分数,刚开始的时候判别网络 D D D往往很容易判别,因为生成网络的结果会和标签差别很大,比如判别器只需要认准图片中是否含有眼睛就可以区分是生成网络的结果还是标签。
②:然后再来看外层,固定住判别网络参数,来学习调整生成网络的参数。在这里插入图片描述
它的目的就是通过调整 θ G \theta_G θG来使得 D θ D ( G θ G ( I L R ) ) D_{\theta_D}(G_{\theta_G}(I^{LR})) DθD(GθG(ILR))尽可能变大,也就是说生成器网络的训练是为了让输出的结果通过判别网络输出一个较高的分数,从而骗过判别器,让判别器以为是标签 I H R I^{HR} IHR
③:因此我们可以看出生成器变强之后,也会促使下一次判别网络会继续变强,增加区分真假的能力;再轮到生成器,他会继续增加假货(输入经过 G G G之后的输出)在判别器的分数,然后判别器继续提升,不断循环迭代,两者互相对抗,互相成长,最好训练得到的生成器网络就是我们所想要的网络。最后我们来看一下最初时候GAN的伪代码:在这里插入图片描述


接下来我们来看一下SRGAN里的生成网络 G G G和判别网络 D D D是怎么样的吧?
在这里插入图片描述

①:从上图来看,SRGAN网络的生成网络部分就是一个以 B B B个Resnet块组成的深度网络。其中比如“k9n64s1”指的是 n = 64 n=64 n=64 9 × 9 9\times 9 9×9,stride为1的卷积核。既然用到了Resnet,自然主要目的就是使用skip connection来加强信息跨层之间的流动以及防止网络深度的加深导致的梯度消失问题。单看SRResNet的结构和SRDenseNet类似,分为低层特征提取、高层特征提取、反卷积(转置卷积)层以及最后的CNN重建层
②:SRGAN网络的判别网络部分就是为了训练式(2)的maximization部分,它就是很普通的一个CNN网络,其中激活函数使用Leaky-ReLU( α = 0.2 \alpha=0.2 α=0.2)来防止一些负性输出坏死;此外,网络的末端使用了Dense块再接sigmoid函数做一个二分类(其实就是对 I S R I^{SR} ISR I H R I^{HR} IHR进行打分)。整体的判别网络就是一个没有池化层的VGG网络,其中每经过一次跨步卷积(主要为了减少冗余信息的计算),图像的size就会减小,接着下一层feature map的数量就会翻倍。

2.2 Perceptual loss function

接下来介绍生成网络的Loss function——感知损失函数。在之前我们的Loss一般都是MSE,但是正如之前所说的MSE无法很好的恢复图像的细节,故我们改采用感知损失:
l S R = l X S R ⏟ c o n t e n t l o s s − 1 0 − 3 ⋅ l G e n S R ⏞ a d v e r s a r i a l l o s s . (3) \begin{matrix} l^{SR} = \underbrace{l_X^{SR}}_{content\,loss} - \overbrace{10^{-3}\cdot l_{Gen}^{SR}}^{adversarial\,loss}.\tag{3} \end{matrix} lSR=contentloss lXSR103lGenSR adversarialloss.(3)Note:

  1. 我们采用感知损失来训练生成网络,它由内容损失:文中取MSE或者VGG损失以及一定比率的对抗损失(GAN网络本身就有的损失函数)组成。
  2. SRResNet是只由MSE损失函数训练的,而不是感知损失,但是网络还是用的上面的网络;而SRGAN的训练中,生成网络部分才使用感知损失训练的。

2.2.1 Content loss

内容损失有2种方案:

  1. pixel-wise级的MSE损失。
  2. feature-map-wise级的VGG损失。

下面我们分别展开来介绍。
①:首先是MSE损失,之所以还启用MSE损失,是因为PSNR也是我们比较看重的一个点,我们强调肉眼感知上的高分辨率,但也不能少了PSNR的评价,因此MSE可作为总体loss的一部分:
l X S R = l M S E S R = 1 r 2 ⋅ W ⋅ H ∑ x = 1 r W ∑ y = 1 r H ( I x , y H R − G θ G ( I L R ) x , y ) 2 . (4) l_X^{SR} = l_{MSE}^{SR} = \frac{1}{r^2\cdot W\cdot H}\sum_{x=1}^{rW}\sum_{y=1}^{rH}(I_{x,y}^{HR} - G_{\theta_G}(I^{LR})_{x,y})^2.\tag{4} lXSR=lMSESR=r2WH1x=1rWy=1rH(Ix,yHRGθG(ILR)x,y)2.(4)

②:然后我们来介绍VGG损失,所谓的VGG损失是作者采用预训练好的VGG-19网络的特征向量,使得生成网络的结果通过VGG某一层之后产生的feature map和标签 I H R I^{HR} IHR通过VGG网络产生的feature map做loss,作者指出这种loss更能反应图片之间的感知相似度。
具体的,定义 ϕ i , j \phi_{i,j} ϕi,j表示VGG网络第 j j j层卷积之后,第 i i i层最大池化层之前的feature map输出,则VGG-loss可表示为:
l X S R = l V G G / ( i , j ) S R = 1 W i , j H i , j ∑ x = 1 W i , j ∑ y = 1 H i , j ( ϕ i , j ( G θ G ( I L R ) ) x , y − ϕ i , j ( I H R ) x , y ) 2 . (5) l_X^{SR} = l_{VGG/(i,j)}^{SR} = \frac{1}{W_{i,j}H_{i,j}}\sum_{x=1}^{W_{i,j}}\sum_{y=1}^{H_{i,j}}(\phi_{i,j}(G_{\theta_G}(I^{LR}))_{x,y} - \phi_{i,j}(I^{HR})_{x,y})^2.\tag{5} lXSR=lVGG/(i,j)SR=Wi,jHi,j1x=1Wi,jy=1Hi,j(ϕi,j(GθG(ILR))x,yϕi,j(IHR)x,y)2.(5)Note:

  1. W 和 H W和H WH分别表示VGG网络中feature map的维度,一般指的是feature map的张数。
  2. VGG损失是feature-map-wise,它拥有比MSE更好地能力去衡量感知上的相似度。也容易理解,feature-map-wise是对 H R 和 S R HR和SR HRSR图像整体做loss,因此它提升的是 S R SR SR图像整体感知;而MES是针对像素级(pixel-wise),这样很容易将图像局部细节平滑掉。这一点在后续实验中也会体现出来。

2.2.2 Adversarial loss

对抗损失函数就是GAN中常用的形式,我们要最小化:
l G e n S R = ∑ n = 1 N − l o g D θ D ( G θ G ( I L R ) ) . (6) l_{Gen}^{SR} = \sum^N_{n=1}-log D_{\theta_D}(G_{\theta_G}(I^{LR})).\tag{6} lGenSR=n=1NlogDθD(GθG(ILR)).(6)背后的目的就是要让生成网络的结果产生较高的判别值来骗过判别网络。

3 Experiments

3.1 Data and similarity measures

  1. 文章采用的数据集如下:Set5、Set14、BSD100、BSD300、ImageNet
  2. up-scale-factor = 4。
  3. PSNR/SSIM只在Y通道上计算。
  4. 实验中对比的算法如下:Nearest Neighbor(NN)、Bicubic、SRCNN、SelfExSR、DRCN、ESPCN、SRResNet变体(SRResNet(MSE-based)、SRResNet(VGG22-based))、SRGAN变体(SRGAN(MSE-based)、SRGAN(VGG22-based)、SRGAN(VGG54-based))。

3.2 Training details and parameters

  1. 作者从ImageNet上取下35W张图片作为网络的训练集,然后将裁剪后的 96 × 96 96\times 96 96×96 H R HR HR图片通过Bicubic × 4 \times 4 ×4下采样得到 L R LR LR图像。
  2. mini-batch=16。
  3. 生成网络部分设置16个残差块。
  4. 采用Adam做优化。
  5. SRResNet(MSE-based)使用学习率为 1 0 − 4 10^{-4} 104训练100W个epoches。对于SRGAN的训练,由于SRResNet可以作为SRGAN的生成网络,因此作者将训练好的SRResNet的参数作为生成网络的初始参数来避免陷入局部最优。
  6. SRGAN变体的训练方式:前10W个epoches采用 1 0 − 4 10^{-4} 104的学习率,后10W个epoches采用 1 0 − 5 10^{-5} 105的学习率。

3.3 Mean opinion score (MOS) testing

作者提出了一种叫MOS图像评价指标,用于衡量重建图像的感知质量
MOS就是让26个评分人对图片进行打分,其中最低为1分(低视觉质量),最高为5分(高视觉质量)。
实验中,作者对12种算法在Set5、Set14、BSD100数据集上打分,其中SRResNet(VGG22-based)、SRGAN(MSE-based)、SRGAN(VGG22-based)这三种不在BSD100数据级上打分,所以一共要对1128( 12 × 19 + 9 × 100 12\times 19 + 9\times 100 12×19+9×100)张图片进行打分。
因此MOS是一种人主观意识层面的打分系统,其直接和图片的photo-realistic相关。

在这里插入图片描述

上图是26个评分人对BSD100数据集的打分统计,红色的点是对某个算法在2600张图片种的平均值,比如对于HR图像,大部分评价分数都是5分,可以看出蓝色部分很深,但也有少部分3分或者4分,因此平均下来就是靠近5分但不到的样子,平均的思想就是MOS名字种Mean来源。

3.4 Investigation of content loss

这一节是对两个变体的表现力比较,主要评价指标是PSNR/SSIM以及MOS。
SRResNet变体(SRResNet(MSE-based)、SRResNet(VGG22-based))。
SRGAN变体(SRGAN(MSE-based)、SRGAN(VGG22-based)、SRGAN(VGG54-based))。
首先先对这5种模型进行说明:

  1. SRResNet(MSE-based):以MSE为内容损失函数,没有对抗损失,后面的SRResNet就是指MSE-based。
  2. SRResNet(VGG22-based):以VGG22损失函数为内容损失,没有对抗损失。
  3. SRGAN(MSE-based):以MSE为内容损失函数,外加2.2.2节的对抗损失。
  4. SRGAN(VGG22-based):以VGG22损失函数为内容损失,主要用于捕获低层细节,外加2.2.2节的对抗损失。
  5. SRGAN(VGG54-based):以VGG54损失函数为内容损失,主要用于捕获高层细节,外加2.2.2节的对抗损失,后面的SRGAN一般指的就是以VGG54为内容损失函数。

实验结果如下:
在这里插入图片描述
在这里插入图片描述

  1. 从上述实验中我们可以看出,SRGAN虽然不能获取最佳的PSNR,但是却有着更好的视觉效果,能体现更多的细节,这一点从MOS值也可以看出来,可以说SRGAN实现了photo-realistic。
  2. 在SRResNet中,VGG-based要比MSE-based有更高的MOS值,说明feature-map-wise要比pixel-wise有更好的感知能力,可以训练出更多的图像细节
  3. 从SRResNet(MSE-based)和SRGAN(MSE-based)来看,可以比较得出之所以SRGAN(MSE-based)的PSNR较低而MOS较高,是因为MSE作为内容损失和对抗损失内部竞争的结果,即PSNR的提升和感知质量的提升是对抗性的。
  4. 此外,SRResNet也实现了较高的PSNR值。
  5. 从Set14可以看出,VGG54-based比VGG22-based的MOS更高,说明更高层的图像特征会产生更多的图像细节,使得可以重建出视觉上更好的高分辨率图像。

3.5 Performance of the final network

在这里插入图片描述
从上图中我们可以获取2个重要结论:

  1. SRResNet在PSNR/SSIM上可以取得SOAT的结果。
  2. SRGAN获得最高的MOS值,说明其可以重建出更好的图像细节,在视觉上更加舒适,即实现了photo-realistic。

4 Conclusion

  1. 本文提出了在SISR领域的一种称之为SRGAN模型,其可以重建出具有较高感知质量,即人肉眼感知舒适的,具有丰富细节的图像。
  2. SRResNet可以单独作为一个SR网络,作者采用MSE为Loss函数,使用 × 4 \times 4 ×4的缩放倍数和16个残差块来实现当时的SOAT。
  3. SRGAN中的生成网络就是SRResNet网络,其以ResNet块为基本结构,是一个具有深度的SR网络。生成网络使用感知损失进行训练,而不是传统的MSE方法,它使用预训练之后的VGG网络产生的feature map级进行计算,再加上本身生成网络带有的对抗损失。此外判别器也需要去训练,两个网络结合起来就是我们的SRGAN网络。
  4. 本文提出了一种新的用于评价图像photo-realistic的标准——MOS,SRGAN在这个指标下达到了最佳的性能,重建出人肉眼感知最舒适的高分辨率图像。

http://chatgpt.dhexx.cn/article/DIlJuMaj.shtml

相关文章

图像超分经典网络 SRGAN 解析 ~ 如何把 GAN 运用在其他视觉任务上

生成对抗网络(GAN)是一类非常有趣的神经网络。借助GAN,计算机能够生成逼真的图片。近年来有许多“AI绘画”的新闻,这些应用大多是通过GAN实现的。实际上,GAN不仅能做图像生成,还能辅助其他输入信息不足的视觉任务。比如SRGAN&…

Oracle常用函数汇总记录

Oracle常用函数汇总记录 一、SUBSTR 截取函数 用法:substr(字符串,截取开始位置,截取长度) //返回截取的字, 字符串的起始位置为1,截取时包含起始位置字符 1.SUBSTR( “Hello World”, 2 ) //返回结果为:ello World,从第二个字符开始截取至末位 2.SUBSTR( “Hello World”, -2…

oracle一些常用函数用法,Oracle常用函数及其用法

01、入门Oracle 本章目标: 掌握oracle安装、启动和关闭 基本管理以及常用工具 简单备份和恢复 熟练使用sql,掌握oracle常用对象 掌握数据库设计和优化基本方法 http://jingyan.baidu.com/article/5d6edee228308899eadeec3f.html oracle数据库&#xff1a…

oracle常用函数详解(详细)

Oracle SQL 提供了用于执行特定操作的专用函数。这些函数大大增强了 SQL 语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。 Oracle 数据库中主要使用两种类型的函数: 1. 单行函数:对每一个函数应用在表的记录中时&#…

event对象的offsetX、clientX、pageX、screenX及 window.innerWidth、outerWidth使用详解

目录 offset client screen page window.innerWidht offset offsetX、offsetY为当前鼠标点击位置距离当前元素参考原点(左上角)的距离,而不同浏览器参考原点的位置不尽相同,FF及Chrome中参考原点为内容区域左上角,不…

什么?你还不知道offsetX、offsetY和clientX、clientY和pageX、pageY和screenX、screenY的区别,进来唠唠

offsetX、offsetY: 鼠标相对于事件源元素的X,Y坐标。比如说,给黄色的盒子定义一个点击事件,则这个offset的坐标原点就在这个黄色盒子的左上角,offsetX、offsetY就是相对于这个盒子的x、y坐标 clientX、clientY: 鼠标相对于浏览器窗口可视区域…

event对象的offsetX, clientX, pageX, screenX

现在需要对event对象的几大与坐标有关的属性做一个总结,以便于认识 offsetX|offsetY offsetX/Y获取到是触发点相对被触发dom的左上角距离(包括padding在内,不包括border),不过左上角基准点在不同浏览器中有区别,以内容区左上角为基…

vue拖拽指令之offsetX、clientX、pageX、screenX

自己一直很想做个拖拽生成静态页面的东西,说简单也简单,这个东西按道理用jsx语法是最好的,用render方法渲染生成的json。只是自己对这块还是没信心。今天写个vue的拖拽指令,顺便理一下offsetX、pageX、clientX、screenX这几个属性…

鼠标事件offsetX会传递给子元素

鼠标事件offsetX会传递给子元素 本来是想要通过e.offset来创建XY轴二维坐标系的,当事实上很难办到,所以我改用了通过div.offsetWidth(元素宽度包括border)、div.offsetLeft(元素距整个网页左边缘的长度)、e…

类似淘宝商品放大镜功能,以及offsetX、offsetY造成的鼠标移动时阴影部分会一闪一闪的不断回到左上角问题

效果:效果是当鼠标移入的时候小图出现一小块是以鼠标为中心的遮罩层,鼠标在小图移动时大图放大显示遮罩层所在的局部,且遮罩层不能超出小图位置。如下图所示: html部分 从代码可知大图和小图是分别两个img标签图片其实也是一样…

event.offsetX event.pageX event.clientX 和 obj.offsetLeft学习笔记

一、问题描述 工作中,需要在航拍图中 添加摄像头在航拍图中的位置,因此,需要开发一个功能:鼠标点击航拍图(背景),显示鼠标点击位置在页面中的位置(pageX和pageY),然后将…

html什么代码确定x坐标,HTML MouseEvent offsetX用法及代码示例

MouseEvent offsetX属性是一个只读属性,用于返回鼠标指针相对于目标元素的x坐标。 用法: event.offsetX 返回值:它返回一个数字,该数字表示鼠标指针的水平坐标,以像素为单位。 以下示例程序旨在说明MouseEvent offsetX属性&#x…

写轮播图时,关于offsetX和pageX的选择以及一些坑

一、不要使用offsetX 前几天在公司实习,由于使用了swiper来做c端的滑动效果,在自定义的过程中,出现了一系列的坑,我看了源码,看了文档,也还是没有很好的理解,这个swiper的标准操作流程&#xff…

js e.offsetX 和 e.offsetY

本人自己在写代码的过程中&#xff0c;一直对e.offsetX 与 e.offsetY 分不清&#xff0c;今天好好探究一下e.offsetX 与 e.offsetY e.offsetX 与 e.offsetY 下相对与事件源的距离&#xff0c;也就是距离e.target的距离&#xff0c; 大家看下面例子,给出几张截图。 <!DOCTY…

html5 offsetx,原生HTML5关于Div对象的.clientLeft、.offsetLeft、.clientX、.offsetX区分

本篇主要介绍clientLeft、offsetLeft、clientX、offsetX这四种元素属性的区别&#xff0c;首先我们要理解清楚它们的概念&#xff1a; clientLeft&#xff1a;该元素对象的左边框宽度。 clientWidth&#xff1a;该元素对象的左内边框至右内边框的距离。 offsetLeft&#xff1a;…

html5 offsetx,event对象中offsetX,clientX,pageX,screenX的区别

1、offsetX offset意为偏移量,是事件对象距左上角为参考原点的距离。以元素盒子模型的内容区域的左上角为参考点。不包括border。 2、clientX 事件对象相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条 3、pageX 事件对象相对于整个文档的坐标以像素…

彻底搞懂 offsetX、scrollX、clientX 的区别

无论在 iOS 还是前端开发中&#xff0c;关于如何定位一个元素是必须要掌握的知识&#xff0c;而在前端中&#xff0c;元素定位比较难理解&#xff0c;我们今天一起学习下。 在 DOM 设计中&#xff0c;主要通过这些 API 来确定某个元素的具体位置。 offsetTop, offsetLeft, offs…

Java数组赋值时内存中的变化

java中的方法区存放的是编译后的文件 xxx.class文件当创建数组对象时&#xff0c;数组对象会存放在堆里面&#xff0c;数据也存在于堆。当给数组赋值时&#xff0c;方法会进栈&#xff0c;然后拿着数组的地址去堆里面寻找数据并赋值

Java数组:用fill()方法给数组赋值

Arrays类可以在指定位置进行数值填充&#xff0c;但是只能使用同一个数值进行填充&#xff1a; Arrays.fill(Object[] a,Object value);a表示数组&#xff0c;value表示填充的值 例1 public static void main(String[] args) {int[] a new int[6];//声明创建一个数组System.o…

Java数组练习--数组随机赋值

随机数生成&#xff1a;使用Math.random()方法&#xff0c;即&#xff1a; [ 0 , 1 ) → [ 0 , 1 ) 30 → [0 ,30) [0 ,30) 1 → [1,31) 取整后范围是[1,30] 此题目要点是&#xff0c;赋值之后的数组元素&#xff0c;要与之前赋值元素的值比较&#xff…