聚焦清晰度评价指标所用到的各种算法

首先,我想吐槽一下,看了好几篇聚焦评价函数的文章,说到底都是一篇文章转载或者重复上传,介绍了将近 15 种清晰度的算法,原文找了半天都没找到在哪,最多也仅能找到一些比较早的转载。

  • 无参考图像的清晰度评价方法
  • 模糊图像检测-无参考图像的清晰度评价

里面有些比较有名的算法,如 Brenner,Tenengrad,Laplacian,Variance,Vollath, Entropy 这些都没啥好说的,本文后面也会给出相应的公式,但是这些文章都混进去了一些奇怪的东西,例如 SMD 和 SMD2 函数 。然后 Reblur,查了半天也是没有找到任何有用的信息,直接放弃了。

关于 “SMD 与 SMD2” 的一些溯源

而且有些离谱的东西,例如里面的 SMD 灰分方差函数,我特么 baidu, bing,google 了一遍,除了这篇文章的徒子徒孙,没找到别的有用的信息,最开始的出处都没找到了,连这个缩写是哪几个单词的缩写都没搞明白。最终在参考文献里找到一篇国人的文章:一种快速高灵敏度聚焦函数

在这里插入图片描述
终于看到上面这个,出现在很多文章里的公式,然后顺藤摸瓜,找到引用 [1] 的文章:光学显微镜自动聚焦算法研究,Ctrl F 找一下 SMD,发现文章中关键字零匹配。

合着你这是自己给别人编了个名字?

然后继续读这篇文章,感觉终于接近真相了,这个梯度计算的公式在这文章里是为了快速选择聚焦区域的,并不是拿来做聚焦评价函数的。这文章(一种快速高灵敏度聚焦函数)感觉也太水了,就随随便便的一顿编,结果都是引了这篇文章的基本都错了。

当然这个公式不是不能用,毕竟和 Brenner 还有 Squared gradient 本质没啥区别。

在这里插入图片描述
然后接着说 SMD2,这个就是这文章(一种快速高灵敏度聚焦函数)提出的改进版本的 SMD,呃。。。

在这里插入图片描述
写成公式就是: F = ∑ M ∑ N [ g ( i , j ) − g ( i + 1 , j ) ] [ g ( i , j ) − g ( i , j + 1 ) ] F = \sum_M \sum_N \left [ g(i, j) - g(i+1, j) \right ]\left [ g(i, j) - g(i, j+1) \right ] F=MN[g(i,j)g(i+1,j)][g(i,j)g(i,j+1)]感觉更像 Brenner 和 Squared gradient,不好评价。

  • SMD:光学显微镜自动聚焦算法研究
  • SMD2:一种快速高灵敏度聚焦函数

EAV 边缘锐度算法 与 PAV 点锐度算法

徐贵力、张霞等提出了一种基于边缘锐度的算法用于评价图像的清晰度。通过统计图像某一边缘方向的灰度变化情况来评价。

这段话也是每篇文章都有的(毕竟都是拷贝粘贴的)

然后一通寻找,只找了张霞的(中巴地球资源一号卫星多光谱扫描图象质量评价)文章里确实提到了使用 EAV 算法来评价清晰度,但是不知道是不是源头。徐贵力的那篇论文我没有找到。

但是我这里也有一个问题,EAV 明显是指 Edge Acutance Value,边缘锐度值的意思,为啥介绍的都是经过王鸿南改进的点锐度算法,还是使用 EAV 来作为缩写,不应该根据 Point Acutance Value 缩写城 PAV 吗?迷惑。

论文里的公式如下: E A V = 1 ∣ f ( b ) − f ( a ) ∣ ∑ a b ( d f / d x ) 2 EAV = \frac{1}{|f(b)-f(a)|}\sum_a^b(\mathrm{d}f / \mathrm{d}x ) ^2 EAV=f(b)f(a)1ab(df/dx)2 这么看这个公式,确实迷惑。

其中:df/dx为边缘法向的灰度变化率,f(b) - f(a)为该方向的总体灰度变化。该算法只对图像的特定边缘区域做统计,能否代表整幅图像的清晰度仍有疑问,此外计算前需人工选定边缘区域,不便实现程序运算的自动化。

这个解释也让我一头雾水,可能是我理解力太差了,大概尝试着去理解,就是 d f / d x \mathrm{d}f / \mathrm{d}x df/dx 就是求梯度,但是一般在图像处理里面,都会使用差分来替代。而 a a a b b b 表示人工选定的边缘的法线方向吧,算是我还是放弃了。这个 EAV 也没办法作为聚焦评价函数,所以也就不管它了。

