热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

视频增强之“动态范围扩展”HDR技术漫谈

本文转载自腾讯多媒体实验室。随着HDR(HighDynamicRange)相关技术的发展,越来越多的视频平台和设备厂商持续推动HDR内容的

本文转载自腾讯多媒体实验室。

随着HDR(High Dynamic Range)相关技术的发展,越来越多的视频平台和设备厂商持续推动HDR内容的制作与传播。HDR可以提供更丰富的细节,更宽广的色域和更自然的色彩过渡。为呈现更高的图像品质,给体验者带来更具沉浸式的感受,腾讯多媒体实验室也对这一技术投入研究并推广落地。

本文主要介绍实验室在视频动态范围扩展这一视频增强技术方面的研究进展。在介绍相关算法的同时,文章简要分析和讨论扩展过程中需要解决的主要问题、可能的解决方案和存在的问题。

一、背景介绍

多媒体软硬件的快速发展使得广播电视和互联网平台上的视频质量变得越来越高。我们最直观的感受是,视频变得更清晰,也更真实了。但与此同时,视频的动态范围(可以简单地理解为对比度)并没有太大提升。这就造成视频画面中的像素很多,但每个像素点质量并不高,不能展现场景丰富的层次和细节。

高动态范围(High Dynamic Range,HDR)这一概念的提出,正是为了从画面动态范围这个维度,进一步提升视频质量。相对地,我们称传统视频为标准动态范围(Standard Dynamic Range,SDR)视频。

本文将从HDR相关概念开始,分析其特色和优势,并讨论从SDR过渡到HDR的过程中涉及的部分技术问题和解决思路。

二、什么是动态范围?

在详细介绍之前,我们首先需要明确动态范围到底是指什么。一般来说,动态范围是指某个观测量的最大值与最小值的比值。比如,我们观测场景中不同物体的“亮度”[1],它的最大值与最小值之比就是这个场景亮度的动态范围,或者简单地称为这个场景的动态范围。类似地,人的各种感官(视觉、听觉和痛觉等)也有可分辨的最小值和最大值,因此也有相应的动态范围。

自然场景的动态范围比较大,通常可以达到10⁹量级。人眼的动态范围也很广,一般认为至少在10⁶量级[2]。但由于采用8位整型数据记录像素值,传统数字图像和视频格式,只可以区分256个不同的亮度等级。在普通显示器上显示时,其亮度动态范围大概在10³这个量级。

因此,从动态范围的角度来看,传统的图像和视频内容与人眼所见的真实场景存在很大差距,限制了视频内容的丰富性。这也是视频看上去总是不像真实世界的一个重要原因。

三、为什么需要HDR视频格式?

传统图像和视频中的像素值都被记录为8位整型数据,这是受多方面因素共同影响的结果。从信号处理和视觉系统特性的角度来看,这主要是因为传统显示器的最大亮度不高,大致在100尼特这个量级。

在这个范围内,256个等级的量化足以使相邻亮度级之间的差异,小于人眼对亮度变化的感受阈值。增加额外的量化等级,并不能带来明显的画质提升。

而随着显示技术的发展,当下的显示器已经可以高质量地支持1000尼特的最大亮度。这时候,256级的量化方案中,相邻两个亮度级之间的差异就很容易被人眼观察到。

如图1所示,在亮度平缓过渡的灯光区域,量化间隔过大造成了“条带”现象(亮度和色彩断层),严重影响画质。

图1. 随着量化间隔的增大,图像缓慢变化的灯光区域出现“条带”现象,严重影响画面质量

为解决这个问题,HDR视频通常用至少10位的整型数据记录像素值,从而支持不少于1024个亮度级。更密集的亮度等级分布,能在很大程度上避免图像质量下降。

此外,不同于SDR视频所用的曲线,HDR视频采用PQ(Perceptual Quantizer)曲线或者HLG(Hybrid Log-Gamma)曲线压缩场景亮度。这些压缩曲线在设计时很好地考虑到了人眼对不同亮度的敏感度,更适合亮度变化范围很大的场景。

四、HDR视频的特色

除了上面提到的量化误差问题,与SDR视频相比,HDR视频还有更多优势。比如:

