精华内容
下载资源
问答
  • 目录写在前面基于核聚类的空变模糊核估计以及图像去模糊摘要关键字1. 介绍2.相关工作3.模糊核估计和去模糊框架3.1 图像块模糊核...文章:Space-variant blur kernel estimation and image deblurring through kerne...

    写在前面

    文章:Space-variant blur kernel estimation and image deblurring through kernel clustering
    链接: https://www.sciencedirect.com/science/article/abs/pii/S0923596518309925

    第一次做翻译,求大佬轻喷。

    基于核聚类的空变模糊核估计以及图像去模糊

    摘要

    本文提出了一种空变模糊核估计以及图像去模糊的框架。对于空变模糊核估计,本文将输入图像分成多个小块,对于每个小块,模糊核是可以估计的。接着将估计出的核进行分类以确定图像中不同的内核簇。在聚类过程中,不可靠的模糊核将被淘汰。每个内核簇的模糊核最后将使用对应的图像区域进行优化,该图像区域为与集群中内核相关的图像块的并集。对于空变图像去模糊,将整个图像与每个模糊核进行反卷积以生成一组去模糊图像。然后将这些图像融合成无模糊图像,融合过程会从去模糊图像集中选取最佳区域。

    关键字

    空变图像去模糊;空变点扩散函数(PSF)估计;图像融合

    1. 介绍

    在很多成像应用中,所记录的图像是能够理想化表示场景的真实图像的模糊版本。导致模糊的常见原因有大气畸变、光学像差、传感器上像素点的平均以及相机和目标物体间的运动。图像恢复的目的是从一张或一组图像中恢复出真实图像。恢复问题往往是不适定的,需要通过正则化来为恢复后图像增加一些所需的属性。
    大多解决图像去模糊问题的算法都假设退化过程涉及线性(平移)不变模糊核,即点扩散函数(PSF)。当点扩散函数未知时,该问题被称为盲图像反卷积。今年,可以处理大移动造成的模糊的非常成功的盲图像反卷积技术已经开发出来。然而,一般来说整个图像被单个点扩散函数模糊的假设是无效的。例如,当相机抖动(即空间变化的运动模糊)或景深相对狭窄(即空间变化的离焦模糊)时,场景中会产生不可忽视的深度变化导致空变模糊。由于相机或场景的旋转导致的模糊是另一种空变模糊。对于深度变化导致的空变模糊,模糊核会因不同的区域深度而缩放。对于旋转导致的模糊,可对模糊核进行参数化建模。通常,场景会是动态的,除了大气畸变、深度变化和光学像差外,还有对象的独立运动。因此,处理任意类型的空变模糊核是有必要的。这是一个具有挑战性的任务,需要对图像的模糊区域进行显式或隐式的分割。
    本文提出了一种不受参数核限制的盲空变去模糊框架。我们的策略有以下主要步骤:粗略估计小图像块的模糊核;通过核聚类以确定场景中的重要模糊;使用图像区域及其对应内核簇优化内核;最后通过核估计和图像融合进行反卷积以进行时变去模糊。在此框架内,特定的方法(例如模糊核估计、聚类以及图像融合)可以改变。
    在第2章中,我们介绍了文献中的相关工作。在第3章,我们详细介绍该框架以及每步中的特殊方法。我们在第4章中提供了实验结果,第5章讨论了参数的选择以及其计算复杂度,最后在第6章总结全文。

    2.相关工作

    在本此工作中,我们在解决单幅图像的盲去模糊问题,其中的卷积核是时变的且没有任何的特殊参数来源。因为我们的方法在局部区域使用了空间不变的盲去模糊方法,所以我们先简要回顾一下此类技术,主要是模糊核不受限于参数的技术。
    一种常见的空间不变模糊类型是由于曝光期间相机的抖动而引起的运动模糊。文献[7]中的方法需要用户选取一个并未饱和的矩形块并初步猜测模糊卷积核的方向(水平或垂直)。优化过程基于贝叶斯框架,其中清晰图像的先验是梯度图像的高斯混合,模糊核的先验是指数分布的混合,该框架可以提高核系数的稀疏性。在文献[8]中,模糊核的模型也是指数分布的,但清晰图像的模型是全局先验和局部先验的乘积。全局先验是通过连接两个(线性(一次)或二次)的函数,在对数空间内对图像梯度分布进行建模来定义的。局部先验是通过高斯分布中模糊图像和非模糊图像间的梯度差异来定义的。该方法需要对模糊核进行初步估算,其可以是由用户给出。
    上述方法需要用户输入模糊核的估计初始值。也可以使用真实(未模糊)图像来进行初值估计。在文献[9]中,通过使用边缘检测器找到边缘的位置与方向,再沿着边缘轮廓传播局部最大和最小像素值来形成图像的锐利边缘,从而可以预测一张模糊图像的“锐利”版本。预测出锐化图像后,便可在贝叶斯框架下使用高斯先验,通过核梯度和噪声项进行核估计。在文献[10]中,通过应用双边滤波,冲击滤波和梯度幅度阈值估计来消除估计中的小梯度,从而预测出初始的非模糊图像。通过L2正则化约束的最小二乘法可以迭代更新内核和清晰图像。在迭代过程中,梯度幅度阈值会被降低以期在估计中包含更多的梯度值。文献[11]中的方法的第一步也是使用带有冲击滤波器的尖锐边缘构造,选择有效边缘,并使用最小二乘法进行粗略的核估计。第二步是使用选定的区域和L1正则化来细化粗核估计。最后,使用全变分(TV)——L1方法对图像进行反卷积。除了使用稀疏性促进全变分和L1范数正则化外,文献[12]中还探讨了使用框架(framelets,用于图像)和曲线(curvelets,用于模糊核)等的使用。文献[13-15]中还有一些在不同模糊条件下的多张图片的空间不变盲图像去模糊的方法。
    除了将相机抖动建模为二维平面运动外,还可以使用三维相机运动模型。文献[16]中考虑了相机围绕其光学中心的三维旋转(旋转、俯仰和偏航(左右))引起的空间变化模糊问题。参数化模糊模型被视为从三维旋转中单应性变换得到的线性组合,其用近似边缘化和最大后验方法来处理模糊图像。除了三维旋转外,文献[17]中还使用滚动(Z轴旋转)和面内(XY)平移的方式。在文献[2]中,不再是将单应性用于锐利图像,而是对单像素网格点进行单应性变换以得到基础模糊核。在此基础上可以对内核进行线性组合以生成由于相机抖动产生的空间变化模糊,从而产生有效的算法。还有基于硬件的方法,文献[18]中使用了智能手机中内置的惯性传感器(陀螺仪传感器)用于精确的模糊核估计。
    文献[19]中考虑了旋转模糊。首先预测旋转物体或相机所产生的透明度贴图;然后使用透明度贴图估算其旋转运动的参数。文献[20]中提出了另一种基于透明度的方法,其使用文献[7]中的方法获得模糊区域的模糊核,然后使用Richardson–Lucy算法对其进行反卷积。
    一些空变去模糊方法局限于离焦模糊,即其内核形状是固定的,但其尺度随深度而变化。文献[21]中匹配了具有相似内容但离焦模糊程度不同的图像块;对于具有相似内容的图像块,同伙使用离焦模糊较少的图像块对具有较多离焦模糊的图像块进行去模糊。该方法要求柑橘离焦量对输入图像进行分割,离焦量是通过优化确定高斯核的比例来决定的。在文献[22]中,首先通过局部对比度测量以完成分割,然后使用马尔可夫随机场传播和图分割技术对深度图进行细化。文献[23]使用局部对比度测量引导滤波生成模糊图[模糊映射?](即高斯核尺度图[高斯核尺度映射?]);然后使用L1-L2优化,用不同的高斯核对输入图像进行去模糊,以获得多个去卷积图像,最后使用模糊图将他们合并成单个图像。文献[24]中给出了另一种方法,该方法使用局部方差进行尺度估计,并使用截断约束的最小二乘法来完成恢复。结果表明,模糊核尺度识别是空变离焦去模糊的关键部分。文献[25]中的研究还表明,使用编码孔径代替传统的全开放孔径,可以提高尺度识别的性能。
    有一些方法是根据模糊线索对图像进行第一次分割。文献[26]中依据局部功率谱、梯度直方图、最大饱和度和局部自相关等特征,使用贝叶斯分类器分割出图像的清晰、线性运动模糊和离焦模糊区域。文献[27]中使用了子带分解获得的特征进行分割,这些特征揭示了小邻域被候选模糊核模糊的可能性,这仅限于特定长度的水平和垂直盒式滤波器。文献[28]假设在非模糊背景中存在单个模糊物体,且其沿某一方向匀速运动。首先基于图像的导数对图像进行分割,确定模糊区域中核的大小与方向,最后使用Richardson-Lucy算法对模糊区域进行反卷积。文献[3]提到了在期望最大化框架中显示提取深度图、参数模糊核估计以及每个深度的反卷积。在文献[29]中,清晰图像和运动方向同时通过TV-L1模型进行估计。运动流估计的正则化结合了边缘图,因此可以保持清晰的运动边界。局部模糊核定义为线性核,其方向和长度由运动流确定。
    基于块的核估计和去模糊也是一种可行的办法。文献[30]中首先估计了局部区域的内核。其假定相邻的内核间具有相似的模糊结构。EMD距离(Earth mover’s distance)用于测量内核块之间的相似性。最后,正确的内核不变,错误的内核被替换为相邻的内核。文献[31]中使用了双边滤波和冲击滤波来估计清晰图像;估计局部模糊核的同时提高相邻内核间的平滑度;识别出不良的内核估计值并用相邻内核替换。文献[32]中利用对应图像区域的信息及其与相邻内核的关联性,对初始局部模糊内核估计值进行了修正。
    近来,一些方法中将卷积神经网络(CNNs)用于动态场景的去模糊中,如文献[5,33]。文献[33]将模糊的输入图像划分为一组重叠的块,然后使用CNN在块级预测运动模糊核。为了学习预测运动分布的有效特征,该方法通过离散化运动空间,即运动矢量的长度和方向的范围,产生一组候选的运动核。最后,使用马尔科夫随机场模型,将块级运动核融合到图像的密集运动核场中。该模型可确保为每个像素通过CNN估计得到具有较高置信度的运动核,并且可以提高附近运动核的平滑度。在文献[5]中,为了避免阐释与核估计相关的人工痕迹,模糊数据集的生成和清晰图像的估计均采用了无模糊核的方法。为了模拟模糊过程,该方法使用高速摄像机连续拍摄清晰帧,然后随时间进行合并。为了直接从模糊输入中恢复清晰图像,其提出了一种多尺度损失的CNN模型。在多尺度损失方法中,每个中间输出都是所对应尺度的清晰图像,因此大大提高了收敛性。这些基于学习的方法可以处理多种类型的模糊,但其有效性在很大程度上取决于训练数据的多样性和模型拟合的成功与否。
    在本文中,我们提出了一种但图像盲反卷积框架,其中的模糊是空变的、非参数的。其对图像中的模糊核没有类型和数量的限制。该算法能有效的识别模糊核,并使用均值漂移聚类将图像划分为均匀的模糊区域,最终通过图像去模糊和融合产生清晰的图像。该框架的初步版本已作为会议论文发布,见文献[34]。本文对该方法做了实质性的改进,包括改进的核估计方法和更好的聚类方法(使用均值漂移聚类代替K均值聚类,因为后者需要用户输入聚类个数)。我们将提出的方法与文献[34]中的方法进行了比较,并提供了与文献中其他知名方法的视觉和定量比较。

    3.模糊核估计和去模糊框架

    我们提出的框架有三个主要步骤:(1) 图像块模糊核估计;(2) 使用核聚类以优化模糊核;以及(3) 通过图像融合进行空变去模糊。图1给出了这些步骤的说明。
    图 1 对提出的空变去模糊框架的说明。对于每个图像块,可以估计其模糊核。然后将内核聚类以确定主簇。便可获得核簇的对应图像区域。对于每个图像区域的内核进行精确估计。使用每个内核对整个输入图像进行去模糊以获得一组去模糊图像。然后对去模糊图像进行融合以生成清晰图像。

    3.1 图像块模糊核估计

    第一步是为了估计输入图像中的局部模糊核。为了估计像素所在处的局部模糊核,这里选择了像素周围的一个小区域,采用空间不变的模糊核估计方法。在我们的方法中,我们采用了文献[10]中提出的粗模糊核估计方法,该方法可以合理快速的以可接受的精度计算模糊核。该方法被用于每个图像块 B p B_p Bp(来自模糊输入图像 B B B)以获得清晰图像 I p I_p Ip和模糊核 k p k_p kp。每个图片块不必是重叠的;我们使用滑动窗口的方法,步长为图像块大小的四分之一。

    3.2 使用核聚类以优化模糊核

    从图像块估计的局部模糊核并不一定都是准确可靠的。一些图像块可能来自于存在多种内核的过渡区域;一些图像块可能来自于纹理强度不足以产生精确核估计的区域。我们提出对估计的模糊核进行聚类,以确定图像中的主要模糊,并舍弃掉不可靠的核。核聚类后,对应的图像块与特定的内核簇相组合以形成该聚类的较大区域。使用较大的区域可以获得更准确的内核估计。
    在没有图像模糊核数量的先验知识的情况下,我们使用文献[35]中提出的均值漂移聚类方法。聚类过程从内核空间中随机选择的点开始。平方和之差小于固定带框的内核估计值将加入到簇中。随着新的点的加入,簇的质心(centroid)得以更新。随着质心的更新,新的点被加入到簇中,然后重复该过程直到收敛。最后,如果两个簇的质心之间的距离小于带宽的一半,则检查这些簇能否合并。具有均匀模糊核和足够的内部纹理有望产生良好的核估计;因此它们也更有可能形成可靠的集群。具有不均匀模糊或纹理不足的图像块的核估计一般较差,且不会与主簇聚合。
    一旦获得了簇,便可通过组合聚类中与其核对应的图像块,将图像分割成具有均匀模糊的区域。为了产生更准确的结果,我们重新估计了新的图像区域组合 B ^ i \hat{B}_{i} B^i的核 k ^ i \hat{k}_{i} k^i。为了完善内核,我们测试了文献[10]和[11]中介绍的方法。文献[11]中的方法比文献[10]中的方法需要更高的计算成本,但产生了更好的结果。(有关内核估计器的实现细节,请参阅文献[10]、[11]。)
    图 2 模糊核估计和聚类。从左往右依次为原始图像、图像块估计的内核、内核聚类后的图像区域及其对应的优化后的内核。图像块大小和内核窗口大小在所有实验中都是固定的,因此,可以根据图像大小获得不同数量的内核。输入图像核内核簇均被缩放以适合对应图像。
    在图2中,我们提供了一组实验中使用的输入图像。该图包括内核簇的对应区域和精确的内核估计值 k ^ i \hat{k}_{i} k^i。图像块大小和内核窗口大小在所有实验中都是固定的,因此,根据输入图像的大小可以获得不同数量的内核。(这些参数的值在第4章中给出)

    3.3 通过图像融合进行空变去模糊

    聚类过程使得一些核及其对应的区域未被分配。这些未分配的块是已知的优化后内核区域的扩展,最后应当加以注意。我们的方法是对每个优化后的内核 k ^ i \hat{k}_{i} k^i的整个输入图像 B B B进行去模糊处理,以获得一组去模糊图像 I ^ i \hat{I}_{i} I^i,并使用图像融合过程,在来自去模糊图像 I ^ i \hat{I}_{i} I^i选择在像素位置的最佳像素值,从而产生清晰的图像。
    对于图像反卷积,我们使用的是文献[36]中基于TV-L1的方法,该方法可以最小化以下成本函数 ∥ B − k ^ i ⊗ I ^ i ∥ 1 + λ ∥ ∇ I ^ i ∥ 2 \left\|B-\hat{k}_{i} \otimes \hat{I}_{i}\right\|_{1}+\lambda\left\|\nabla \hat{I}_{i}\right\|_{2} Bk^iI^i1+λI^i2,其中 λ \lambda λ为正则化常数。
    对于融合过程,在每个像素位置都从其中一个去模糊图像中选择一个像素值。该选择基于以下观察:在恢复的图像 I ^ i \hat{I}_{i} I^i中,对于所应用的内核正确的区域,可以实现平滑恢复;而图像的其他部分会产生严重的振铃效应(ringing artifacts),因为这些区域无法由该内核解释。与自然图像的梯度相比,这些振铃及其强烈,一般具有很大的梯度。这一信息 在文献[25]中曾用于确定模糊核离焦深度的比例。除了自然图像中梯度的稀疏分布外,我们还在融合过程中使用了该信息。在我们的实现中,从去模糊图像中选择一个像素,该去模糊图像在该像素周围的局部窗口中产生最小能量。能量最小化函数定义为:

    ∑ ( x , y ) ∈ W ∣ B ( x , y ) − k ^ i ⊗ I ^ i ( x , y ) ∣ 2 + α ∣ ∇ I ^ i ( x , y ) ∣ \sum_{(x, y) \in W}\left|B(x, y)-\hat{k}_{i} \otimes \hat{I}_{i}(x, y)\right|^{2}+\alpha\left|\nabla \hat{I}_{i}(x, y)\right| (x,y)WB(x,y)k^iI^i(x,y)2+αI^i(x,y)
    其中 ( x , y ) (x, y) (x,y)表示像素位置, W W W表示该像素所在的局部窗口, α \alpha α是正则化常数。

    4. 实验结果

    我们在各种不同类型的空变模糊导致退化的图像上测试了所提出的框架。并与这些可以处理空变模糊的方法进行了比较:

    • Joshi 等 (2010) [4]
    • Hirsch 等 (2011) [2]
    • Shen 等 (2012) [23]
    • Hu 等 (2014) [3]
    • Qian 等 (2014) [34]
    • Sun 等 (2015) [33]
    • Nah 等 (2017) [5]
    • Shen 等 (2018) [30]

    我们在图3-10中提供了视觉比较。在表1中,我们使用了文献[6]中提供的数据集进行了定量比较。

    Image nameSun et al. [33]Nah et al. [5]Proposed
    PSNRSSIMPSNRSSIMPSNRSSIM
    Manmade 0117.510.7516.540.7118.410.79
    Manmade 0214.160.6114.150.5915.620.67
    Manmade 0316.820.7218.120.7721.250.87
    Manmade 0416.720.7119.330.8020.160.84
    Natural 0120.420.8720.620.8720.260.86
    Natural 0217.770.7918.350.8119.610.84
    Natural 0318.820.8319.410.8523.090.93
    Natural 0419.200.8319.980.8620.140.86
    People 0131.480.9632.290.9531.090.96
    People 0227.360.9128.010.9127.440.92
    People 0331.020.9531.110.9434.100.98
    People 0431.100.9531.990.9532.370.96
    Average21.860.8222.490.8323.620.87

    我们所提出的方法有几个参数需要进行设置。其中之一是图像块的大小。图像块大小应当仔细选择;且应当大于模糊核的大小。一方面,当图像块选择过大时,该区域中可能包含多种类型的模糊,这将降低核估计的准确性。另一方面,过小的图像块可能因为纹理不足而无法准确估计。在我们的所有实验中,图像块的大小被设置为312x208,这是我们最初使用进行实验的六分之一。在第5章,我们提供了有关图像块大小对实验结果的影响。
    弄一个参数是滑动窗口中用于获取局部图像块的步长。如果使用步长为一个像素的滑动窗口,则由于要估计图像中每个可能的图像块,计算成本将达到最大。如果使用不重叠的图像块,则可能丢失均匀模糊的区域。在我们的实验中,水平和垂直方向的步长均被设置为图像块大小的四分之一。我们将在下一章进一步讨论步长。
    内核聚类步骤采用的是均值漂移聚类算法,其中距离测度为两内核间的平方差纸盒,带宽设置为4.5,这些是由经验决定的。带宽值对实验结果的影响将在第5章中给出。核估计的参数是按照文献[11]中的推荐参数设定的;图像反卷积的参数使用的是文献[36]中的推荐参数。对于图像融合,局部窗口大小设置为模糊核的大小,正则化常数 α \alpha α设置为10。一旦参数确定,所有实验中的参数值都保持不变。
    在图3中,输入图像中有至少两个不同方向上的离焦模糊核运动模糊,如图2中的模糊内核块所示。可见例如文献[11]中的这种为空间不变模糊所设计的方法,无法处理这种类型的图像。专为离焦模糊设计的方法,如文献[23]中所提到的,也无法解决运动模糊。在这些情况想,本文所提出的方法效果最好。因当注意的是,本文提出的方法的内核改进是基于文献[11]的,当模糊是空间不变时,它确实能产生非常好的结果,但是在本例中所看到的其他情况都不甚理想。
    图 3 空变图像去模糊的比较
    图4中的输入是由于相机抖动而产生的模糊;其场景也是非平面的。输入图像来自于文献[2]。结果表明,该方法笔文献[2]和文献[34]中的方法更有效。
    图 4 空变图像去模糊方法的比较 数据来源:输入图像取自文献2
    图5中的输入具有不同深度的对象,并存在一些运动模糊,但相比图4较少。输入图像来自于文献[3]。与文献[3]和[34]中的方法相比,该方法产生的结果最清晰。
    图 5 空变图像去模糊方法的比较 数据来源:输入图像取自文献3
    图6中的输入图像来自于文献[30]。将该方法与文献[4,30]和文献[34]。从不同的特征(close-up 特写)区域来看,该方法总体上具有更好的恢复能力。
    图 6 空变图像去模糊方法的比较数据来源:输入图像取自文献4
    今年来开发出的基于卷积神经网络(CNN)的方法处理空变模糊是可以得到出色的结果。图7-图9中的输入图像来自于文献[5],该文献提出了一种基于CNN的空变去模糊方法。在这些图片中,我们还包括了文献[29]和文献[33]中方法的结果,它们也是为了消除空变模糊而设计的。对这些结果进行评估,该方法与基于CNN的方法相比,产生了更好或类似的效果。
    图 7 空变图像去模糊方法的比较数据来源:输入图像取自文献5
    图 8 空变图像去模糊方法的比较数据来源:输入图像取自文献5
    图 9 空变图像去模糊方法的比较数据来源:输入图像取自文献5
    图 10 空变图像去模糊方法的比较数据来源:输入图像取自文献6
    最后,我们将文献[5]和[33]中基于CNN的方法与本文方法进行定量比较。数据集取自文献[6],其提供了对应的真实图像。在表1中,我们列出了具有不同模糊量的图像的峰值信号比(PSNR)和结构相似性(SSIM)值。有关数据集的更多信息,可见文献[6]。在图10中,我们提供了来自该数据集的视觉比较示例。

    可以看出,虽然一些方法是针对各种特定类型的模糊情况而设计的,但所提出的方法可以处理各种模糊情况,并产生能与其他方法相媲美甚至更好的结果,即使在所比较方法是专门针对这种情况设计的时候也是如此。

    5. 讨论

    本文提出的框架设计多个步骤,在表2中,我们提供了每个步骤的详细计算时间。由于集群的数量和集群区域的大小取决于输入图像,因此整个过程的时间不固定。在表格中,我们提供了当输入的图像数据集尺寸为1248x1872时的平均计算时间(运行10次)。每次运行过程中图像块的大小为312x208,步长设置为图像块大小的四分之一。实验是在装有 Intel Xeon® CPU @3.50GHz 和4.7GB内存的计算机上完成的。需要注意的是,某些步骤可以很容易的并行化:可以并行处理图像块以获得初始模糊内核、可以并行完成每个集群的内核优化、可以并行完成每个内核的图像去模糊。如果没有利用可能的并行化,则计算时间将变得很长。以大小为1248x1872的图像为例,按照所设定的图像块大小和步长将有400个图像块。如果按顺序对图像块进行内核估计,则所有补丁的时间将变为4s x 400 = 1600s,大约27分钟。在这种情况下,总时间约为半小时。

    Computational cost
    Algorithm stepAverage time
    Image patch blur kernel estimation4 s per patch
    Kernel clustering2 s
    Kernel refinement6 s per image
    Image deblurring70 s per image
    Image fusion26 s

    如前文所述,本文提出的框架非常灵活,可以适应在不同步骤中使用的技术的变化。聚类、核估计、去模糊或融合技术可以用其他方法替代。这些方法的参数可以通过微调以获得最佳的整体性能。对于本文中的所有试验,我们均使用了一组固定的参数。这些参数是通过试验评价确定的。在此,我们将进一步讨论这些参数对性能的影响。其中一个关键参数是图像块大小。当其太小时,可能没有足够的图像特征来获得可靠的模糊核;当其太大时,很难获得只有一种类型模糊的图像补丁。在图11中,我们比较了三种不同的图像块大小。我们选择的图像块大小为312x208,其可以在每个簇内产生足够大的具有均匀模糊的簇区域。较小的图像块会导致很多小的簇区域,而较大的图像块会导致包含多种类型模糊的较大簇区域;在这两种情况下,去模糊的性能均会降低。
    图 11 图像块大小对聚类和最终去模糊的影响。其显示了在不同图像块大小下的聚类区域和去模糊图像。在每种情况下,步长是图像块大小的1/4。
    第二个关键参数是步长,其表示从一个图像块到另一个图像块间的位移。在极端情况下,步长可以设置为一个像素;这将增加图像块的数量(因此也会增加估计模糊核的数量),并且我们期望具有更可靠的内核聚类。其缺点是计算成本会增加,因为必须估计每个图像块的模糊内核。随着步长的增加,我们会发现其性能会因内核数的减少和丢失均匀和区域的概率增加而下降。在图12中,我们比较了步长设置为四分之一或二分之一的图像块大小。我们可以看到,较大的步长(图像块大小的二分之一)会使得最终的去模糊图像中有明显的人工痕迹。表3提供了对文献[6]中一组图像上不同图像块大小和步长数量的定量比较;这些定量结果与视觉观察结果一致。
    图 12 步长对聚类和最终去模糊的影响。每种情况下图像块的大小为312x208。

    Image name Patch size =240 × 156 Patch size = 312 × 208 Patch size = 312 × 208 Patch size = 468 × 312
    Stride = Patch size/4 Stride = Patch size/4 Stride = Patch size/2 Stride = Patch size/4
    PSNR SSIM PSNR SSIM PSNR SSIM PSNR SSIM
    People 01 32.04 0.95 31.09 0.96 32.04 0.95 32.04 0.95
    People 02 26.65 0.9 27.44 0.92 26.65 0.9 27.12 0.92
    People 03 24.32 0.86 34.1 0.98 31.93 0.95 31.93 0.95
    People 04 18.53 0.63 32.37 0.96 31.23 0.95 31.23 0.95
    Average 25.38 0.83 31.25 0.96 30.46 0.93 30.58 0.94

    另一个重要的参数是均值漂移聚类带宽。当带宽太大时,不同类型的内核将连接在一起;当带宽太小时,内核(即使来自同一类型的模糊)便无法分组,而且某些模糊类型可能被跳过。在图13中,我们提供了不同带宽值的结果;我们看到4.5的带宽值与其他值相比产生了较好的结果。
    图 13 均值漂移聚类带宽对去类和最终去模糊的影响
    最后,我们探究了和聚类中的初始点对性能是否有影响。我们随机选择种子点,并重复该过程十次。与我们预期的一样,不同的种子点可能会导致集群的稍有不同;然而,这不会导致最终去模糊图像中有任何重大变化。如图14所示。
    图 14 聚类种子点随机选择对聚类收敛和最终去模糊的影响。(a)中的结果在10次运行中的第7次获得;(b)中的结果在10次运行中的第3次获得。

    6. 结论

    本文提出了一种适用于空变模糊的盲图像去模糊方法。该方法可以处理任何类型的空变模糊,而无需对摄像机或物体的运动进行任何参数化假设。该方法将图像分割成重叠的图像块,并估计每个图像块中的模糊核。然后对估计的内核进行聚类以找到主模糊核和对应的区域。某些图像区域可能仍然为分配给集群。对于每个聚类区域,模糊核都将进行优化。然后用每个改进后的模糊核对输入图像进行去模糊处理。图像的融合过程将这些去模糊图像合并为一个单独的图像,使用能量函数选择最佳像素。尽管我们为每个步骤提供了一组特定的技术,但是该框架可以与其他技术和参数选择一起使用,从而有可能在将来进行改进。将该方法与其他各种空变的去模糊方法进行了比较;并在各种模糊情况下产生可以媲美或更好的效果,包括相机抖动、离焦模糊和对象运动。

    参考文献

    [1] B.K. Gunturk, X. Li, Image Restoration: Fundamentals and Advances, CRC Press, Boca Raton, FL, 2012.
    [2] M. Hirsch, C.J. Schuler, S. Harmeling, B. Schölkopf, Fast removal of non-uniform camera shake, IEEE Int. Conf. Comput. Vis. 463–470 (2011).
    [3] Z. Hu, L. Xu, M.H. Yang, Joint depth estimation and camera shake removal from single blurry image, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 2893–2900, 2014.
    [4] N. Joshi, S.B. Kang, C.L. Zitnick, R. Szeliski, Image deblurring using inertial measurement sensors, ACM Trans. Graph. 29 (2010).
    [5] S. Nah, H.T. Kim, K.M. Lee, Deep multi-scale convolutional neural network for dynamic scene deblurring, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 3883–3891, 2017.
    [6] W.S. Lai, J.B. Huang, Z. Hu, N. Ahuja, M.H. Yang, A comparative study for single image blind deblurring, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, 2016, pp. 1701–1709.
    [7] R. Fergus, B. Singh, A. Hertzmann, W.T. Freeman, Removing camera shake from a single photograph, ACM Trans. Graph. 25 (2006) 787–794.
    [8] Q. Shan, J. Jia, A. Agarwala, High-quality motion deblurring from a single image, ACM Trans. Graph. 27 (2008) 1–10.
    [9] N. Joshi, R. Szeliski, D.J. Kriegman, PSF estimation using sharp edge prediction, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 1–8, 2008.
    [10] S. Cho, S. Lee, Fast motion deblurring, ACM Trans. Graph. 28 (2009) 145:1–145:8.
    [11] L. Xu, J.Y. Jia, Two-phase kernel estimation for robust motion deblurring, European Conf. Comput. Vis. 6311 (2010) 157–170.
    [12] J. Cai, H. Ji, C. Liu, Z. Shen, Blind motion deblurring from a single image using sparse approximation, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 104–111, 2009.
    [13] J. Chen, L. Yuan, C.K. Tang, L. Quan, Robust dual motion deblurring, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 1–8, 2008.
    [14] F. Li, J.Y. Yu, J.X. Chai, A hybrid camera for motion deblurring and depth map super-resolution, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 1–8, 2008.
    [15] L. Yuan, J. Sun, L. Quan, H.Y. Shum, Image deblurring with blurred/noisy image pairs, ACM Trans. Graph. 26 (2007).
    [16] O. Whyte, J. Sivic, A. Zisserman, J. Ponce, Non-uniform deblurring for shaken images, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 98, 2010, pp. 168–186.
    [17] A. Gupta, N. Joshi, C.L. Zitnick, M. Cohen, B. Curless, Single image deblurring using motion density functions, European Conf. Comput. Vis. 6311 (2010) 171–184.
    [18] O. Šindelář, F. Šroubek, Image deblurring in smartphone devices using built-in inertial measurement sensors, J. Electron. Imaging 22 (2013).
    [19] Q. Shan, W. Xiong, J.Y. Jia, Rotational motion deblurring of a rigid object from a single image, IEEE Int. Conf. Comput. Vis. 1–8 (2007).
    [20] J. Jia, Single image motion deblurring using transparency, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, 2007.
    [21] Y.W. Tai, H.X. Tang, M.S. Brown, S. Lin, Detail recovery for single image defocus blur, Trans. Comput. Vis. Appl. 1 (2009) 95–104.
    [22] Y.W. Tai, M.S. Brown, Single image defocus map estimation using local contrast prior, IEEE Int. Conf. Image Process. 1797–1800 (2009).
    [23] C.T. Shen, W.L. Hwang, S.C. Pei, Spatially-varying out-of-focus image deblurring with L1-2 optimization and a guided blur map, in: IEEE Int. Conf. on Acoustics, Speech, and Signal Processing, Vol. 1069–1072, 2012.
    [24] H. Cheong, E. Chae, E. Lee, G. Jo, J. Paik, Fast image restoration for spatially-varying defocus blur of imaging sensor, Sensors 15 (2015) 880–898.
    [25] A. Levin, R. Fergus, F. Durand, W.T. Freeman, Image and depth from a conventional camera with a coded aperture, ACM Trans. Graph. 26 (2007) 1–9.
    [26] R. Liu, Z. Li, J. Jia, Image partial blur detection and classification, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 1–8, 2008.
    [27] A. Chakrabarti, T. Zickler, W.T. Freeman, Analyzing spatially-varying blur, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 2512–2519, 2010.
    [28] A. Levin, Blind motion deblurring using image statistics, Adv. Neural Inf. Process. Syst. 841–848 (2006).
    [29] T.H. Kim, K.M. Lee, Segmentation-free dynamic scene deblurring, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 2766–2773, 2014.
    [30] Z. Shen, T. Xu, J. Pan, J. Guo, Non-uniform motion deblurring with kernel grid regularization signal process, Signal Process., Image Commun. 62 (2018) 1–15.
    [31] S. Harmeling, H. Michael, B. Schoelkopf, Space-variant single image blind deconvolution for removing camera shake, Adv. Neural Inf. Process. Syst. 1 (2010) 829–837.
    [32] H. Ji, K. Wang, A two-stage approach to blind spatially-varying motion deblurring, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 73–80, 2012.
    [33] J. Sun, W. Cao, Z. Xu, Ponce, Learning a convolutional neural network for non-uniform motion blur removal, in: IEEE Int. Conf. on Computer Vision and Pattern Recognition, Vol. 769–777, 2015.
    [34] Q. Qian, B.K. Gunturk, Space-varying blur kernel estimation and image deblurring, IS&T/SPIE Electron. Imaging 9023 (2014).
    [35] Y. Cheng, Mean shift, mode seeking, and clustering, IEEE Trans. Pattern Anal. Mach. Intell. 17 (1995) 790–799.
    [36] J.F. Wang, Y. Zhang, W.T. Yin, An efficient TVL1 algorithm for deblurring multi-channel images corrupted by impulsive noise, J. Sci. Comput. 31 (2009) 2842–2865.

    展开全文
  • 一行CSS: body{ font-variant-east-asian: traditional; } 网页中的文字就会使用繁体。

    一行CSS:

    body{
    	 font-variant-east-asian: traditional;
    }
    

    网页中的文字就会使用繁体。

    展开全文
  • Unity2018 2019 Prefab 说明(官方文档翻译) 名词解释: 预制体:Project窗口中是预制体,也是预制体资源 实例:将prefab从Project窗口中拖拽到Hierarchy中后就变成了实例(prefab的复制体) 覆写:做名词时...

    Unity2018 2019 Prefab 说明(官方文档翻译)

    名词解释:

    预制体:Project窗口中是预制体,也是预制体资源

    实例:将prefab从Project窗口中拖拽到Hierarchy中后就变成了实例(prefab的复制体)

    覆写:做名词时表示在实例上做出的,但是还没应用到预制体上的修改。做动词时表示在实例上做出修改但是不应用到预制体上

    应用:让Project窗口中的预制体资源变得跟Hierarchy窗口中的实例一样的操作

     

     

    实例覆写(Instance Overrides)

    实例覆写允许创建不同版本的实例,并且将这些实例链接到相同的预制体。

    当更改预制体资源时,它的更改将映射到它所有的的实例中,但是你也可以直接对单个实例进行修改,当进行这个操作时将在该实例上创建一个实例覆写。

    例如你有一个“Robot”预制体,你想将它放到了多个关卡中,每个实例具有不同的速度和不同的音效,这时可以使用实例覆写。

     

    实例覆写有四种类型:

    • 覆写属性的值
    • 添加一个组件
    • 移除一个组件
    • 添加一个子物体

     

    预制实例有一些限制:不能重新指定父级,不能移除预制体中的GameObject。但是可以禁用GameObject用来代替删除GameObject(这算作属性覆写)

    在Inspector窗口中,加粗字体的标签左侧存在一条蓝线的地方表示存在实例覆写,当添加一个新的组件时,蓝线会覆盖整个组件,添加或移除组件时在Inspector窗口会有加减号在图标上。

    Inspector窗口显示Dynamic Occluded 属性覆写和添加了一个Rigdbody组件

     

    添加一个GameObject时在Hierarchy窗口会有加号标注在它的图标上。

    Hierarchy窗口显示一个添加了“Fruit”Gameobject的预制体实例

     

    • 覆写优先级(Overrides take precedence)

    属性的实例覆写的优先级高于在预制体上覆写的优先级,即改变预制体上的属性值,并不会影响在实例上被覆写的属性值。

    如果你更改预制体上的属性值,但是它并没有应用到所有的实例上,你应该检查这个属性是不是在实例上被覆写了。如果你有大量的实例覆写,判断一个预制体的更改是否会应用到每一个实例上会非常困难,所以应该在非常严谨地需要实例覆写的特性的情况下再使用实例覆写。

     

    • 对齐对于实例覆写是个例外(Alignment is specific to Prefab instance)

    实例的对齐是一种特殊情况,处理方法与其他属性不同。对齐值从不从预制体产传递到实例。这意味着它们总是可以与预制体的对齐方式不同,无需显式的实例覆盖。具体来说,对齐包括实例根节点上的Transform组件,对于一个RectTransform来说也包括Width, Height, Margins, Anchors 和 Pivot属性。

     

     

     

    通过实例编辑预制体(Editing a Prefab via its instances)

    预制体实例的根节点的Inspector窗口中比普通GameObject多三个按钮:Open、Select和Overrides(覆写)。

    预制体实例根节点 Inspector 窗口中的三个按钮

     

    Open按钮打开该实例的预制体的编辑模式,你可以在该模式下编辑预制体并且会应用到所有实例上。Select按钮选中预制体资源。Overrides按钮打开覆写下拉窗口。

     

    • 覆写下拉窗口(Overrides dropdown)

    覆写下拉窗口会展示实例上所有的覆写,它也可以让你将实例上的覆写应用到预制体上,或者将实例上覆写的值还原为预制体的值。Overrides按钮只有在实例的根节点上会出现

    覆写下拉窗口允许应用或还原单个预制体覆写,或一次性应用或还原所有预制体覆写。

    • 应用一个覆写会更新预制体,这会将你现有的实例上的值应用到预制体资源上,这意味着预制体资源现在有这个更新,而实例上则没有了覆写。
    • 还原一个覆写会更新实例,这实际上是丢弃了你的修改并将实例还原为预制体资源的状态。

     

    覆写下拉窗口用更新、添加和移除组件、添加GameObject(包括其他预制体)的形式展示了一个修改列表。

    预制体实例的覆写下拉窗口

     

    要检查条目,单击它将显示一个浮动视图,该视图显示修改并允许还原或应用该修改。

    一个显示选中添加组件的下拉窗口

     

    对于更新了值的组件,这个视图显示了在预制体中的组件与在实例中的组件的值的对比,这让你能去比较原始的值与现在覆写的值,以便于你决定应用还是还原这个值。

    具有对比视图的下拉窗口

    覆写下拉窗口中也有“Revert All”和“Apply All”按钮可以一次性还原或者应用所有的修改。需要注意的是,如果你内嵌了一个预制体在另一个预制体中,“Apply All”按钮总是将修改应用到最外层的预制体,也就是有覆写下拉窗口(Overrides)按钮的根节点的预制体。

    • 右键菜单(Context menus)

    你也可以使用Inspector窗口中的右键菜单来还原或者应用单独的覆写。

    被覆写的属性表现为字体为粗体,他们可以通过右键菜单还原或者应用。

    一个属性的右键菜单

     

    更新的组件可以通过右击组件标题或者点击右上角的齿轮按钮来还原或者应用。

    更新的组件的右键菜单

     

    添加一个组件会在它的图标上有加号。

    添加的组件的右键菜单

     

    移除一个组件会在它的图标上有减号。

    移除的组件的右键菜单

     

    将一个GameObject(包括其他预制体)作为一个子物体添加到预制体中,在Hierarchy窗口中它的图标上会有一个加号,他们可以通过Hierarchy窗口中这个物体的右键菜单还原或者应用。

    被添加的物体的右键菜单

     

     

    内嵌预制体(Nested Prefabs)

    你可以将一个预制体放到另一个预制体中,被包含的预制体叫做内嵌预制体。内嵌预制体仍保留它们和预制体资源的链接,同时也是构成另一个预制体的一部分。

     

    • 在预制体编辑模式下添加一个内嵌预制体(Adding a nested Prefab in Prefab Mode)

    在预制体编辑模式,你可以像在场景中一样添加和处理预制体实例,你可以从Project窗口拖拽一个预制体到Hierarchy窗口或者场景视图去在已经被打开的预制体中创建一个预制体实例。

    Note:被在预制体编辑模式下打开的预制体的根节点不会显示为蓝色方块图标,但是其他的预制体实例的根节点会显示为蓝色方块图标。你也可以像在场景中编辑预制体实例一样,在这些预制体实例中进行覆写。

    左边:在“Robot”的编辑器模式下将“Oil Can”预制体内嵌。右边:包含“OilCan”的“Robot”实例在场景视图中

     

    • 通过实例内嵌预制体(Nesting Prefabs via their instances)

    你也可以像添加子物体一样在场景视图直接将一个预制体作为子物体内嵌到另一个预制体实例中,这样被添加的预制体会在图标上有一个加号,表示对于外层的预制体实例来说这是一个覆写。

    被添加的预制体可以像其他GameObject一样被还原或者应用(具体见“通过实例编辑预制体”)。只有在最外层预制体有覆写下拉窗口。一旦被应用,预制体图标上不会再再显示加号,因为它已经被内嵌到了预制体实例中,但是它的图标还会是一个蓝色方块,因为它本身是一个预制体实例,并且它仍保留了与预制体资源的链接。

    左边:“Robot”的实例上添加了一个“Oil Can”预制体作为一个覆写。右边:“Oil Can”预制体被应用到了“Robot”预制体上,现在是“Robot”预制体资源的一个内嵌预制体

     

    预制体变体(Prefab Variants)

    当你想要一组各种版本的预制体时,预制体变体非常有用。

    例如:你想要几个不同类型的机器人,但他们有相同的基础的机器人预制体,你可能想要一些机器人携带一些物品,一些用不同的速度移动,或者一些有不同的音效。

    为了实现这个目的,你可以去在所有机器人都会分享的基础的机器人预制体上设置好基础的动作,然后创建几个预制体变体去:

    • 用一个脚本上更改速度的属性覆写让一个机器人移动速度更快。
    • 通过在机器人的手上添加GameObject去让机器人携带物品。
    • 通过添加一个AudioSource组件播放生锈的声音实现给机器人一个生锈的关节。

     

    每一个预制体变体都会继承自一个被称作做base的预制体。预制体变体中的覆写的优先级高于base预制体。一个预制体变体可以将任何prefab作为它的base,包括模型预制体和其他的预制体变体。

     

    • 创建预制体变体(Creating a Prefab Variant)

    有不止一种方法在一个预制体的基础上创建一个预制体变体。

    你可以在Project视图的预制体上右击并且选择Create>Prefab Variant,这样就能创建一个被选中的预制体的初始状态没有任何覆写的变体,你可以打开预制体编辑模式开始给它添加一些覆写。

    你也可以从Hierarchy窗口拖拽一个预制体实例到Project窗口,当你这么做的时候,一个对话框会问你是否像创建一个新的Original预制体还是一个预制体变体,如果你选择了预制体变体,那你就得到了一个基于你拖拽的预制体实例的预制体变体,你在预制体实例上做的所有覆写都在新的预制体变体里面了,你可以打开预制体编辑模式去添加或着编辑或者移除覆写。

     

    预制体变体的图标是蓝色方块上面有两个箭头。

    Hierarchy中的基础预制体"Robot"和预制体变体“Robot With Oil Can”

     

    • 编辑预制体变体(Editing a Prefab Variant)

    当一个预制体变体在预制体编辑模式下打开时,它的根节点的图标和预制实例的蓝色方块图标一样。这个预制体实例表示的是它继承的base预制体,并不表示预制体变体本身。你对预制体变体做的任何编辑都将变成存在在变体中的base预制体的覆写

    编辑器模式写的预制体变体“Robot With Oil Can”,"Oil Can"预制体被添加到base预制体上成为一个覆写

     

    在上面的截图中,如果你选中Robot With Oil Can的根节点,并且点击Inspector窗口中的Select按钮,将会选中base预制体“Robot”而不是预制体变体“Robot With Oil Can”,因为这个实例是一个base预制体“Robot”的实例,而Select按钮总是选中实例来自的那一个预制体资源。

     

    就像所有的预制体实例,你可以在预制体变体中使用覆写,例如更新属性值,添加移除组件和添加子物体,并且它们也有相同的限制:不能重新指定预制体变体中来自于base预制体的GameObject的父物体,也不能移除预制体变体中存在于base预制体中的GameObject。

     

    Note当在预制体编辑模式下编辑一个预制体变体的时候,你应该理解应用这些覆写(通过覆写下拉窗口或者右键菜单)会导致你的预制体变体的版本被应用到base预制体资源,这通常来说都不是你想要的,预制体变体的目的是提供一种方便的方法来储存有意义的可复用的覆写集合,这也是为什么他们通常应该保留为覆写,而不应该应用到base预制体资源上。例如:如果你见被添加的“Oil Can”应用到base预制体资源(“Basic Robot”),那么这个预制体资源也会有“Oil Can”,“Robot With Oil Can”变体的意义就在于只有这个变体携带“Oil Can”,所以添加“Oil Can”GameObject应该作为一个覆写储存在预制体变体中。

     

    当打开覆写下拉菜单时,总是可以在它的标题中看到覆写的对象时什么,已经在什么地方存在覆写。对于一个预制体变体,标题总是会写覆写对象为base预制体并且存在与预制体变体中。为了使它更清楚,Apply All 按钮也会变成 Apply All to Base按钮。

     

    预制体变体在预制体编辑模式下的覆写下拉窗口

     

     

     

    多个级别上的覆写(Overrides at multiple levels)

    当你在其他预制体中使用预制体,或者使用预制体变体时,可以存在几个不同级别的覆写,一个相同的覆写可以应用到几个不同的预制体上。

     

    • 应用目标的选择(Choice of apply target)

    当你的预制体实例里存在内嵌预制体,或者你的预制体是一个预制体变体时,你可能可以选择覆写应该应用到哪一个预制体上。

     

    例如一个预制体“Vase”被内嵌到了预制体“Table”中,并且scene中存在一个“Table”预制体的实例。

    “Vase”预制体被内嵌在了“Table”预制体中

     

    如果在这个实例上,一个“Vase”上的属性被覆写了,这个覆写可以应用到两个预制体上:“Vase”或者“Table”

    在覆写下拉窗口中的“Apply All”按钮只允许将覆写应用到外层的预制体中——在这个例子中是“Table”,但是当你通过右键菜单或者通过覆写下拉窗口中单个组件的比较视图应用覆写时是可以选择覆写目标的。

    在这个例子中,如果你选择“Apply to Prefab 'Vase'”,那么值就会被应用到“Vase”预制体资源上并且被“Vase”预制体的实例使用。

    但是如果你选择“Apply as Override in Prefab 'Table'”,那么这个值就 会变成在“Table”预制体中的“Vase”的实例的一个覆写,这个属性将不会在场景中的实例上被标记为一个覆写,但是如果你在预制体编辑模式下打开一个“Table”预制体,这个属性在“Vase”的实例上会被标记为一个覆写。

     

    当覆写被覆写到“Table”预制体上时,“Vase”预制体资源本身不会被影响,这意味着现在所有“Table”预制体的实例上的“Vase”实例都有了新的值,但是其他不是“Table”预制体的一部分的“Vase”并不会被影响

    如果“Vase”预制体上的这个属性之后被更改了,它会影响到除了这个属性被覆写过的实例以外的所有的实例。因为在“Table”预制体中的“Vase”实例被覆写了,所以这个修改不会影响到它。

     

    • 应用到内层预制体也可能影响到外层预制体(Applying to inner Prefabs may affect outer Prefabs too)

    将一个或多个属性应用到内层预制体资源有时也会更新外层的预制体资源,

    在我们的例子中,如果“Table”预制体中的这个值有一个覆写并且选择了“Apply to Prefab ‘Vase’”,则会同时还原“Table”预制体中的这个覆写,以便实例上的属性保留刚才应用的值。如果不是这样,则实例上的值将在应用后立即更改。

     

    拆包预制体实例(Unpacking Prefab instances)

    想要将一个预制体实例转换为常规的GameObject,你可以拆包这个预制体实例。除了不删除预制体资源而只在预制体实例上作用以外,这个是一个与创建预制体完全相反的操作。

     

    你可以通过在Hierarchy视图右击一个预制体实例并选择“Unpack Prefab”来拆包,在场景中拆包完成的GameObject与它之前的预制体不再有链接,预制体资源并不会被这个操作影响,它的其他预制体实例也可以在工程中继续存在。

     

    如果预制体实例在你拆包之前存在覆写,这些覆写会被“baked”到它拆包成的GameObject中。

     

    如果你拆包了一个内嵌预制体,那么这个内嵌预制体仍然是一个预制体实例,并且仍然有到各自预制体资源的链接。相似的,如果你拆包了一个预制体变体,它的根节点将变成一个新的预制体实例即“base”预制体。

     

    一般来说,拆包一个预制体实例会得到一个与预制体编辑模式下能看到的一样的物体,这是因为预制体编辑模式显示了预制体内部的内容,而拆包预制体实例则是拆包预制体的内容。

     

    如果你想将一个预制体替换为普通的GameObject,并且完全删除所有与预制体资源的链接,你可以在“Hierarchy”中右键单击它并选择“Unpack Prefab Completely”。这相当于拆包预制体以及其中所有的内嵌预制体和“base”预制体实例。

     

    你可以拆包在Scenes中的预制体或者在其他预制体中的预制体。

     

    展开全文
  • SQL_VARIANT_PROPERTY (Transact-SQL)   返回有关 sql_variant 值的基本数据类型和其他信息。   Transact-SQL 语法约定语法 SQL_VARIANT_PROPERTY (expression , property )参数...

    SQL_VARIANT_PROPERTY (Transact-SQL)

     

    返回有关 sql_variant 值的基本数据类型和其他信息。

     

    Transact-SQL 语法约定

    语法

     
    SQL_VARIANT_PROPERTY ( expression , property )

    参数

    expression

    类型为 sql_variant 的表达式。

    property

    包含将为其提供信息的 sql_variant 属性的名称。property 的数据类型为 varchar(128),可以是下列值之一。

    说明 返回的 sql_variant 基本类型

    BaseType

    SQL Server 数据类型,例如:

    bigint

    binary

    char

    date

    datetime

    datetime2

    datetimeoffset

    decimal

    float

    int

    money

    nchar

    numeric

    nvarchar

    real

    smalldatetime

    smallint

    smallmoney

    time

    tinyint

    uniqueidentifier

    varbinary

    varchar

    sysname

    NULL = 输入无效。

    Precision

    数值基本数据类型的位数:

    datetime = 23

    smalldatetime = 16

    float = 53

    real = 24

    decimal (p,s) 和 numeric (p,s) = p

    money = 19

    smallmoney = 10

    bigint = 19

    int = 10

    smallint = 5

    tinyint = 3

    bit = 1

    所有其他类型 = 0

    int

    NULL = 输入无效。

    Scale

    数值基本数据类型的小数点后的位数:

    decimal (p,s) 和 numeric (p,s) = s

    moneysmallmoney = 4

    datetime = 3

    所有其他类型 = 0

    int

    NULL = 输入无效。

    TotalBytes

    同时容纳值的元数据和数据所需的字节数。在检查 sql_variant 列中数据的最大一侧时,该信息很有用。如果该值大于 900,则索引创建将失败。

    int

    NULL = 输入无效。

    Collation

    代表特定 sql_variant 值的排序规则。

    sysname

    NULL = 输入无效。

    MaxLength

    最大数据类型长度(字节)。例如,nvarchar(50)MaxLength 是 100,intMaxLength 是 4。

    int

    NULL = 输入无效。

    返回类型

    sql_variant

    示例

    以下示例检索有关 colA  的 SQL_VARIANT_PROPERTY 信息。

     

    CREATE   TABLE tableA(colA sql_variant, colB int)

    INSERT INTO tableA VALUES ( cast (46279.1 as decimal(8,2)), 1689)

    INSERT INTO tableA VALUES ( 'abcde' ,1700 )

    INSERT INTO tableA VALUES ( $5.88 ,1700 )

     

    SELECT   SQL_VARIANT_PROPERTY(colA,'BaseType') AS 'Base Type',

             SQL_VARIANT_PROPERTY(colA,'Precision') AS 'Precision',

             SQL_VARIANT_PROPERTY(colA,'Scale') AS 'Scale',

             SQL_VARIANT_PROPERTY(colA,'MaxLength') AS 'MaxLength'

    FROM   tableA

    下面是结果集:请注意,这三个值中的每一个都是 sql_variant 

    /*

    Base Type  Precision  Scale  MaxLength

    decimal       8          2      5

    varchar       0          0      8000

    money      19         4      8

    */

     

    DROP TABLE tableA

     

     
    展开全文
  • 看到一个介绍 C++17 的系列博文(原文),有十来篇的样子,觉得挺好,看看有时间能不能都简单翻译一下,这是第六篇~ std::optional, std::any, 和 std::variant 有一个共同特点:他们都支持就地构造.另外的,std::...
  • Unity | 预制体变量 Prefab Variant

    千次阅读 2020-06-04 23:25:52
    Prefab Variant - Unity Manual Prefab Variant 预制体变量 在创建 Prefab 时,会遇到下列窗口提示 Original Prefab 即建立新的原生预制体 如果需要在之前的 Prefab 上进行修改,例如给某个关卡的人物加上帽子等,...
  • git clone https://github.com/davidecarlson/SARS-CoV2-variant-calling-example.git 第三步 使用提供的环境文件,使用此分析中所需的软件创建新的conda环境: conda env create -f environment.yaml 步骤4 从...
  • Variant Call Format (VCF) 笔记

    千次阅读 2017-12-07 15:25:04
    QD (QualByDepth) SNP_default=2.0 INDEL_default=2.0 This is the variant confidence (from the QUAL field) divided by the unfiltered depth of non-reference samples. FisherStrand (FS) 60.0 Phred-scaled ...
  • 原文所在链接:Data pre-processing for variant discovery针对变异发现的数据预处理1.目的 为进行变异发现而进行的数据预处理,是强制性的第一阶段,必须先于所有变异发现。需要对以FASTQ或uBAM格式提供的原始序列...
  • 前言 在《VB/VBA,请让我点名表扬你》一文中指出,立身于教育的Kemeny和Kurtz教授,以其...一、VB的原野,处处都是Variant的小花 1、有种懒叫VB,你不懂! 不声明变量,就可随意而为,在其他强类型的语言里简直不.
  • java uuid静态方法 UUID类variant()方法 (UUID Class variant() method) variant() method is available in java.util package. variant()方法在java.util包中可用。 variant() method is used to get the variant...
  • File → Settings → Experimental → Gradle → Only sync the active variant 解决方法 log信息里已经说明了解决方法 找到File → Settings → Experimental → Gradle → Only sync the active ...
  • Variant 英文翻译:变体。 文章目录Chapter4:创建构建Variant4.1 构建类型4.2 product flavor4.3 构建variant4.4 参考资料 4.1 构建类型 在Gradle的Android插件中,构建类型用来定义如何构建一个应用或依赖库。...
  • C++学习笔记——VARIANT变体数据类型实例 之前工作中看到了VARIANT数据类型,了解到在较复杂些的工程中,很少只用到一个语言,例如之前的html网页调用ActiveX控件,就至少使用了html,js,c++三种语言。而在工程测试...
  • C++ VARIANT 学习小记录 一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++、Java,此外还有JavaScript、VBScript等脚本语言,它们自立门派,各自维护自己的数据类型。 C++是...
  • 本文翻译自:API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders() Using Android Studio 3.3 Canary 11 with the gradle plugin ...
  • 这篇文章从去年就开始翻译的了,无奈项目较赶我翻译的速度又慢,翻译期间Google官网又对它不断更新,以致拖到了现在。这一篇文档是对Android新构建系统的概述,列出了与它相关的一些文档,以及这个新构建系统的各...
  • AlexNet 论文翻译——中英文对照

    千次阅读 2019-02-20 17:19:05
    AlexNet 论文翻译(中英对照)Abstract摘要1 Introduction1 引言2 The Dataset2 数据集3 The Architecture3.架构3.1 ReLU Nonlinearity3.1 ReLU非线性3.2 Training on Multiple GPUs3.2 多GPU训练3.3 Local Response...
  • DQN and variant

    2021-01-09 14:43:44
    经验池作用2英文文献 翻译文献 Our problem is that we give sequential(输入的是按照样本顺序来的, 1–>2–>3) samples from interactions with the environment to our neural network. And it tends to forget ...
  • C++ VARIANT 学习小记录

    2014-07-24 11:01:00
    一:为什么会有这个?... C++是一种强类型语言,即C++中的某个变量,在使用时类型已经确定,C++中的变量都会被翻译成准确的内存地址和大小,如果类型不确定是不可能处理的。当使用C++这样强类型的语言来读取...
  • Class-Variant Margin Normalized Softmax Loss for Deep Face Recognition TNNLS 的short paper 要解决的问题 softmax有两个问题 类别不平衡 有饱和区域 主要思路 Lcum=−1N∑i=iNlog⁡es⋅(cos⁡θyi−h(θyi))...
  • 翻译《有关编程、重构及其他的终极问题?》——26.潜伏的VARIANT_BOOL 标签(空格分隔): 翻译 技术 C/C++ 作者:Andrey Karpov 翻译者:顾笑群 - Rafael Gu 最后更新:2017年06月01日 26. 潜伏的...
  • BCB使用Variant和Automation对象操作Word

    千次阅读 2013-04-27 10:43:00
    BCB使用Variant和Automation对象操作Word  最近,我需要在基于BCB开发的程序上增加导出Word报表功能,由于之前使用Variant和Automation对象操作过Excel,于是放弃了使用Office2k的TWordApplication控件的方式,直接...
  • 没想到翻译这篇《Gradle 插件用户指南》拖了差不多一个月,还跨年了。不过还好,在2号时终于一口气把剩下的给翻译完了(其实那天剩下的也就不到一章)。 今天先发一下第六章,明天再发第七章。 本文译自...
  • 要修改最终输出的文件,可以在 variant 对象上直接使用“outputFile”(译者注:1.0 版本通过variant获取到的是outputs,是一个List,需要通过对其遍历或取第一个元素variant.outputs[0].outputFile才能获得output...
  • R-FCN论文翻译——中英文对照

    千次阅读 2018-01-29 18:47:56
    文章作者:Tyan ...声明:作者翻译论文仅为学习,如有侵权请联系作者删除博文,谢谢! 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers-translation R-FCN: Object Detection via Regi...
  • 昨天晚上只翻译完了第四章,今天就只发第四章吧。 本文译自Android官方技术文档《 Gradle Plugin User Guide 》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide。 翻译...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,767
精华内容 2,706
关键字:

variant翻译