然后来到 PAV 点锐度算法这里,这个论文中的公式是: P A V = 1 M N ∑ i = 1 M × N ∑ a = 1 8 ∣ d f / d x ∣ PAV = \frac{1}{MN}\sum_{i=1}^{M\times N}\sum _{a=1}^8|\mathrm{d}f /\mathrm{d}x | PAV=MN1i=1M×Na=18df/dx我为了方便理解,方便代码实现,将公式写成了下面的样子: P A V = 1 M N ∑ M − 1 ∑ N − 1 ( a 2 + b 1 ) 2 PAV = \frac{1}{MN}\sum _{M-1}\sum_{N-1}\left ( \frac{a}{\sqrt{2}} + \frac{b}{1} \right )^2 PAV=MN1M1N1(2 a+1b)2 a = g ( i − 1 , j − 1 ) + g ( i + 1 , j − 1 ) + g ( i − 1 , j + 1 ) + g ( i + 1 , j + 1 ) − 4 ⋅ g ( i , j ) a = g(i-1, j-1) + g(i+1, j-1) + g(i-1, j+1) + g(i+1, j+1) - 4\cdot g(i, j) a=g(i1,j1)+g(i+1,j1)+g(i1,j+1)+g(i+1,j+1)4g(i,j) b = g ( i − 1 , j ) + g ( i + 1 , j ) + g ( i , j + 1 ) + g ( i , j − 1 ) − 4 ⋅ g ( i , j ) b = g(i-1, j) + g(i+1, j) + g(i, j+1) + g(i, j-1) - 4\cdot g(i, j) b=g(i1,j)+g(i+1,j)+g(i,j+1)+g(i,j1)4g(i,j)

和下面的拉普拉斯梯度挺像的,如果借助拉普拉斯算子来理解的话,假设有一个叫做 PAV 的算子,那么它将会是: PAV operator = [ 1 / 2 1 1 / 2 1 − 4 − 2 2 1 1 / 2 1 1 / 2 ] \text{PAV operator} = \begin{bmatrix} 1/\sqrt{2} & 1 & 1/\sqrt{2}\\ 1 & -4-2\sqrt{2} & 1\\ 1/\sqrt{2} & 1 & 1/\sqrt{2} \end{bmatrix} PAV operator= 1/2 11/2 1422 11/2 11/2

下面有两个代码实现 PAV 点锐度算法:

  • ENVIIDL:利用ENVIIDL实现图像清晰度评价——点锐度算法
  • C++:EVA改进(点锐度算法)图像清晰度评价方法C++实现

下面是原论文出处:

  • EAV:中巴地球资源一号卫星多光谱扫描图象质量评价
  • PAV:图像清晰度评价方法研究

NRSS 和 Reblur

先说 NRSS,也是国人提出来的,看了一下论文,无关的东西就不说了,直接说和清晰度评价指标相关的。

图像清晰与否,本质是包含高频信息的多少,梯度平方和,能量熵函数之类的,都是通过计算高频分量的多少来评价图像是否清晰,也就是说:图像的高频信息越多,则图像越清晰。

这篇论文(一种针对图像模糊的无参质量评价指标)就提出了一种评价高频分量多少的方法: NRSS。

步骤就是先进行低通滤波,得到一幅参考图像,然后计算参考图像和原图的结构相似度。因为低通滤波只是将高的部分过滤了,还保留了低频部分,如果图像高频部分多(清晰的图像),得到的参考图像就会损失很多高频成分,计算两者结构相似度(这里使用 SSIM 计算)的时候得到的数值就会比较小。

就是说,参考图像(经过低通滤波的)和原图的 SSIM 值越小,表示原图越清晰。

公式: N R S S = 1 − 1 N ∑ n = 1 N S S I M ( i n , j n ) NRSS = 1 - \frac{1}{N} \sum _{n=1}^N SSIM(i_n, j_n) NRSS=1N1n=1NSSIM(in,jn)其中, N N N 表示图像中梯度信息最丰富的 N N N 个图像块,原文是针对全图进行的清晰度分析,如果是要在聚焦的时候对焦点的某个区域进行分析的话,就只需要 N = 1 N=1 N=1 一个图像块就行了,这个公式也可以简单写成: N R S S = 1 − S S I M ( i , j ) NRSS = 1 - SSIM(i, j) NRSS=1SSIM(i,j) 只需要对焦点区域进行 NRSS 就行了。