1. HDR视频能展现更大范围内的亮度。

一方面,这使得HDR视频可以同时记录高亮度区域和低亮度低区域的细节,从而使视频的细节更丰富。如果使用SDR视频,这些区域内的细节则会因为曝光过度或不足而丢失。

另一方面,这使得HDR视频的对比度更大,画面更富层次感。传统的SDR视频为了在有限的亮度范围内展现原始场景,通常会比较严重地压缩自然场景的亮度范围,造成视频内容的对比度明显不足。如图2所示。

图2. 与SDR视频(上)相比,HDR视频(下)具有更大的亮度范围,画面层次丰富[3]

2. HDR视频能展现更丰富的色彩

HDR视频各颜色分量的取值范围更大,从而能记录更大范围内的色彩,尤其是饱和度较大的色彩(如图3所示)。因此,HDR视频一般采用能覆盖更多色彩的Rec. 2020色彩空间。

比较直观地讲,由于采用10位整型数据,HDR视频的每个像素可以表示超过10亿种颜色。与之相比,采用8位整型数据的SDR视频中,每个像素仅仅可以表示不到两千万种颜色。HDR视频中这些丰富的色彩,可以更好地展现自然场景中更为细致的色彩变化。

图 3. Rec. 2020色彩空间比Rec. 709色彩空间包含更丰富的色彩。[4]

由于这些优势特性的存在,HDR视频呈现的画面更接近人眼观看自然场景时的情况,从而给观看者带来更接近真实的视觉体验。

五、从SDR到HDR

随着HDR相关技术的发展,越来越多的视频平台和设备厂商持续推动HDR内容的制作、传播与呈现。由于其优秀的视觉效果,HDR视频也受到越来越多用户的青睐。

同时,视频技术发展进程中积累了大量SDR视频。尤其是近几十年来,创作和记录成本的持续快速降低,导致SDR视频总量爆炸式增长。

因此,从现有的SDR视频中恢复更高动态范围和色彩广度的HDR视频的需求也持续增长。

腾讯多媒体实验室也投入了这一技术的研究和推广落地。受限于篇幅,我们主要就SDR视频恢复HDR内容的过程中需要特别关注的一些问题和技术要点,做些介绍和讨论。

为了方便理解下面的内容,我们首先来看看算法的大致流程(图4)。图中深蓝色表示算法主线。虚线所示的可选模块可以分析场景内容,动态地调整算法参数。

图4. 算法大致流程图

· 基本目标

从SDR到HDR,最主要的任务是恢复视频被压缩的动态范围,以期其有更好的对比度。于此同时,我们还有两方面期待。

1. 在亮度方面,我们希望通过SDR视频中残留的,过度曝光和曝光不足区域的信息,尽可能地恢复这些区域内丢失的细节

2. 在色彩方面,我们希望通过SDR视频中受限的色彩,估计出原始场景的色彩,让恢复出的HDR视频的色彩尽可能地接近原始场景中丰富而真实的色彩

当然,我们要避免引入或放大其他问题,如色彩失真、噪声、压缩失真和条带等。为了达到以上目标,我们设计了不同模块,这些模块相互配合,从SDR视频中恢复出HDR内容。下面我们就以这些模块为线索,介绍算法的设计和其中的关键问题。

· 亮度范围扩展

亮度扩展是一个相对容易理解的过程。我们的目标是从SDR视频的像素值估计出原始场景的亮度。

严格来说,这需要我们知道视频拍摄过程中,场景亮度到SDR视频像素值之间的γ映射关系,并用其逆映射恢复原始场景亮度。但实际中,这一映射通常是未知的。我们可以近似地认为这个映射是一个简单的指数映射,即我们常说的映射。由此,我们可以得到(归一化)的原始场景“亮度”。

在亮度范围扩展的过程中,我们需要特别注意两个问题。

1. 彩色视频的处理需要避免颜色失真。对人眼视觉系统的研究表明,人对色彩的感知可以近似地用Grassman’s Law来描述。这个定律保证,人眼的三色系统是一个近似线性的系统。我们在拉伸亮度的时候,需要保持RGB三个通道的比例关系基本不变

