大概从20世纪90年代中期起,纹理合成引起了大家的关注。在计算机图形学中,图形表面的任何表现都可以作为纹理,包括几何信息、材质信息、颜色信息等。
一般,认为纹理在视觉上具有重复的结构单元(纹元),并且伴随着一定的随机变化,即具有结构性和随机性。所以可将纹理分成:结构性纹理、随机性纹理和既有结构性又有随机性纹理三类。根据这样的特性,产生了很多纹理合成的方法。
这些方法大致可分为两类:过程纹理合成、基于样图的纹理合成。其中,过程纹理通过对物理生成过程的仿真直接在曲面上合成纹理,虽然可能获得非常逼真的纹理效果,但普适性差,操作复杂,对不同的纹理,需要反复调参才可能获得好的结果;而基于样图的纹理合成,只需根据一小块样本纹理,便可以合成较大的相似纹理图片,适用性广,也易实现。基于样图的纹理合成中的主要问题可总结为:1、如何采样(确定纹元);2、建立模型,确定纹元之间的关系;3、提高合成纹理的质量和效率。其中,第1点,不同的方法采样的方式可能不同,但基本上,随着采样单元的size增大,能更好的保持纹理的结构性,相反,采样单元的size越小,合成的纹理随机性越大。第2点,建立的模型基本上都是MRF(马尔科夫随机场)模型,在图像中的表现是:(1)每点的像素值只与其周围点的像素值有关,与图像的其他区域值无关;(2)每点像素的具体取值有一定的随机变化。这两条性质恰好吻合了纹理的特性,因而MRF模型在纹理合成中得到了广泛应用。第3点,会在具体的文章中提到。 基于样本图像的纹理合成方法很多,可分为Pixel-based和Patch-based两种,下面仅从最开始几篇比较经典的文章进行学习,做些笔记。
Texture Synthesis by Non-parametric, ICCV 1999.
属于Pixel-based的方法,即每一次只合成一个纹理像素,逐点合成整幅纹理图。是纹理合成经典算法中最早的一个,具体如下:
1、 在给出纹理样本后,我们假设,当某个要合成像素点的周围像素点都已经合成,那么以该点为中心选取大小为nxn(如5x5,11x11等)的Patch;
2、 遍历纹理样本中所有大小为nxn的Patch,选取与上步Patch最相似的;
3、 将最相似的Patch中心点的颜色值赋给要合成的纹理像素点。
即除要合成的像素点外,对应Patch各对应像素RGB差异之和。其中,p、q是对应Patch N1、N2中对应位置的像素点。SSD error越小,说明Patch越相似。另外,为了区分Patch中各点对结果的影响大小,通常在求相似性时会采用加权距离,如乘以一个高斯核,使得离中心点越近的像素对应的权重越大(影响越大),越远越小(影响越小),从而强调了局部结构性。公式修改如下:
然而,除非要合成的纹理只有一个像素,否则上面的假设是不成立的。一般情况下,要合成的该点周围只有部分像素已知。针对一般情况,本文在计算Patch间的相似性时,只比较已知像素之间的差异之和,并选择最相似的,或者设定一个阈值,取得一些差异小于阈值的较相似的Patch,取加权平均值或者随机选取(增加纹理的随机性)以获得最终合成的纹理值。这样的做法看似不是很合理,但实验结果还是令人满意的。原因应该是每个像素值跟它邻域像素的相关性很大,使得部分信息就具有代表性吧。
实验结果如下:
Window size: 5x5 11x11 15x15 23x23
讨论:
1、 算法简单容易实现,但逐点合成的效率低。
2、 当取较大Patch时,能较好地保持纹理的结构性,提高合成纹理的质量,但大大加大了计算量,降低了效率。
Fast Texture Synthesis using Tree-structured Vector Quantization,SIGGRAPH 2000.
也属于Pixel-based的方法,搜索匹配过程和前面类似,也是通过对应Patch的SSD error来衡量相似性,只不过邻域选取不再是nxn的方形Patch,而是L型Patch。具体过程如下图所示(1)→(2)→(3)→(4)→(5):
(1) (2)
(3) (4)
(5)
特别地,在开始合成之前,该方法给出带有随机噪声的纹理作为初始结果,而这些噪声将在边缘处的匹配合成时用到。如下图所示:
输入:样本纹理 输入:随机噪声 输出:合成纹理
同样地,邻域Patch的大小直接影响了合成纹理的结果和效率,如下图显示:
在本文中,首先利用“Multiresolution Pyramid”的方法对样本图和合成图进行下采样,再利用类似于Kd Tree的TSVQ(Tree-structured vector quantization)方法加速匹配查找,大大提高了效率。结果对比如下:
Image Quilting for Texture Synthesis and Transfer, SIGGRAPH 2001.
经典的Patch-based方法,同样是比较Patch间的相似性,不过Patch-based方法每次合成的不是一个像素,而是一块纹理。首先,任取样本中的一块nxn纹理放置在要合成的纹理图的左上角,然后依次平移Patch(有重合),从样本中寻找最相似(重合部分差异最小)的Patch,将不重合的部分填充到要合成的纹理图中,依次进行下去。大致过程如下图做所示:
![]() |
![]() |
![]() |
![]() |
![]() |
当然,如果直接这样简单地张贴,会使得每两个Patch接缝比较明显,该文中采取“动态规划”的方法找到一条能量最小(这条线上两个Patch之间的差异最小)的接缝。具体实现时,类似于贪心算法,假设以前的路径能量最小,那么只要考虑下一步也使得能量最小即可,而下一步只有三种情况(因为接缝是连续的,像素是离散的),以竖直方向的路径为例,公式如下:
同理,水平方向上也能找到这样一条能量最小的接缝,并与水平方向上的相交,如下图所示:
蓝色的交叉点为两方向接缝的交点,黄色接缝左边的区域取左边Patch的像素,右边的区域取右边Patch的像素。合成结果如下:
另外,在计算相似性进行匹配时,如果还考虑亮度等差异,该方法还可以应用到纹理迁移上,文章中给出了一个示例效果,如下图:
最后,该方法也可利用如ANN进行加速查询匹配,效率高,并且合成的纹理质量好。
Graphcut Textures:Image and Video Synthesis Using Graph Cuts, SIGGRAPH 2003.
Patch-based方法,它的灵活性在于张贴Patch的大小和形状不是先验性的,而是根据graph-cut方法计算出最佳接缝来确定最终张贴的区域。主要过程分为两步:
1、Patch选取、放置、匹配:
根据不同纹理的情况,文章提出了三种不同的方法筛选Patch,即随机放置、整体匹配、子像素块匹配。其中:
(1)随机放置:将整个输入图(原始的sample texture)随机放置到要合成的纹理图像中的某个位置(之后通过graph-cut计算挑选其中某部分区域放置到要合成的图像中,作为输出,并重复这样的过程)。这种方法快速,且能获得较好的随机纹理。
(2)整体匹配:将整个输入图(原始的sample texture)不断平移合成到输出图中,过程应该像Image Quilting那样,从上到下,从左到右,只不过每次平移多少是根据重合像素的cost function(平均后的SSD error)以及概率函数确定(先筛选出error值小于阈值的平移情况;然后根据概率函数随机选取其中一种,确定Patch位置;最后利用graph-cut确定新的合成区域)。该方法能很好的保持纹理图内在的周期规律,适用于结构性纹理和半结构性纹理的合成。
(3)子像素块匹配:从输出纹理中选择一小块子纹理,根据cost function在输入中(原始的sample texture)找与之相匹配的子纹理块。这种方法适合随机纹理合成,也适用视频序列的合成。
2、 Graph-cut计算接缝,挑选最优的不规则区域用于合成:
把纹理Patch重叠区域的每个像素当作一个节点,给连接相邻像素点s和t的弧赋值,该值表示匹配质量(程度),值越小匹配程度越高,越可能从这里切割。这样便构成一个图,用最小割算法来求解出最优的接缝。
假设s、t是来自Patch A、Patch B重合部分的两相邻像素点,则s、t间弧的权值为M(s,t,A,B)可以简单地定义为:
即对应点像素差之和。这里,||.||表示某种合适的范数,如2范数。
通过graph-cuts方法计算最佳接缝,如下图所示,竖直方向的红色接缝,重合区域的左边取Patch A中的像素值,右边取Patch B中的像素值。
同理,会有水平方向上的接缝,环形的接缝等等。随着不断地合成新纹理,这些接缝也会被不断更新,以获得最佳的匹配。
由于出现在图像的低频区(平缓区)的接缝(接缝)会比出现在高频区的接缝在视觉上更明显,文中提出调整匹配成本函数M(s,t,A,B)、加入梯度约束来优化接缝的选择。即使这样,可能还存在视觉上比较明显的接缝,这时可采用“羽化和多分辨率”的方法淡化接缝。最后,用基于FFT的方法在计算SSD时进行加速,大大提高合成效率。大致过程及结果如下图:
该方法还可以用于视频合成,此时的“Patch”为视频的3D空间-时间块(3D spatio-temporal block),接缝为分割block的面。
PS:只是做了纹理合成的一个初步调研,更多内容还没有涉及,更多细节也得去看文章。如果有哪里写得不对的地方,请指正,谢谢!
本文为原创,转载请注明出处:http://www.cnblogs.com/dongdu
参考文献:
[1] Efros A, Leung T K. Texture synthesis by non-parametric sampling[C]//Computer Vision, 1999. The Proceedings of the Seventh IEEE International Conference on. IEEE, 1999, 2: 1033-1038.
[2] Wei L Y, Levoy M. Fast texture synthesis using tree-structured vector quantization[C]//Proceedings of the 27th annual conference on Computer graphics and interactive techniques. ACM Press/Addison-Wesley Publishing Co., 2000: 479-488.
[3] Efros A A, Freeman W T. Image quilting for texture synthesis and transfer[C]//Proceedings of the 28th annual conference on Computer graphics and interactive techniques. ACM, 2001: 341-346.
[4] Kwatra V, Schödl A, Essa I, et al. Graphcut textures: image and video synthesis using graph cuts[C]//ACM Transactions on Graphics (ToG). ACM, 2003, 22(3): 277-286.
[5] 博客:http://www.tuicool.com/articles/2qyAriZ