因为也涉及到 SSIM,就简单的介绍一下,公式是: l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 ,       c ( x , y ) = 2 σ x σ y + C 2 σ x 2 + σ y 2 + C 2 ,       s ( x , y ) = σ x y + C 3 σ x σ y + C 3 l(x, y) = \frac{2\mu_x\mu_y + C_1}{\mu_x^2 + \mu_y^2 + C_1}, \space \space \space \space \space c(x, y) = \frac{2\sigma _x\sigma_y + C_2}{\sigma_x^2 + \sigma_y^2 + C_2}, \space \space \space \space \space s(x, y) = \frac{\sigma _{xy} + C_3}{\sigma _x\sigma _y + C_3} l(x,y)=μx2+μy2+C12μxμy+C1,     c(x,y)=σx2+σy2+C22σxσy+C2,     s(x,y)=σxσy+C3σxy+C3 其中 l ( x , y ) l(x, y) l(x,y) 是亮度比较, c ( x , y ) c(x, y) c(x,y) 是对比度比较, s ( x , y ) s(x, y) s(x,y) 是结构信息比较,然后整合起来: S S I M ( x , y ) = [ l ( x , y ) ] α [ c ( x , y ) ] β [ ( s ( x , y ) ) ] γ SSIM(x, y) = [l(x, y)]^\alpha [c(x, y)]^\beta[(s(x,y))]^\gamma SSIM(x,y)=[l(x,y)]α[c(x,y)]β[(s(x,y))]γ具体就不多涉及了,可以看看参考文章。

然后看到这里,然后看看这篇文章(无参考图像的清晰度评价方法)里提到的 Reblur 的结构,是不是感觉很熟悉,不就是一个意思吗,就是使用低通滤波得到一个模糊的参考图像,然后和原图进行结构相似度的比较,得到一个评价指标。得亏那片文章还煞有介事得整出一个 Reblur 来。

  • NRSS:一种针对图像模糊的无参质量评价指标

使用比较普遍的一些算法

基于自相关

Vollath’s F4

F = ∑ M − 1 ∑ N g ( i + 1 , j ) ⋅ g ( i , j ) − ∑ M − 2 ∑ N g ( i + 2 , j ) ⋅ g ( i , j ) F = \sum_{M-1}\sum_N g(i+1, j)\cdot g(i, j) - \sum_{M-2}\sum_N g(i+2, j) \cdot g(i,j) F=M1Ng(i+1,j)g(i,j)M2Ng(i+2,j)g(i,j)

Vollath’s F5

F = ∑ M − 1 ∑ N g ( i + 1 , j ) ⋅ g ( i , j ) − ( M − 1 ) ⋅ N ⋅ g ˉ F = \sum_{M-1}\sum_N g(i+1, j)\cdot g(i, j) - (M-1)\cdot N\cdot \bar{g} F=M1Ng(i+1,j)g(i,j)(M1)Ngˉ

基于统计

方差 Variance

F = 1 M N ∑ M ∑ N ∣ g ( i , j ) − g ˉ ∣ F = \frac{1}{MN}\sum_M\sum_N \left | g(i, j) - \bar{g} \right | F=MN1MNg(i,j)gˉ

归一化方差 Normalized Variance

F = 1 M N ⋅ g ˉ ∑ M ∑ N ∣ g ( i , j ) − g ˉ ∣ F = \frac{1}{MN\cdot \bar{g} }\sum_M\sum_N \left | g(i, j) - \bar{g} \right | F=MNgˉ1MNg(i,j)gˉ

基于直方图

熵 Entropy

F = − ∑ l p l ⋅ log ⁡ 2 p l F = - \sum_{l} p_l \cdot \log_{2} p_l F=lpllog2pl其中 p l p_l pl 是灰度值的相对频率。

log 直方图的方差(Variance of log histogram)

F = ∑ l ( l − E log ( l ) ) 2 ⋅ log ⁡ p l E log ⁡ ( l ) = ∑ l l ⋅ log ⁡ p l F = \sum_{l}(l - E_{\text{log}}(l))^2 \cdot \log p_l \\ E_{\log}(l) = \sum_l l \cdot \log p_l F=l(lElog(l))2logplElog(l)=lllogpl

基于图像差分

EOG(Energy of gradient)