因此,对于每个像素三个色彩分量的扩展实际只有一个自由度,由一个扩展系数控制。对于每一帧来说,我们就通过调整这个系数图来控制不同区域亮度的变化。

2. 从SDR内容中恢复的场景亮度在高亮和低亮区域是被截断了的。这些被截断的部分就包含了高亮和低亮区域丢失的信息。因此,我们不能简单地将估计出的归一化场景亮度,直接映射满目标HDR视频的亮度区间。

否则,生成的HDR视频只是一个更亮一些的SDR视频,并不具有HDR视频的优点,反而会因为平均亮度过高而观看体验不佳。

事实上,在典型的HDR视频中,每幅画面中只有很少一部分像素会达到比较高的亮度值,比如场景中的光源、反光的表面等。与SDR视频类似,场景的平均亮度应该相对稳定地维持在一个合理的值附近。

· 细节恢复

如上文所说,在SDR到HDR的转换过程中,我们需要尽量恢复或补充高亮和低亮区域的细节。单从数据上讲,这部分细节在SDR视频制作过程中已经丢失了。但我们可以利用一些先验知识,大致估计出这些区域的原始场景亮度。

我们主要需要解决两个问题。一是,如何判断哪些区域的亮度被截断了。二是,用什么算法估计这些区域的真实亮度。

1. 问题一比较简单。原图中的光源、强反光面等区域由于亮度过大被截断,深色物体或背景由于亮度不足就被淹没在噪声中。因此,我们可以简单地设置相应的阈值来检测出这些区域。

这样做的风险是,不同视频可能需要设置不同的阈值,并且固定的阈值容易造成检测结果不稳定。比如,若场景中某个区域的亮度正好在阈值附近浮动,那受此扰动,相邻两帧的检测结果就会不稳定。

幸运的是,我们分析了大量不同类型的视频,发现不同视频对应的阈值变化并不大。进一步,我们也使用软域值的方法,避免固定阈值带来的稳定性差的问题。

2. 问题二相对复杂。但我们可以利用自然图像空间相关性比较强的特性,作出比较好的估计。具体来说,如果截断处在亮度变化比较缓慢的区域,那被截断区域内的亮度可以依据区域周围的亮度变化趋势补全。如果截断区域的边界正好是亮度突变的地方,那区域内的信息则相对比较难估计,这时候只能依靠HDR图像的统计特性作出预测。

以上只是对这个问题的简单分析,在具体算法设计中,我们并不是分区域、分情况进行处理的,而是使用能够保护强边缘的非线性滤波达到类似的效果。

需要注意的是,上面讨论的方法对高亮度和低亮度区域同时适用。但在实际应用中我们发现,在不少场景中,SDR视频的低亮度区域对比度常常不足。如果不加处理,生成的HDR视频在低亮度区域的细节表现并不是很令人满意。

因此,当检测到有这种情况的时候,我们通常还会额外增强低亮度区域的对比度。原则上讲,这会损失其他亮度范围内的一部分对比度。但由于人眼视觉系统对低亮度区域更敏感,因此我们只需要很有限的额外动态范围,就可以显著提高低亮度区域的视觉效果。

在算法选择上,我们发现简单的全局增强算法,效果已经能满足大多数场景的增强需求。考虑到时域稳定性,我们采用了固定全局映射增强。这种选择还使得这个增强模块,可以和前述亮度扩展模块合并,因此不增加整个算法的复杂度。

本节讨论的问题是一个开放问题,不同算法会采取不同策略。如果存在大面积信息丢失,这些简单方法可能不足以给出很好的估计。这种情况比较适合一些基于学习的方法。这些方法可以从已知的数据集中提取有用的信息,生成丢失的细节。

但由于问题本身“无中生有”的特性,要特别注意算法稳健性。相比较而言,不依赖学习的方法更简单,性能较好,效果也比较稳定。如果SDR视频本身曝光比较正常,使用这类算法优势较大。

· 噪声和失真抑制

在大幅提高动态范围时,如果不加额外处理,就会不可避免地造成噪声和失真的放大。

