2019.12.16 日更正:本文最后有说起本算法不合适C语言实现,可是可在【算法随记六】一段Matlab版本的Total Variation(TV)去噪算法的C语言翻译 一文中找到替代算法。html
本文主要由Structure Extraction from Texture via Relative Total Variation一文中的内容翻译而来,做者又是香港中文大学的一批牛人。算法
一:问题由来编程
不少天然场景和人工艺术品都包含纹理。好比,墙上,火车和地铁表面上的涂鸦和图案。像地毯,毛衣,和其余一些精美的工艺品包含格式各样的几何图案。在人类历史中,马赛克被视为一种艺术形式,它能够表示人和动物这类复杂的场景,并能够用石头,玻璃,陶瓷和其余一些材料模仿油画。当用Google收索这些图像的时候,你能够很快的找到成千上万相似图片。下图展现了一些表明不一样形式场景的实例。他们有一个共同的特征:图像中有意义的结构和纹理单元融合在一块儿。因此咱们一般称这类图片为“结构+纹理”图片。一个颇有意思的现象:在不去除纹理的前提下,人类的视觉感知系统彻底有能力理解这些图像。从内心学角度分析,图像的总体结构特才是人类视觉感知的主要数据,而不是那些个体细节(纹理)。所以从图像中提取那些有意义的结构数据是一项具备意义的工做,同时对于计算机来讲也是很是有挑战性的。函数
二:算法描述post
在《Structure Extraction from Texture via Relative Total Variation》一文中提出了一种基于总变差形式新模型,该模型能够有效的分解图像中的结构信息和纹理,而且无需特别指定纹理是否规则或者对称。换言之,该方法具备通常性和随意性,它适用于非统一的或各向异性的纹理。下面介绍一下该方法。 google
上式为总变差模型, I表明输入图像,p表明2D图像像素的索引,S表明输出结构图像。其中能够写成以下各向异性的形式:url
改进的模型以下spa
其中翻译
q为以p点为中心的一个正方形区域内全部的像素点的索引,g为高斯核函数:3d
下图(a)是一幅包含纹理的图像。(b)则反映了纹理和结构像素点都会产生比较大的D(D值大反应在图像中也就是对应像素点的亮度高);(c)能够看出结构部分中的L(L值大反应在图像中也就是对应像素点的亮度高)值大于纹理部分的L值,形成这种现象的一种直觉上的解释为:在包含在一个局部的小窗口中主要结构每每产生比包含在另外一个窗口的复杂纹理具备更多类似方向的梯度。(d)为 (也就是(3)式中的规则项)的映射,而这个规则项让主要结构部分更加突出。(e)则是(a)用式(3)去除纹理后的结构图像。
下面介绍怎么样求解公式(3): 先讨论X方向,Y方向的计算相似。
公式(9)能够至直接求矩阵的逆运算,或者用预处理共轭梯度法来求解。
三:实验结果
实验中ε和εs是2个小正值用来避免分母出现0的状况。其中ε固定为0.001. 而εs稍微大点会帮助保持光滑变化的结构部分,一般设定为0.02。公式(5)中的λ是一个不可或缺的权重它用来控制图像的光滑程度,可是仅仅调节它不会使纹理分离太多。而增长λ也会形成图像的模糊而且纹理反而保留下来。 通常λ选取为0.01到0.03之间。图1表示不一样迭代步数显示的结果,实验发现该算法3-5步就能够达到收敛状态。
空间尺度参数σ控制了公式(4)中窗口的大小,它的选取取决于纹理的尺度大小而且在结构纹理分离过程当中相当重要,经验的选取σ为0到8之间,图2说明了加强σ能够很好地抑制纹理。而且实验中发如今每一次迭代时成倍的减少,能够起到锐化边缘的效果,同时不会减弱纹理去除的能力.
当一幅物体的表面包含多重纹理形式或者能够当作非正面方向,纹理单元就能够认为是不一样变化尺度的。图2和图3就是这样一类图像。由于在该算法中小于相对于尺度参数 那些纹理都获得了有效的惩罚,因此文章的提出模型能够很好的处理这种类型的图像。固然,若是远处的结构和近处的纹理类似,他们也都会被去除。由于该算法依赖于局部的数据,因此咱们不须要认为局部的梯度是各项同性的。只要在一个局部窗口中方向相反的梯度相互抵消,该方法就能生效,而无论梯度模式是否是各项同性的或是异性的。
图像矢量化就是把一个像素图像转化为一个矢量图。矢量图能够任意的放大和缩小而不会丢失细节部分,然而大多数矢量化的方法都不能表示好的细节部分。因为复杂的纹理模式和局部像素点的不断震荡的广泛存性,矢量化“结构+纹理”这一类图像变的更加困难。观察图8(c)和(e),经典的矢量化软件Vector Magic也不能很好地完成矢量化。在本文中,咱们开始先分解纹理和结构,分解的结构图为图8(b),而后矢量化就能够很好地运用了。在矢量化的过程当中,结构图像(b)直接被放大。于此同时,纹理图像能够用双线性插值做为一个位图从新被放大。最后合成这两层图像得到图8(f)。相对于传统的方法,该矢量化算法能够产生更好地效果:不丢失边缘和细节信息。
本文的算法还能够用于边缘提取。图9展现了一个例子,该幅图像中包含很明显的前景和背景的纹理,这每每致使边缘提取的失败。图9(b)和(c)使用不一样参数的额Canny边缘检测提取的边缘。很明显这样的边缘是不使人满意的。该方法能够先得到好的结构图像(d),而后再检测该结构图像的边缘获得(e)。图(6)说明了同样的道理。
因为源纹理和目标纹理的不兼容性,有时涂鸦图像,油画,和素描不能直接运用到图像融合中。图11和图12就是一个很好的例子。直接将图11(a)和图12(a)融入目标场景中获得图11(c)和图12(e),不难发现融合的图像很不天然。然而将纹理分离后的图11(b)和图12(b)融入相同场景获得的图11(d)和图12(d)却很天然。改组实验说明了本文算法能够很好运用到图像融合中。
4、编程实现
原文件提供了相关算法的matlab代码,能够从这里下载:http://www.cse.cuhk.edu.hk/~leojia/projects/texturesep/tsmoothing.zip
关于这个源代码,我看了好久的,有不少地方是和文章的公式不是彻底对应的,因此研究的时候仍是要有所注意。
通常来讲,matlab只适合于科研,若是想作成产品,须要用其余的好比C之类的实现该算法,对于这点,这个程序可能有点困难,主要的困难在于其中的解线性方程组。由于在本算法中,方程组的系数矩阵式一个很大的稀疏矩阵,有多大呢,好比若是图像时500*600的,那么这个矩阵的大小就是300000*300000,所以,直接的实现对于内存等方面确定不现实,必须研究稀疏矩阵的存储方式,另外,解方程所用的共轭梯度法也不是一会儿就能实现的。 目前个人C版本程序还在研究中。
五:说明
这种论文其实直接看英文的是最好的方式吗,博客中因为编辑、书写等方面的不便,有的时候就是随便表达下,文中有不少翻译和编辑的不当之处,请真正有性却的朋友下载后看英文。
因为原始论文的大小大于10MB,没法上传,敬请各位有兴趣的朋友在google搜索该论文。
特别致谢西西网友的大力支持。
*********************************做者: laviewpbt 时间: 2013.10.10 联系QQ: 33184777 转载请保留本行信息************************