F = ∑ M − 1 ∑ N − 1 ( [ g ( i + 1 , j ) − g ( i , j ) ] 2 + [ g ( i , j + 1 ) − g ( i , j ) ] 2 ) F = \sum _{M-1}\sum _{N-1} \left( \left [g(i+1, j) - g(i, j)\right]^2 + \left [g(i, j+1) - g(i, j) \right ]^2 \right ) F=M1N1([g(i+1,j)g(i,j)]2+[g(i,j+1)g(i,j)]2)

Robert

F = ∑ M − 1 ∑ N − 1 ( [ g ( i + 1 , j + 1 ) − g ( i , j ) ] 2 + [ g ( i + 1 , j ) − g ( i , j + 1 ) ] 2 ) F = \sum _{M-1}\sum _{N-1} \left( \left [g(i+1, j+1) - g(i, j)\right]^2 + \left [g(i+1, j) - g(i, j+1) \right ]^2 \right ) F=M1N1([g(i+1,j+1)g(i,j)]2+[g(i+1,j)g(i,j+1)]2)
感觉和 EOG 没有什么太大的区别

拉普拉斯能量梯度(Energy of image Laplacian)

F = ∑ M − 1 ∑ N − 1 ( g ( i , j + 1 ) + g ( i , j − 1 ) + g ( i + 1 , j ) + g ( i − 1 , j ) − 4 ⋅ g ( i , j ) ) 2 F = \sum _{M-1}\sum _{N-1}\left ( g(i, j+1) + g(i, j-1) + g(i+1, j) + g(i-1, j) - 4\cdot g(i, j) \right )^2 F=M1N1(g(i,j+1)+g(i,j1)+g(i+1,j)+g(i1,j)4g(i,j))2

相当于与拉普拉斯算子进行了一次卷积运算然后再平方: L = [ 0 1 0 1 − 4 1 0 1 0 ] L = \begin{bmatrix} 0 & 1 & 0\\ 1 & -4 & 1\\ 0 & 1 & 0 \end{bmatrix} L= 010141010

Tenengrad gradient

F = ∑ M ∑ N ( G x 2 ( i , j ) + G y 2 ( i , j ) ) F = \sum_M\sum _N \left ( G_x^2(i, j) + G_y^2(i, j) \right ) F=MN(Gx2(i,j)+Gy2(i,j))其中 G x G_x Gx G y G_y Gy 是与 Sobel 算子的卷积。

Brenner gradient

F = ∑ M ∑ N − 2 ∣ g ( i , j + 2 ) − g ( i , j ) ∣ 2     while   ∣ g ( i , j + 1 ) − g ( i , j ) ∣ ≥ θ F = \sum_M\sum _{N-2} \left | g(i, j+2) - g(i, j) \right |^2 \space \space \space \space \text{while} \space \space \left | g(i, j+1) - g(i, j) \right | \ge \theta F=MN2g(i,j+2)g(i,j)2    while  g(i,j+1)g(i,j)θ

一阶高斯导数(First-order Gaussian derivative)

F = 1 M N ∑ M ∑ N ( ( g ( i , j ) ⋅ G x ( x , y , σ ) ) 2 + ( g ( i , j ) ⋅ G y ( x , y , σ ) ) 2 ) F = \frac{1}{MN}\sum _M\sum _N \left( \left ( g(i, j)\cdot G_x(x, y, \sigma ) \right ) ^2 + \left ( g(i, j)\cdot G_y(x, y, \sigma ) \right ) ^2 \right ) F=MN1MN((g(i,j)Gx(x,y,σ))2+(g(i,j)Gy(x,y,σ))2)其中 G x ( x , y , σ ) G_x(x, y, \sigma) Gx(x,y,σ) G y ( x , y , σ ) G_y(x, y, \sigma) Gy(x,y,σ) 是一阶高斯导数,且标准差为 σ = 3 2 d \sigma=\frac{\sqrt{3}}{2}d σ=23 d

Squared gradient

F = ∑ M ∑ N − 1 ∣ g ( i , j + 1 ) − g ( i , j ) ∣ 2     while   ∣ g ( i , j + 1 ) − g ( i , j ) ∣ ≥ θ F = \sum_M\sum _{N-1} \left | g(i, j+1) - g(i, j) \right |^2 \space \space \space \space \text{while} \space \space \left | g(i, j+1) - g(i, j) \right | \ge \theta F=MN1g(i,j+1)g(i,j)2    while  g(i,j+1)g(i,j)θ几乎和 Brenner gradient 一样,就是相邻像素选择不同。

Threshold absolute gradient

