基于总变差模型的纹理图像中图像主结构的提取方法

本篇博文来自博主Imageshop,打赏或想要查阅更多内容可以移步至Imageshop。

转载自:https://www.cnblogs.com/Imageshop/p/3365517.html  侵删

2019.12.16 日更正:本文最后有提及本算法不合适C语言实现,但是可在【算法随记六】一段Matlab版本的Total Variation(TV)去噪算法的C语言翻译 一文中找到替代算法。

      本文主要由Structure Extraction from Texture via Relative Total Variation一文中的内容翻译而来,作者又是香港中文大学的一批牛人。

      一:问题由来

      很多自然场景和人工艺术品都包含纹理。比如,墙上,火车和地铁表面上的涂鸦和图案。像地毯,毛衣,和其他一些精美的工艺品包含格式各样的几何图案。在人类历史中,马赛克被视为一种艺术形式,它可以表示人和动物这类复杂的场景,并可以用石头,玻璃,陶瓷和其他一些材料模仿油画。当用Google收索这些图像的时候,你可以很快的找到成千上万类似图片。下图展示了一些代表不同形式场景的实例。他们有一个共同的特征:图像中有意义的结构和纹理单元融合在一起。所以我们通常称这类图片为“结构+纹理”图片。一个很有意思的现象:在不去除纹理的前提下,人类的视觉感知系统完全有能力理解这些图像。从心里学角度分析,图像的整体结构特才是人类视觉感知的主要数据,而不是那些个体细节(纹理)。因此从图像中提取那些有意义的结构数据是一项具有意义的工作,同时对于计算机来说也是非常有挑战性的。

 

        二:算法描述

      在《Structure Extraction from Texture via Relative Total Variation》一文中提出了一种基于总变差形式新模型,该模型可以有效的分解图像中的结构信息和纹理,并且无需特别指定纹理是否规则或者对称。换言之,该方法具有一般性和随意性,它适用于非统一的或各向异性的纹理。下面介绍一下该方法。   

                 

上式为总变差模型, I代表输入图像,p代表2D图像像素的索引,S代表输出结构图像。其中可以写成如下各向异性的形式:

            

改进的模型如下

          