其中最特殊的,是量化误差引起的条带问题(亮度和色彩的断层)。由于SDR视频采用256级量化,在其相对较小的亮度区间中,相邻两个量化级别之间的亮度变化,人眼基本不可察觉。

因此,虽然SDR视频图像中的亮度等级不是连续的,但人眼感受不到明显的间断。而在转到HDR的过程中,如果采用简单的一一映射,那么得到的仍然只有256个等级。这时候相邻量化等级之间的亮度差异更大了,很容易造成原本看上去连续变化的区域,在HDR视频中变成一个个条带。

分析清楚了成因,我们可以通过一个平滑滤波避免这个问题。但要注意的是,我们只需要在场景亮度缓慢变化的区域进行滤波。这些区域本身不含太多高频信息,低通滤波不会损失过多额外信息。

因此,我们需要准确地判断出平坦区域,尤其是在区域边界附近要十分准确。此外,原则上我们只需要沿亮度场梯度方向平滑,而且平滑半径要比较大。当然,方向性滤波复杂度会高一些,如果应用中条件不允许,在平滑区域做各向同性的滤波,也在可接受范围内。

对于压缩比较严重的视频,压缩造成的块效应也会随着动态范围的扩大被放大。对于低信噪比的视频,比如夜景视频,亮度的提升也会导致噪声被放大。因此,在转换过程中需要抑制噪声和块效应。

事实上,以上所述的噪声和失真的抑制不一定需要单独的模块来完成,在算法设计的过程中我们采用了统一的算法同时抑制这些噪声和失真。

· 色域扩展

HDR视频可以表示更丰富的色彩,与SDR视频常用的Rec. 709色彩空间相比,现行的HDR视频标准采用的Rec. 2020色彩空间覆盖整个可见色域空间中更多的色彩。在SDR转HDR的过程中,我们有两个目标:

1. 我们要保证色域转换前后的色彩一致。由于两个色域的区别仅在于基色的选取不同,因此两组色彩分量(RGB值)之间只是一个简单的线性变换关系。

需要特别注意的是,随着亮度的提升,SDR视频的量化误差被放大,从而导致颜色的偏差。这个问题在压缩率过高、饱和度过高或过低、噪声过大等情况下尤为明显。采用上文提到的噪声和失真抑制算法能有效地避免这个问题,但对于比较敏感的图像内容(如皮肤)的颜色,我们还需要额外的算法来保证颜色的准确性。

2. 在不失真的基础上,我们还应尽量恢复原始场景的真实色彩。在SDR视频中,不在Rec. 709色彩空间覆盖范围之内的颜色都被截断为其邻近的颜色。这与上文提到的细节丢失问题类似,只不过丢失的是色彩上的细节。

解决的思路也与细节补充相似,我们需要判断出哪些区域的色彩被Rec. 709色彩空间的边界截断了,然后再根据邻近区域色彩变化的趋势,适当延伸出色彩空间的边界。

算法方面,在判断出需要补充色彩细节的区域后,可以采用与细节补充模块中类似的方法。

这里还需要注意,人眼视觉系统对亮度的感知受色彩影响很大。在增强色彩的时候需要考虑到这方面影响。比如,高饱和度的色彩如果过度增强,很容易造成物体在发光的视觉效果。

· 动态亮度调整

前面几节关于算法的描述,没有涉及参数调试的问题。我们通过大量实验发现,算法所需的参数中,与视频内容相关性最高的是两个涉及亮度的参数。对于曝光正常的SDR视频来说,这两个参数的最优值相对比较稳定,可以预先设定好。

但视频中难免会出现较暗或者较亮的场景。对于这些场景,如果动态地调整这两个亮度参数,可以明显地提高所生成HDR视频的主观效果。为此,我们还额外设计了动态亮度调整算法。

算法的设计思路大致如下。对于每一个场景来说,我们希望把可用的动态范围合理地分配给原始SDR视频的各个亮度区间。如果一个亮度区间内的信息比较多,就应该适当扩大分配给这个亮度区间的动态范围,反之则减小。

具体地,我们统计了原始SDR视频的亮度分布情况,根据这个分布调整算法的两个亮度参数,以期尽量合理地分配动态范围。由于统计亮度分布不需要很高的空间分辨率,这个额外的模块可以在更大尺度下进行,因此并不需要太多计算资源。

