Li的前期工作Level_Set_Evolution_Without_Re-initialization_A_New_Variational_Formulation
注意:因为页面显示原因。里头的公式没能做到完美显示,有须要的朋友请到我的资源中下载
无需进行又一次初始化的水平集演化:一个新的变分公式
Chunming Li , Chenyang Xu , Changfeng Gui , and Martin D. Fox
1.Department of Electrical and 2.Department of Imaging 3.Department of Mathematics
Computer Engineering and Visualization University of Connecticut
University of Connecticut Siemens Corporate Research Storrs, CT 06269, USA
Storrs, CT 06269, USA Princeton, NJ 08540, USA gui@math.uconn.edu
{cmli,fox}@engr.uconn.edu chenyang.xu@siemens.com
摘要
在本文中。我们表达了一个新的变化的框架对于几何活动轮廓。它迫使水平集函数接近于一个符号距离函数,而且因此全然的排除了代价性的又一次初始化的过程。
我们的变化的构架由一个内部能量项。它惩处了来自符号距离函数的水平集函数的偏离,另一个外部能量项,它能够驱动零水平向着预想的图像特征运动。比方目标边界。水平集函数结果的演变是梯度流,它最小化了整个的能量函数。
提出的变化的水平集构架有三个基本的长处比起传统的水平集构架。
首先,能够用一个明显的更大的时间步骤去进行数值性的解决演变的偏微分方程。
。因此加速了曲线演化。第二,水平集函数能用一般的函数进行初始化,该函数对于构架是很有效的,而且在使用中更easy。第三,在我们框架中水平集演变能够通过简单有效的差框架来实施,而且计算更加有效。
1.介绍
近年来。研究人员在几何活动轮廓提取方面做了非常多的工作。比如。通过使用水平集方法来实现的活动轮廓提取,同一时候该方法已经被广泛的使用在解决各种图像切割处理及计算机模式识别方面。
水平集方法是Osher 和Sethian于1998年针对火焰变化分析等流体力学问题研究是提出来的。
活动轮廓是由Kass。Withins和Terzopoulos在研究从图像上同一时候使用动态曲线演化方法切割目标是提出来的。如今的活动轮廓能够被宽泛的分为參数活动轮廓模型或者几何活动轮廓模型依据他们的表示和实施。特别的,參数活动轮廓明白的代表參数的轮廓在一个拉格朗日框架中。而几何活动轮廓明白代表二维函数在欧拉框架中演化水平集。
几何活动轮廓被独立的引入。
这些模型是基于曲线演变理论和水平集方法。
这些基本思想是去表达轮廓作为一个隐函数定义在高维的零水平集,通常叫做水平集函数,而且依据偏微分方程来演化水平集函数。这种方法代表几个长处相对于传统的參数活动轮廓首先,由水平集函数表示的轮廓会自己主动的断开或者融合在演化的过程中。而且拓扑改变会自然处理。
第二,水平集函数综述保持在一个固定的网格上,这同意了有效的数值框架。
早期的几何活动轮廓通常使用拉格朗日框架,派生出一个带參数演化的偏微分方程,这个偏微分方程之后转化成能够进行演化的基于水平集方法的偏微分方程与从水平集方法中得出的欧拉方程有一定的联系。作为替代方案。水平集函数的演变的偏微分方程能够直接来自于最小化目标能量函数的水平集函数定义的问题。这样的类型的变分方法被称为变分水平集方法。
对照原始的偏微分方程实现的水平集方法,使用变分水平集方法更加的方便,在吸收准确的目标信息方面可以更加的贴近真实的情况。
如基于区域信息和基于形状先验信息,之后转化成能量函数时仅仅在水平集区域内进行演化。因此有产生了一个非常好的非常强大的结果。
举个样例。Chan和Vese使用变分水平集来解决活动轮廓提取的模型。
通过採用基于区域的信息转化为自己的能量功能作为一个额外的约束,他们的模型有非常大的较大的收敛范围和灵活的初始化。Vemuri和Chen[9]提出了另外一个变分水平集方程,通过增加形状先验信息,他们的模型可以有效的进行图像的配准及切割。
在实施传统的水平集方法中,它是很必需的保持演化的水平集函数接近于一个符号距离函数。又一次初始化。对于周期性的又一次初始化水平及函数的技术到一个符号距离函数,已经被广泛的应该在大量的修复于保持稳定的曲线演化和确保可用的结果。然而。如G和F指出的,又一次初始化水平集函数明显是一个理论和实施中的折中。然而。很多人提出的又一次初始化框架都有一个不想要的变效应,在移动零水平集远离它的原位置。它仍然存在各种问题比如什么时候和如何去应用一个又一次初始化。到眼下为止。又一次初始化过程在特定方式中应用。
在本论文中。我们提出了一个新的变分水平集函数使得水平集函数可以接近符号距离函数。进而实现避免程序花费大量的时间代价用于初始化。我们的变分水平集由内部能量项和外部能量项组成。内部能量项通过符号距离函数上不断惩处水平集函数的偏差,而内部能量项长期驱动零水平集函数运动到所需的目标周围。如图像的边界。
水平集函数的演化产生的梯度流最大限度的降低总体的能量函数。因为内部能量函数的存在。水平集函数将自然的自己主动的在整个演化过程中保持一个近似的符号距离函数。因此,又一次初始化的过程已经被全然的消除了。论文中提出的变分水平集演化方法相对于传统的水平集方法有三个基本的优势。第一,传统的方法进行数值化求解偏微分方程花费了大量的时间步长。因此,论文中的方法加快了曲线演化的速度;第二。水平集函数作为一个函数进行初始化计算将比距离符号函数的计算更加的有效;第三,提出了在传统的水平集函数演化中使用简单点额有限差分方法进行计算,而不是使用复杂的迎风格方法。
该算法已经在处理模拟和真实图像中获得了希望的结果。特别的是他实现了在识别模糊边界有非常强的鲁棒性。
2.背景
2.1 传统的水平集方法
进化曲线是水平集函数的隐性表示。考虑灰度图像I和闭合曲线C,曲线C隐性表示为定义在图像上的三维连续函数φ(t, x, y)曲面的零水平及,也就是C(t) = {(x, y) | X:φ(t, x, y) = 0},对于给定的φ(t, x, y)=0;水平集函数φ(t, x, y)在速度场F的作用下開始进化,详细的水平集进化函数φ能够进行例如以下形式的表示:
(1)
函数F叫做速度函数,对于图像切割,函数F依赖于图像数据和水平集函数。
在传统的水平集方法中。水平集函数能产生震荡,很尖和平坦的形状在演变的过程中。这使得进一步计算很不准确。
为了避免这些问题,一个一般的数值框架去初始化函数作为一个符号距离函数在演化之前,而且在演化的过程中周期性的重塑水平集函数成为一个符号距离函数。确实。又一次初始化过程是至关重要的。而且不能避免在水平集方法中。
2.2又一次初始化的缺点
又一次初始化在传统的水平集中被广泛的用作一个数值修复。
标准的又一次初始化方法是去解决以下的又一次初始化等式
(2)
又一次初始化方法中有非常多丰富的文化,而且大多数都是上面的偏微分方程的变体。不幸的是。假设要去又一次初始化的函数不是光滑的或者在界面的一边比还有一边更加陡峭,那么结果函数的零水平集就会不对的从原函数中移动。然而。当水平集函 数远离一个符号距离函数的时候,这些方法不能又一次初始化水平集函数成为一个符号距离函数。实际上。演化的水平集函数能大大的从它的值中偏离,作为一个迭代步骤中小数量的符号距离函数。尤其是当时间步骤没被选择足够小的时候。
眼下,又一次初始化被广泛的应用在数值修复中,为了保持稳定的曲线演化并确保想要的结果。从实际的观点来看,又一次初始化是相当复杂,昂贵的,而且有微小的边效应,然而,大多数的水平集方法都担忧他们自己的问题,比方什么时候和怎么去又一次初始化的水平集函数对于一个符号距离函数。到眼下为止。还没有简单的答案通用。在本文中。提出的变化的水平集构架能通过简单有效的差分框架简单的实施。
3.曲线演变的变化水平集构架不用又一次初始化
3.1利用惩处能量通用的变化水平集构架
如前面讨论的。在演化的过程中。保持演化的水平集函数作为一个近似的符号距离函数。尤其是在零水平集领域周围。众所周知,衣服符号距离函数必须满足一个要求的特性。
相反的,随意一个函数%满足该特性是符号距离函数加一个常数。
自然的。我们提出以下的积分(3)式。
(3)
作为一个度量,去特征化怎样逼近一个函数φ成为一个符号距离函数。这个度量将起到一个关键的数据在我们的变体水平集构架中。
依据上面对P(φ)函数的定义,我们提出了下面的变分水平集公式
(4)
当中>0 是一个參数控制通过符号距离函数上不断惩处水平集函数φ的偏差的效果。
而是一个确定的能量项能够影响零水平集函数φ的移动。
在本文中,我们使用加托导数(或第一变分)作为函数化,同一时候使用下面的的演化方程:
(5)
这是一个梯度流[18]。最大限度的最小化的函数E。对一个特定的函数在φ中进行了明白的定义,同一时候加托导数能够被计算并在函数φ及其衍生函数中表示。
在图像活动轮廓切割中我们专注于有用变分公式,从而使φ的零水平曲线能够进化到目标区域图像。对了这个目的。被定义成一个依赖图像数据(见下文),因此我们称之为外部能量项。因此,能量项P(φ)被称为水平集函数φ的内部能量项,由于他仅仅是φ的一个函数。
φ函数的演化过程依据梯度流(5)和最小化函数(4)。零水平曲线将会在外部能量项的推动下进行演化。同一时候。因为内部能量项的不断惩处水平集函数的偏差,因此演化函数φ将会被作为一个近似的符号距离函数在演化过程中依据公式(5)进行自己主动的维护。因此,又一次初始化的在本文提出演化方法中将会被全然的消除。
这个概念将会在以下活动轮廓提取中进行更深一步的演示。
3.2 无需进行初始化的变分水平集活动轮廓
在图像切割中,活动轮廓是一条动态运动的曲线,之后慢慢的移动到目标的边界。为了实现这个目标,我们明白的定义了一个外部能量项能够将零水平集曲线向着目标边界运送。
设置I为一个图像,g为边缘函数,定义为:
在公式中是一个标准算子为的高斯内核。我们为函数φ(x,y)定义一个外部能量项例如以下:
(6)
当中>0 和v 是两个常量,项和定义例如以下:
(7)
和
(8)
特别说明下,当中是一个单变量的狄拉克函数。H是一个亥维赛函数。
如今。我们定义一下完毕了能量项函数:
(9)
在整个演化过程中,外部能量项将驱动零水平集不断的想目标的边界移动。而内部能量项则通过符号距离函数不断的惩处水平集函数的偏差。
为了更好的理解能量函数。我们假设零水平集φ表示为一个可微的參数化曲线C(p),p∈[0,1]。我们已经知道[9]式(7)中能量函数在计算了零水平集曲线φ在共形度量中的长度。
另外式(8)中能量函数用来加速曲线演化。
注意的是,当g函数的參数为1是。式(8)中的能量函数是指示的是区域[17],式(8)中的能量函数能够视为加权后的。中的系数v能够是大于零或小于零,依据初始轮廓与感兴趣的目标区域之间的相位位置关系确定。举个样例,假设初始轮廓的划定在目标的外面。系数v在这个加权区域项应该是正数值。因此轮廓的演化会更加的高速。
假设初始化轮廓在目标区域的内部。系数v应该是负数以加快轮廓的外部演化。
通过有限变分法,函数中的加托导数(第一个变分集)能够写成:
当中是拉普拉斯检測算子。
因此最小化函数φ可以满足Euler-lagrange方程。
在最小化函数过程中的最陡的下降过程是以下的梯度流:
(10)
这个梯度流是水平集函数的演化方程的方法。
在式(10)的右边中的第二项和第三项相应的梯度流能量函数和,它们分别负责驱动零水平集曲线向目标区域边界运动。为了解释第一项的作用,这得考虑到内部能量函数。我们注意到梯度流
有一个元素作为扩散率,假设,那么扩散率是正数同一时候这一项的影响是使轮廓正常的扩散,使得φ更加的平滑以至于降低梯度流,假设,那么将使得轮廓逆向扩散,从而增大梯度流的影响。
我们使用一个圆形图像作为一个图像对象。如Fig. 1,展示了水平集函数φ依据公式(10)进行演化的结果。在Fig.1中,在第一层的第一张图中展示了初始化水平集函数,同一时候他的零水平集曲线在第二层的第一张图中被标志出来。上层展示了水平集函数φ的演化过程,而下层展示了相相应的零水平集函数φ。第四列是曲线演化终于收敛的结果。正如我们从这个实例中所示,在演化的过程中,进化中的水平集函数φ的维护与符号距离函数是很接近的。
4.实现
4.1 数值化方案
在实现过程中,在式(10)中的狄拉克函数主要进行的是整个轮廓的平滑,接下来定义例如以下
(11)
在本论文的全部实验中。我们使用规范化的參数=1.5的狄拉克函数。
由于我们在本文中引入了惩处能量扩散项,因此我们不再须要像传统水平集方法一样使用逆风方案。相反。全部的空间偏导数和都是用的中心差分方法近似表示,而时间偏导数是由向前差分近似。因此,通过上诉的差异,式(10)的能够近似简单的写成
(12)
当中能够近似的使用上述空间差分方法表示式(10)中的右边部分。差分方程(12)能够表示为下面迭代
(13)
4.2 时间步长的选择
在实施提出的水平集方法,时间步骤T能被明显的选择大于传统水平集中的时间步骤。
我们在时间步上尝试进行了大范围内的选择,从0.1到100.0。比如,我们在Fig.1中使用=50.0 和=0.004,同一时候在曲线演化中仅仅进行了40次的迭代,然而曲线精确收敛到了对象的边界。
一个非常明显的问题是:时间步在那个范围内能够使式(13)中的迭代更加的稳定?从我们多次的实验中来看,我们发现了时间步和系数必须满足在4.1章节中提出的差分方法中,为了保持稳定的水平集演化。
使用较大的时间步能够加速演化的过程,可是假设时间步过大。在边界定位上会出现错误。我们一般会权衡选择较大的时间步长以让其精确定位目标边界。通常来说,我们使用用于大部分的图像。
4.3 灵活的初始化水平集函数
在传统的水平集方法中,将水平集函数φ作为符号距离函数φ0进行初始化是必不可少的。假设初始化的水平集函数与符号距离函数有着显著的差异,那么又一次初始化的方案将不可以又一次初始化符号距离函数。
在我们的计划中,不不过又一次初始化的过程被全然的消除,并且水平集函数φ也不再须要作为符号距离函数进行初始化。
在这里,我们提出了一下的函数作为初始水平集函数φ0。
设置为图像区域的一个子集,同一时候为在边界上的全部的点的坐标。这便能够有效的识别一些简单的形态学操作。
初始水平集函数φ0定义例如以下:
(14)
当中是一个參数。我们建议选择大于。当中式(11)中定义正规化的迪克拉函数时所定义的标准化參数。
不同于符号距离函数的是。符号距离函数是从全局的轮廓来进行计算,而本文中提到的初始化水平集函数是从目标区域中进行计算。这样的基于区域的的水平集函数初始化不仅计算效率更高,同一时候也在不同的情况下提供了更为灵活的初始化方案。举个样例来说,假设目标区域可以被粗略的自己主动的从某些方式得到,比如阈值。然后我们通过这些大致获得的区域去构造我们的水平及函数φ0。
紧接着,初始的水平集函数会依据演化方程不断地稳定的进行演化,伴随着他的零水平集曲线会收敛于目标区域的边界上。为了演示本问题出的初始化方案的效果。我们使用Fig.1中同样的图像应用初始化及演化的模型。初始的水平集函数φ0依据式(14)中的定义进行构建,当中=6 。初始区域包含两个独立分开的区域。
依照定义,初始化函数φ0仅仅有三个值:-6、0、6,他的等高线在Fig.2中的第一个图像中标注出来。φ函数从初始化φ0中的进化在Fig.2中通过七个层次-3、-2、-1、0、1、2、3标注水平集曲线的演化进行展示。同一时候在图像中。使用最初的一条线作为零水平集曲线(这条线在七条等高线的正中间)。在图中我们可以清晰的看到水平集函数终于很接进去符号距离函数,在七个级别的等高线之间差点儿是等间隔的,相邻之间的间隔差点儿接近于1 。
但要注意的是。这样的初始函数φ与符号函数有着显著的偏离,即在整个演化过程中,水平集函数φ在整个区域内的进化更新,并不能全图像的近似为符号距离函数。
可是,因为演化过程基于本文提出的惩处扩散的演变,因此会使得水平集函数φ在接近零水平集是近似等于符号距离函数。
其实,在图二中我们已经通过演示得到了希望的效果。
5.实验结果
本文提出的变分水平集方法已经被广泛的应用在不同形式多样的合成或真实的图像处理中。
在本节实验结果的展示中。水平集函数都以式(14)所述方法进行定义,其參数=6和一些区域。
举个样例来说,在图3中展示了对一张100*200像素的一个瓶子和杯子的图像的处理,初始水平集函数φ0以一个方形的封闭曲线计算得来,在图3中进行的演示。对这张图像。我们使用參数:,,,时间步长,该步长远远大于传统水平集函数中的步长。
本次曲线演化进行了650次迭代。
图4中展示了在一张64*80像素的显微图像中的两个细胞进行演化,正如我们所示,这两个细胞的边界的某一些部分非常的模糊。通过这个图像,展示了本文算法在处理弱边界图像问题中的鲁棒性。
我们使用的图4(a)中直线下方的区域作为初始水平集区域去构造初始化水平集函数φ0。正如图4中所展示的,初始的直线成功的演化到了两个目标的边界上,并且他们的整个形状被非常好地覆盖了。这个结果演示了我们的算法在提取图像弱边界问题上能够得到理想中的结果。这样的结果在传统的水平集方法中是非常难得到的。
我们的方法也被应用于处理超声波图像。超声图像是臭名昭著的散斑噪声和低性噪比。因此非常难使用传统的方法进行目标边界的提取。图5展示了本论文的方法在处理一张110*130像素的颈动脉超声波图像。虽然强噪声的存在。该图像仍然使用我们的算法进行了成果的边界提取。
6.结论
在本文中,我们提出了一个新的变分水平集的演化公式,该方法全然消除了又一次初始化过程所须要的时间代价。所提出的水平集方法能够使用有限差分方法进行简单的计算实现。同一时候在计算上相对于传统的水平集方法来说更加的有效率。
在本文的方法中。相对较大的时间步长能够被用来加速曲线演化,同一时候稳定的维护演化中的水平集函数。
此外。水平集函数不再须要作为符号距离函数进行初始化。
我们提出的基于区域的初始化水平集函数的方案不只在计算方面比计算符号距离函数更加有效。同一时候也同意更加灵活的水平集方法。我们通过使用模拟和真实的图像进行了本文算法的演示,并且还特别的尝试的使用了弱边界与强噪声的图像验证了本文算法的强壮性。
7.參考文献
[1] M. Kass, A.Witkin, and D. Terzopoulos, “Snakes: active contour models”, Int’l J. Comp. Vis., vol. 1, pp. 321-331, 1987.
[2] C. Xu and J. Prince, “Snakes, shapes, and gradient vector flow”, IEEE Trans. Imag. Proc., vol. 7, pp. 359-369, 1998.
[3] X. Han, C. Xu and J. Prince, “A topology preserving level set method for geometric deformable models”, IEEE Trans. Patt. Anal. Mach. Intell., vol. 25, pp. 755-768, 2003.
[4] J. A. Sethian, Level set methods and fast marching methods, Cambridge: Cambridge University Press, 1999.
[5] V. Caselles, F. Catte, T. Coll, and F. Dibos, “A geometric model for active contours in image processing”, Numer. Math., vol. 66, pp. 1-31, 1993.
[6] V. Caselles, R. Kimmel, and G. Sapiro, “Geodesic active contours”, Int’l J. Comp. Vis., vol. 22, pp. 61-79, 1997.
[7] R. Malladi, J. A. Sethian, and B. C. Vemuri, “Shape modeling with front propagation: a level set approach”, IEEE Trans. Patt. Anal. Mach. Intell., vol. 17, pp. 158-175, 1995.
[8] T. Chan and L. Vese, “Active contours without edges”, IEEE Trans. Imag. Proc., vol. 10, pp. 266-277, 2001.
[9] B. Vemuri and Y. Chen, “Joint image registration and segmentation”, Geometric Level Set Methods in Imaging, Vision, and Graphics, Springer, pp. 251-269, 2003.
[10] B. B. Kimia, A. Tannenbaum, and S. Zucker, “Shapes, shocks, and deformations I: the components of twodimensional shape and the reaction-diffusion space”, Int’l J. Comp. Vis., vol. 15, pp. 189-224, 1995.
[11] S. Osher, J. A. Sethian, “Fronts propagating with curvaturedependent speed: algorithms based on Hamilton-Jacobi formulations”, J. Comp. Phys., vol. 79, pp. 12-49, 1988.
[12] J. Gomes and O. Faugeras, “Reconciling distance functions and Level Sets”, J. Visiual Communic. and Imag. Representation, vol. 11, pp. 209-223, 2000.
[13] M. Sussman, P. Smereka, and S. Osher, “A level set method for momputing solutions to incompressible two-phase flow”, J. Comp. Phys., vol. 114, pp. 146-159, 1994.
[14] H. Zhao, T. Chan, B. Merriman, and S. Osher, “A variational level set approach to multiphase motion”, J. Comp. Phys., vol. 127, pp. 179-195, 1996.
[15] D. Peng, B. Merriman, S. Osher, H. Zhao, and M. Kang, “A PDE-based fast local level set method”, J. Comp. Phys., vol. 155, pp. 410-438, 1999.
[16] M. Sussman and E. Fatemi “An efficient, interfacepreserving level set redistancing algorithm and its application to interfacial incompressible fluid flow”, SIAM J. Sci. Comp., vol. 20, pp. 1165-1191, 1999.
[17] S. Osher and R. Fedkiw, Level Set Methods and Dynamic Implicit Surfaces, Springer-Verlag, New York, 2002.
[18] L. Evans Partial Differential Equations, Providence: American Mathematical Society, 1998.
[19] V. I. Arnold, Geometrical Methods in the Theory of Ordinary Differential Equations, New York: Springer-Verlag, 1983.
Li的前期工作Level_Set_Evolution_Without_Re-initialization_A_New_Variational_Formulation的更多相关文章
- 《基于Node.js实现简易聊天室系列之项目前期工作》
前期工作主要包括:项目的创建,web服务器的创建和数据库的连接. 项目创建 网上关于Node.js项目的创建的教程有很多,这里不必赘述.Demo所使用的Node.js的框架是express,版本为4. ...
- 图像识别的前期工作——使用pillow进行图像处理
pillow是个很好用的python图像处理库,可以到官方网站下载最新的文件.如果官网的任何PIL版本都不能与自己的python版本对应,或安装成功后发现运行出错,可以尝试从一个非官方的whl网站下载 ...
- 硬杠后端(后端坑系列)——Django前期工作
Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式. MVC MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件 ...
- YII配置rabbitMQ时前期工作各种坑
背景如下: 项目需要做一个订阅/发布的功能,然后一大堆讨论不做说明,确认使用rabbitMQ来做: okay,既然 要这个来做,我们下载这个东西吧!在官网上下载就okay了,不做说明,下载安装的时候会 ...
- haml scss转换编写html css的前期工作
http://www.w3cplus.com/sassguide/install.html 先下载ruby $ gem sources $ gem sources --remove https://r ...
- ELMO及前期工作 and Transformer及相关论文
论文1 https://arxiv.org/pdf/1705.00108.pdf Semi-supervised sequence tagging with bidirectional languag ...
- RMAN 前期准备工作和实例
理解恢复目录,RMAN可以在没有恢复目录(NOCATALOG)下运行,这个时候备份信息保存在控制文件.保存在控制文件的备份信息是很危险的,如果控制文件的破坏将导致备份信息的丢失与恢复的失败,而且,没有 ...
- 赴美工作常识(Part 2 - 申请)
在<Part 1 - 签证>的评论中有人提到,说我还没说如何申请职位就说签证的事情了.一方面,签证的周期决定了你申请职位的时间,错过关键时间点的话就可能错过重要的机会.另一方面,传统意义上 ...
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
随机推荐
- CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器. 基于Window和Mac OS X的Adobe Reader和Acrobat 9.4之前的9.x ...
- ***codeigniter操作xml(Simplexml第三方扩展)
This Simplexml class provides an alternative implementation of the SimpleXML API that works under PH ...
- 使用mongo-java-driver-3.0.2连接MongoDB数据库
这里使用的mongodb的java驱动版本是:3.0.2,文件名mongo-java-driver-3.0.2.jar 博客本地下载下载网址(也可以下载其它版本):http://central.ma ...
- Spark(十三)SparkSQL的自定义函数UDF与开窗函数
一 自定义函数UDF 在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_ ...
- 【51nod】1531 树上的博弈
题解 我们发现每次决策的时候,我们可以判断某个点的决策,至少小于等于几个点或者至少大于等于几个点 我们求最大值 dp[u][1 / 0] dp[u][1]表示u这个点先手,至少大于等于几个点 dp[u ...
- php判断是否为合法身份证号
/** * 判断是否为合法的身份证号码 * @param $mobile * @return int */ function isCreditNo($vStr){ $vCity = a ...
- 智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电
转载:智能家居实践(番外篇)—— 接入 HomeKit 实现用 Siri 控制家电 前面我写了一个系列共三篇的智能家居实践,用的是 Amazon Echo 实现语音控制,但是 Amazon Echo ...
- 1035 Password (20)(20 point(s))
problem To prepare for PAT, the judge sometimes has to generate random passwords for the users. The ...
- django中日志配置
# ======日志配置====== # 错误优先级:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL # Djang ...
- ThinkPHP3.2设置异常页面404跳转页面
在ThinkPHP3.2版本中当我们访问不存在的页面时会出现非常不友好错误提示页面,类如下图: 0 «上一篇:div非弹出框半透明遮罩实现全屏幕遮盖css实现»下一篇:利于反向代理绑定任意的域名 po ...