其中

       

       

    q为以p点为中心的一个正方形区域内所有的像素点的索引,g为高斯核函数:

    

     下图(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)却很自然。改组实验说明了本文算法可以很好运用到图像融合中。

     四、编程实现

      原文件提供了相关算法的matlab代码,可以从这里下载:http://www.cse.cuhk.edu.hk/~leojia/projects/texturesep/tsmoothing.zip

     关于这个源代码,我看了很久的,有很多地方是和文章的公式不是完全对应的,所以研究的时候还是要有所注意。

     一般来说,matlab只适合于科研,如果想做成产品,需要用其他的比如C之类的实现该算法,对于这点,这个程序可能有点困难,主要的困难在于其中的解线性方程组。因为在本算法中,方程组的系数矩阵式一个很大的稀疏矩阵,有多大呢,比如如果图像时500*600的,那么这个矩阵的大小就是300000*300000,因此,直接的实现对于内存等方面肯定不现实,必须研究稀疏矩阵的存储方式,另外,解方程所用的共轭梯度法也不是一下子就能实现的。 目前我的C版本程序还在研究中。

     五:说明

       这种论文其实直接看英文的是最好的方式吗,博客中由于编辑、书写等方面的不便,有的时候就是随便表达下,文中有很多翻译和编辑的不当之处,请真正有性却的朋友下载后看英文。

       由于原始论文的大小大于10MB,无法上传,敬请各位有兴趣的朋友在google搜索该论文。

       特别致谢西西网友的大力支持。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TV模型图像修复是一种基于全正则化的图像修复方法。全正则化是一种用于处理图像噪声和模糊的数学技术,它能够保持图像的边缘和细节信息,并有效降低噪声。 在Matlab,我们可以使用一些图像处理工具箱或自定义函数来实现TV模型图像修复。以下是一个简单的例子: 1. 导入图像:使用imread函数读取需要修复的图像,并将其转换为灰度图像。例如,img = imread('image.jpg')。 2. 添加噪声:可以使用imnoise函数向图像添加噪声,例如高斯噪声。例如,noisy_img = imnoise(img, 'gaussian', mean, variance)。 3. 图像修复:通过最小化全(TV)正则化项和数据项之和来实现图像修复。可以使用优化函数(如fmincon)或迭代算法(如梯度下降法)来求解最优化问题。下面是一个使用fmincon函数的例子: - 定义代价函数:编写一个代价函数,其输入为图像参数x,输出为代价值和梯度。代价值包括全项和数据项。 - 设置约束条件:设置量x的取值范围,例如x的取值范围为0到255。 - 调用fmincon函数:使用fmincon函数求解最小化问题,找到图像的最优解。例如,[x, fval] = fmincon(cost_function, x0, [], [], [], [], lb, ub)。 4. 重建图像:将优化后得到的图像参数x转换为图像矩阵,并显示修复后的图像。例如,reconstructed_img = reshape(x, size(img)),imshow(reconstructed_img)。 值得注意的是,TV模型图像修复是一个迭代过程,需要进行多次迭代以获得更好的修复效果。还可以根据具体情况调整算法的参数,如全惩罚参数和数据项权重,以获得更好的修复效果。 通过以上步骤,我们可以使用Matlab实现TV模型图像修复程序,提高图像质量并恢复遭受噪声或模糊的图像。 ### 回答2: TV模型图像修复是一种基于全正则化的图像修复方法。它通过在原始图像上加入全惩罚项来实现图像的平滑和去噪,从而恢复图像的缺失或损坏区域。 在Matlab实现TV模型图像修复,可以按照以下步骤进行: 1. 读取待修复的图像,可以使用imread函数读取图像文件。 2. 对图像进行预处理,可以进行灰度化、噪声去除等操作,以提高修复效果。 3. 定义图像修复问题的优化模型。TV模型图像修复的优化目标是最小化损失函数,其包括了图像数据项和全项。可以使用MATLAB的优化工具箱的函数来定义和求解优化问题。 4. 采用迭代算法进行图像修复。常用的迭代算法有梯度下降法、共轭梯度法等。迭代的过程,通过更新图像的像素值来实现图像修复。可以设置迭代次数或者收敛条件来控制算法的停止。 5. 保存修复后的图像,并进行结果评估。可以使用imshow函数显示修复后的图像,并计算评价指标如PSNR、SSIM等来评估修复效果。 在使用TV模型图像修复方法时,需要注意选择合适的正则化参数和迭代次数,以及合适的算法和优化策略。此外,图像预处理和后处理的方法也对修复结果有重要影响。 总之,通过在MATLAB环境下实现TV模型图像修复程序,我们可以有效地恢复损坏或缺失的图像区域,提供更好的图像质量和视觉效果。 ### 回答3: TV模型图像修复是一种常用的图像恢复方法,是基于全(Total Variation,TV)的图像恢复算法。在MATLAB,可以使用以下代码实现TV模型图像修复程序。 首先,加载待修复的图像,并将其转换为灰度图像: ```matlab image = imread('input_image.jpg'); image = rgb2gray(image); ``` 然后,使用TV模型来进行图像修复: ```matlab % 设置算法参数 max_iter = 1000; % 最大迭代次数 lambda = 0.01; % 模型参数 % 使用TV模型恢复图像 reconstructed_image = TV_image_restoration(image, max_iter, lambda); % 显示修复后的图像 imshow(reconstructed_image); ``` 在上述代码,TV_image_restoration是自定义的函数,用于执行TV模型图像修复。该函数的实现如下: ```matlab function result = TV_image_restoration(image, max_iter, lambda) [M, N] = size(image); u_old = double(image); u_new = double(zeros(M, N)); for iter = 1:max_iter Dx = diff(u_old, 1, 2); Dy = diff(u_old, 1, 1); Grad = sqrt(Dx.^2 + Dy.^2); % 求解子问题的闭式解 u_star = u_old + lambda * div(Dx./Grad, Dy./Grad); % 更新图像估计 u_new = u_star - lambda * div(Dx./Grad, Dy./Grad); % 停止准则:当两次迭代之间的异小于阈值时停止迭代 if norm(u_new - u_old, 'fro') < 1e-4 break; end u_old = u_new; end result = uint8(u_new); end function div_XY = div(X, Y) [M, N] = size(X); div_XY = zeros(M, N); dx = zeros(M, N); dy = zeros(M, N); dx(:,1:N-1) = diff(X, 1, 2); dy(1:M-1,:) = diff(Y, 1, 1); div_XY = dx + dy; end ``` 在上述代码,TV_image_restoration函数根据TV模型的迭代过程,逐步修复图像。div函数用于计算图像梯度的散度。 最后,通过imshow函数显示修复后的图像。修复后的图像将保存在量reconstructed_image。 这就是一个简单的TV模型图像修复的MATLAB程序。根据待修复的图像不同,可能需要调整算法的参数以获得最佳的修复效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值