六、效果示意

直观上,SDR视频和HDR视频的对比如图5所示。算法从SDR视频(上)恢复出HDR内容(下)。在提升动态范围的同时,还补充了过曝区域(天空)和曝光不足区域(阴影)的部分细节。整个画面细节更丰富,层次更分明。

图5. 从SDR视频(上)中恢复的HDR内容(下)画面动态范围更大、细节更丰富、更有层次感

为保证观看效果,请使用最大亮度不低于1000尼特的HDR显示器观看,并调暗环境亮度。Mac自带Safari浏览器不支持YouTube HDR视频的播放,可以使用Chrome浏览器观看,部分型号的iPhone也可以使用YouTube客户端观看HDR视频。此外,B站视频需要打开“HDR真彩”观看HDR效果。

图5视频已上传至YouTube和billibilli:

https://youtu.be/9hez3LlifGo

https://www.bilibili.com/video/BV1Jr4y1K73B

七、结语

本文从HDR技术对视频质量的提升出发,介绍了HDR视频在画面对比度、细节和色彩丰富程度等方面的优秀特性,并着重讨论了SDR视频转HDR视频过程中面对的主要问题和解决这些问题的技术方案。目前,这一技术已经应用在腾讯视频云的视频处理服务中。

腾讯多媒体实验室“智媒”平台通过搭建基于多模态(视频、图像、文本、音乐)算法的多媒体内容分析和理解框架,实现媒体标签、分类、检测、摘要、内容生产等功能。未来,我们将持续为OTT、互联网、广电等行业提供视频技术和整体解决方案。

注释:

[1] 严格来讲,应该是辐照度(irradiance),描述的是单位面积接受到的辐射通量(radiant flux),单位W/m^2,经常和强度、亮度等词混用,造成歧义。为方便理解,文中统一使用更口语化的“亮度”一次。

[2] 这里给出的动态范围并不是指自然场景能达到的最大值和最小值之比,或者人眼可感知的最大值与最小值之比,而是通常情况下单一场景内的亮度范围。人类视觉系统的工作机制十分复杂,目前也没有完全研究清楚。由于自动调节机制的存在,人类能感知的最低光强在10^-6 cd/m^2量级,而最高在10^8 cd/m^2量级。但这个最大值和最小值通常不能在单一场景中同时达到。

[3] 由于页面显示原因,文中图片仅为示意图。

[4] 图片来源AudioHolics:

https://www.audioholics.com/hdtv-formats/how-to-tell-if-4k-uhd-tv-has-hdr

作者:赵天乐  

   编辑:李松南 Xinya  

END

备注:质量

图像增强与质量评价交流群

图像增强、去雾、去雨、图像修补、图像恢复等技术,

若已为CV君其他账号好友请直接私信。

我爱计算机视觉

微信号:aicvml

QQ群:805388940

微博知乎:@我爱计算机视觉

投稿:amos@52cv.net

网站:www.52cv.net

在看,让更多人看到  



推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 干货!基于元学习的内容定向推广
    点击蓝字关注我们AITIME欢迎每一位AI爱好者的加入!在推荐系统和广告平台上,内容定向推广模块需要尽可能将商品、内容或者广告传递到潜在的对内容感兴趣的 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 如何压缩网站页面以减少页面加载时间
    本文介绍了影响网站打开时间的两个因素,即网页加载速度和网站页面大小。重点讲解了如何通过压缩网站页面来减少页面加载时间。具体包括图片压缩、Javascript压缩、CSS压缩和HTML压缩等方法,并推荐了相应的压缩工具。此外,还提到了一款Google Chrome插件——网页加载速度分析工具Speed Tracer。 ... [详细]
  • FIN7后门工具伪装成白帽工具进行传播
    fin7,后门,工具,伪装,成,白, ... [详细]
  • 软件测试对于减少程序BUG有多大帮助?有经验的程序员通常认为测试与代码同等重要,测试可以减少代码变更或扩展的不确定性。测试应该方便阅读简单且能快速运行 ... [详细]
author-avatar
ian
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有