F = ∑ M ∑ N − 1 ∣ g ( i , j + 1 ) − g ( i , j ) ∣     while   ∣ g ( i , j + 1 ) − g ( i , j ) ∣ ≥ θ F = \sum_{M}\sum _{N-1} \left | g(i, j+1) - g(i, j) \right | \space \space \space \space \text{while} \space \space \left | g(i, j+1) - g(i, j) \right | \ge \theta F=MN1g(i,j+1)g(i,j)    while  g(i,j+1)g(i,j)θ

Absolute Tenengrad

F = ∑ M ∑ N ( ∣ G x ( i , j ) ∣ + ∣ G y ( i , j ) ∣ ) F = \sum _M\sum _N \left ( |G_x(i, j)| + |G_y(i, j)|\right ) F=MN(Gx(i,j)+Gy(i,j)) 其中 G x G_x Gx G y G_y Gy 是与 Sobel 算子的卷积。

基于峰值和谷值的深度

image power

F = ∑ M ∑ N g ( i , j ) 2     while   g ( i , j ) ≥ θ F = \sum _M \sum _N g(i, j)^2 \space \space \space \space \text{while} \space \space g(i, j) \ge \theta F=MNg(i,j)2    while  g(i,j)θ

Thresholded pixel count

F = ∑ M ∑ N s ( g ( i , j ) , θ )     with   s ( x , θ ) = { 0 ,  if  x ≥ θ 1 ,  if  x < θ F = \sum _M \sum _N s(g(i, j), \theta ) \space \space \space \space \text{with} \space \space s(x, \theta ) = \begin{cases} 0, & \text{ if } x \ge \theta \\ 1, & \text{ if } x < \theta \end{cases} F=MNs(g(i,j),θ)    with  s(x,θ)={0,1, if xθ if x<θ

各种算法的对比

这个是基于他们的数据集得到的结果,可能在不同数据集,各个算法的表现不一样。看起来效果最好的是 absolute tenengrad 。
在这里插入图片描述

参考文献汇总

算法论文出处

  • NRSS:一种针对图像模糊的无参质量评价指标
  • SMD:光学显微镜自动聚焦算法研究
  • SMD2:一种快速高灵敏度聚焦函数
  • EAV:中巴地球资源一号卫星多光谱扫描图象质量评价
  • PAV:图像清晰度评价方法研究

代码实现

  • ENVIIDL 实现 PAV:利用ENVIIDL实现图像清晰度评价——点锐度算法
  • C++ 实现 PAV:EVA改进(点锐度算法)图像清晰度评价方法C++实现
  • Matlab实现:11种图像清晰度评价函数附MATLAB代码
  • C++实现:无参考图像的清晰度评价方法及实现源码

其他

  • SSIM 讲解:SSIM (Structure Similarity Index Measure) 结构衡量指标+代码
  • 15种常见的清晰度评价指标:An algorithm selection methodology for automated focusing in optical microscopy

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPHP的方法接收json数据问题

第一次接触到前后端分离开发&#xff0c;需要在后端接收前端ajax提交的json数据&#xff0c;开发基于ThinkPHP3.2.3框架。于是一开始习惯性的直接用I()方法接收到前端发送的json数据&#xff0c;然后用json_decode()解析发现结果为空&#xff01;但是打印出还未解析的值却打印得…

(C++)复写零--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

C/C++内存管理(含C++中new和delete的使用)

文章目录 C/C内存管理&#xff08;含C中new和delete的使用&#xff09;1、C/C内存分布2、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3、C动态内存管理3.1、new/delete操作内置类型3.2、new/delete操作自定义类型 4、operator new与operator delete函数5、…

立刻解决缺少msvcp140_1.dll解决方法,msvcp140_1.dll修复指南

在日常使用电脑的过程中&#xff0c;我们有时会遇到由于某些重要的DLL文件缺失而导致的程序无法正常启动的问题。很多用户可能都经历过由于缺少msvcp140_1.dll导致应用程序无法运行的情况。本文将为你提供解决msvcp140_1.dll缺失问题的详尽方法&#xff0c;附带对每种方法优点和…

景联文科技加入中国人工智能产业联盟(AIIA)数据委员会

近日&#xff0c;景联文科技加入中国人工智能产业联盟&#xff08;AIIA&#xff09;数据委员会&#xff0c;成为委员会成员单位。 中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;是在国家发改委、科技部、工信部、网信办指导下&#xff0c;由中国信息通信研究院等单…

Kafka 分布式消息系统

文章目录 消息中间件对比Kafka概述kafka安装和配置kafka入门生产者发送消息消费者接收消息 Kafka高可用设计集群备份机制(Replication&#xff09;备份机制(Replication)-同步方式 kafka生产者详解同步发送异步发送参数详解(ack)参数详解(retries)参数详解-消息压缩 kafka消费者…

Day45力扣打卡

打卡记录 无矛盾的最佳球队&#xff08;线性DP&#xff09; class Solution:def bestTeamScore(self, scores: List[int], ages: List[int]) -> int:n len(scores) nums sorted(zip(scores, ages))f sorted(scores)for i in range(n):for j in range(0, i):if nu…

P8A012-A016组策略安全

账户策略 【预备知识】 组策略&#xff08;Group Policy&#xff09;是Microsoft Windows系统管理员为用户和计算机定义并控制程序、网络资源及操作系统行为的主要工具。通过使用组策略可以设置各种软件、计算机和用户策略。 【实验步骤】 网络拓扑&#xff1a;server2008A…

【开发实践】使用jstree实现文件结构目录树

一、需求分析 因开发系统的需要&#xff0c;维护服务端导出文件的目录结构。因此&#xff0c;需要利用jstree&#xff0c;实现前端对文件结构目录的展示。 【预期效果】&#xff1a; 二、需求实现 【项目准备】&#xff1a; jstree在线文档&#xff1a;jstree在线文档地址 …

(C++)移动零--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://le…

ZooKeeper的分布式锁---客户端命令行测试(实操课程)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----​​​​​​zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09;。 阅读本文之前&#xff0c;请先阅读…

【Vue3】源码解析-虚拟DOM

【Vue3】源码解析 系列文章什么是虚拟DOMVue 3虚拟DOM获取<template>内容生成AST语法树生成render方法字符串得到最终VNode对象 系列文章 【Vue3】源码解析-前置 【Vue3】源码解析-响应式原理 【Vue3】源码解析-虚拟DOM 什么是虚拟DOM 在浏览器中&#xff0c;HTML页面…

基于asp.net 消防安全宣传网站设计与实现

目 录 1 绪论 1 1.&#xff11;课题背景 1 1.2 目的和意义 1 1.3主要研究内容 1 1.4 组织结构 2 2 可行性分析 3 2.1技术可行性 3 2.2经济可行性 3 2.3操作可行性 3 2.4系统开发环境 4 3 需求分析 7 3.1性能分析 7 3.2业务流程分析 7 3.3数据流程分析 9 4 系统设计 11 4.1系统…

创建SpringBoot流程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、操作步骤总结 前言 我使用的是jdk1.8版本的&#xff0c;idea社区版的&#xff08;专业版的应该也差不多吧&#xff09; 提示…

Leetcode算法之哈希表

目录 1.两数之和2.判定是否互为字符重排3.存在重复元素I4.存在重复元素II5.字母异位词分组 1.两数之和 两数之和 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> hash;for(int i0;i<nums.si…

数据结构---二叉树

二叉树的概念及结构 1.概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合: 或者为空 由一个根节点加上两棵别称为左子树和右子树的二叉树组成 从上图可以看出&#xff1a; 二叉树不存在度大于2的结点 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#xff0c;因此…

某60物联网安全之IoT漏洞利用实操2学习记录

物联网安全 文章目录 物联网安全IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09;实验目的实验环境实验工具实验原理实验内容实验步骤ARM ROP构造与调试MIPS栈溢出漏洞逆向分析 IoT漏洞利用实操2&#xff08;内存破坏漏洞&#xff09; 实验目的 学会ARM栈溢出漏洞的原理…

Unity C++交互

一、设置Dll输出。 两种方式&#xff1a; 第一&#xff1a;直接创建动态链接库工程第二&#xff1a;创建的是可执行程序&#xff0c;在visual studio&#xff0c;右键项目->属性(由exe改成dll) 二、生成Dll 根据选项Release或Debug&#xff0c;运行完上面的生成解决方案后…

FPGA设计时序约束十、others类约束之Set_Disable_Timing

目录 一、序言 二、Set Disable Timing 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考资料 一、序言 在Vivado的时序约束窗口中&#xff0c;存在一类特殊的约束&#xff0c;划分在others目录下&#xff0c;可用于设置忽略或修改默认的时…

7.浮点数转为整数【2023.11.29】

1.问题描述 给出一个浮点数&#xff0c;请将这个浮点数转换成整数。 2.解决思路 输入一个浮点数。 输出程序将浮点数转换为整数并输出。 3.代码实现 numfloat(input("请输入一个浮点数")) num1int(num) print(num1)4.运行结果