tvreg 包应用总变差 (TV) 正则化 [25] 来执行图像去噪、去卷积和修复。支持三种不同的噪声模型:加性高斯白噪声(传统的 L2 数据保真度)、拉普拉斯噪声(L1 数据保真度)和泊松。解决了一般的图像修复问题。
TVREG图像恢复可以在MatLab中实现,具有以下功能。
在这三个函数中,f是输入图像,lambda是调节去噪强度的正参数,u是恢复图像。
图像f可以是用于灰度图像的M×N矩阵或更一般的M×N×P阵列,其中对于彩色图像通常P=3,但对于任意多通道图像P可以是任何正整数。应对图像f进行缩放,以使真正清洁图像的最大亮度范围从0到1。允许f具有[0,1]以外的值(噪波和模糊的影响可能会导致f超出此范围),但应对其进行缩放,以使恢复的图像在[0,1] (而不是[0,255])内。这种缩放对于泊松噪声模型尤其重要。
参数lambda是指定保真度权重的正值,其中较小的lambda意味着更强的去噪。可以通过将lambda设置为M×N矩阵来指定空间变化的保真度权重。
1.去噪函数 u=twdenoise(f,lambda)执行TV正则化去噪,其中f是噪声图像,并且lambda是如上所述控制去噪强度的参数。
2.反卷积函数 u=twdeconv(f,lambda,K)执行TV正则化反卷积,其中K应该是表示模糊运算K的脉冲响应的矩阵。解u,使得近似u=K∗f。
请注意,K的系数不会自动归一为1,也不是必需的。在MatLab中可以方便地将K归一化为K=K/sum(K(:))。
3.修复函数 u=tvinaint(f,lambda,D)执行TV正则化修复,其中D应该是指定修复域的M×N逻辑阵列。D为TRUE的像素被认为是未知的,并被内插(内绘)。对D为假的像素进行去噪处理。要内嵌域D但保持D外部的像素大致不变,请将lambda设置为一个较大的值。
由于修复实际上是空间变化的保真度权重的特例,因此可以使用带有参数**twdenoise(f,lambda*(∼D))**的twdenoise来执行修复。
4.其他参数 默认情况下使用高斯噪波模型。噪声模型可以指定为
其中,model是不区分大小写的字符串,等于‘Gauss’(或‘L2’)、‘Laplace’(或‘L1’)或‘Poisson’。此外,容差和最大迭代次数指定为
这些选项不会改变最小化问题,只会改变算法的精度。
可以为这些函数中的任何一个提供另外两个参数:(…,Model,Tol,Maxiter,plotFun,u0)。参数plotFun是一个绘图回调函数,用于定制解决方案进度的显示。参数u0是解的初始猜测,其大小应该与输入图像相同。默认情况下,u0=f用作初始猜测。更好的初始猜测可能允许在较少的迭代中找到解决方案。
对于绘图回调,plotFun是函数或函数句柄的名称。绘制图像的一个例子:
或者,plot函数可以返回标量值来指示计算是否应该继续。返回非零值表示继续计算,返回零值表示停止。
利用Chanvese功能,可以在MatLab中实现Chan-Vese两相分割。
Chanvese函数有许多可选参数,这些参数可以作为附加参数传递,也可以作为选项结构传递。
phi=chanvese(f,phi0,opt)分割图像f,其中phi0是初始水平集函数,opt是包含以下参数的全部或任何子集的结构:
不幸的是,实现的停止条件并不总是有效的,如果进化很慢,它会被愚弄而过早停止,而在其他情况下,直到最大迭代限制才停止。要覆盖停止条件,请将opt.tol设置为0,并使用opt.Maxiter指定固定的迭代次数。
phi=chanvese(f,phi0,tol,Maxiter,u,nu,lambda1,lambda2,dt,plotun)是替代语法。传递空set[]或省略参数将指定缺省值。例如,
或者,plot函数可以返回标量值,以告知是否应该继续执行chanvese。返回非零值表示chanvese继续,返回零值表示停止。
拉普拉斯算子||.||p表示Ω上的Lp范数。变量x将用来表示二维空间中的一个点。
tvreg 中的图像恢复方法基于 Rudin-Osher-Fatemi [25] 全变差 (TV) 去噪技术,例如参见 Chan 和 Shen 的书 [11]。 TV-regularized 去噪、去模糊和修复的一般模型是找到一个图像 u 最小化
其中积分在二维有界集 Ω ⊂ R2 和 |∇u(x)| 上表示 u 在 x ∈ R2 处的梯度幅度。函数 f 是给定的噪声和模糊损坏图像,K 是模糊算子,λ(x) 是指定正则化强度的非负函数,F 确定数据保真度的类型:
这种通用模型可用于执行图像去噪、反卷积和修复作为特殊情况。为简单起见,通常将 λ(x) 指定为正常数,λ(x) ≡ λ。对于修复问题,其中 f 在区域 D ⊂ Ω 上被认为是未知的,保真度为
其中 C > 0 是一个常数参数。
换句话说,TV 正则化策略是搜索所有可能的函数,所以找到一个使 (1) 最小化的函数 u : Ω → R。在离散设置中,最小化在 u 的每个像素中具有一维自由度。因此,即使对于 256 × 256 像素的图像,最小化也超过 256 × 256 = 65 536 个维度。最小化的搜索范围确实非常广阔。
技术说明:梯度幅度 |∇u|实际上应该在分配意义上进行解释;允许具有跳跃不连续性的函数 u。图像的总变化是随机测量
上确界在所有连续可微的向量场 ~g 上,支持紧凑地包含在 Ω 中,并且有界幅值 |~g(x)| ≤ 1. 当 u 平滑时,$|u|_{TV} $=
灰度恢复的理论特性
算法 有许多算法可以解决 TV 最小化问题,尤其是使用高斯噪声模型去噪或修复。仅举几例,有半隐式梯度下降 [30]、离散 TV 滤波器 [7]、Chambolle 对偶算法 [4]、具有定点延续的 FTVd 分裂 [34]、图像分割 [5] 和哈尔框架收缩[27]。
tvreg 使用 split-Bregman 方法 [17],这要归功于它的操作符拆分,可以使用模块化方法来解决问题。这就是使 tvreg 能够解决如此广泛的电视规范化问题的原因。此外,split-Bregman 具有最先进的竞争效率和可靠性。我并不认为 tvreg/split-Bregman 是最好的方法。上面列出的其他方法各有其优点,而且图像最小化算法仍然是一个活跃的研究领域。
Chan-Vese 分割模型 [8] 找到了一个局部最小值
其中 C 是一条闭合曲线,c1 和 c2 是 C 内部和外部的平均值。权重 µ、ν、λ1、λ2 分别控制曲线长度、面积以及 C 内部和外部拟合的惩罚。 Chan-Vese 模型是 Mumford-Shah 分割模型的简化 [23]。
通过关系 C = {x : ϕ(x) = 0}(参见第 2.2 节),用水平集函数 ϕ 表示 C 来解决这个问题。通过定义 Heaviside 函数和 Dirac 测度,
曲线的长度和封闭面积可以表示为
这允许根据水平集函数重写最小化,
正如 [8] 中所开发的,问题是找到一个局部最优的 φ,这可以通过在 φ 上演化 PDE 直到达到稳定状态来完成。分割是从生成的 φ 的符号中获得的,即 {x : φ(x) > 0} 和 {x : φ(x) < 0}。
TV 正则化是一种灵活的技术。在过去的二十年里,它导致了图像去噪、去模糊、修复和各种其他应用的成功方法。它的优势在于完善的理论理解和许多快速算法。
最近有一些特定应用的作品超越了图像正则化。这份清单并不详尽,只是推荐阅读的一些亮点。
关于 Chan-Vese 分割,其优势在于其简单性。基于思想和水平集的方法可以扩展到例如基于纹理线索的分割[26]、嵌套分割曲线[13]和多相分割[20]。 Chan-Vese 的一项改进是在 Sobolev 梯度而不是 L2 梯度下最小化,从而得到具有更好稳定性的 PDE [19, 29]。
仅提及其他几项工作,加权聚合分割 (SWA) [28] 是一种使用多尺度方法的灵活方法,Boykov 和 Jolly 提出了一种使用图割 [1] 的交互式分割方法。另见 Unnikrishnan 等人。 [33],它开发了一种对分割方法进行客观评估的方法。
有效解决 TV 正则化最小化的方法是一个正在进行的研究课题。这个包中的实现使用了 Goldstein 和 Osher [17] 最近的拆分Bregman 方法。在撰写本文时,拆分 Bregman 是最快的 TV 最小化方法之一,它是少数几个能够灵活地以统一方法处理所有问题参数和噪声模型的方法之一。
拆分 Bregman 方法通过算子拆分然后应用 Bregman 迭代解决拆分问题来解决最小化问题。对于(1),分裂问题是
乍一看,分裂问题似乎与原来的(1)没有什么不同。关键是目标的两项已被拆分:第一项 仅直接取决于 d~ ,而第二项仅取决于 z。当然,d~ 和 z 仍然是通过约束 d~ = ∇u, z = Ku 间接相关的。
Bregman迭代用于解决分裂问题。在每次迭代中,Bregman 迭代都要求解决以下问题:
其中附加项是执行约束的二次惩罚,~ b1 和 b2 是与 Bregman 迭代算法相关的变量。
(2) 的解,在 d~, z, u 上联合最小化,近似为一次交替最小化一个变量,即固定 z 和 u 并最小化 d~,然后固定 d~ 和 u 并最小化在 z 上,依此类推。这导致三个可变子问题。
d~子问题 变量z和u是固定的,子问题是
它的解在 x 上解并且以封闭形式已知:
这是求解图像最小化的关键子问题。
z 子问题 变量 d~ 和 u 是固定的,子问题是
该解决方案在 x 上解。最优 z 满足
我们为每个噪声模型 F 求解这个方程的 z。
在 λ(x) = 0 的特殊情况下(即,当问题具有修复域并且 x 在未知区域中时),解决方案简化为
u 子问题 变量 d~ 和 z 是固定的,子问题是
对于去噪和修复,K 是恒等式,最优 u 满足
这是一个稀疏的、对称的正定线性系统。解 u 可以通过 Gauss-Seidel 迭代有效地逼近。
对于一般 K,最优 u 满足
其中 K∗ 是 K 的伴随。最优性方程是对称正定的,例如可以通过预处理共轭梯度来求解。在 Ku 是卷积的特殊情况下,Ku := φ ∗ u,方程在傅立叶域中得到有效求解:
其中 ^ 表示傅里叶变换,· 是逐点乘法。为避免边界伪影,应首先将图像沿每个维度及其对称扩展加倍。
如果 φ 在两个维度上都是对称的,则可以使用离散余弦 (DCT) 变换更有效地完成计算。正如 Martucci [22] 开发的,具有对称边界处理的卷积可以如下完成
其中 C1e 和 C2e 是相同周期长度的 DCT-I 和 DCT-II 变换。这样,数据就不需要填充了;变换隐含了对称边界。还要注意变换后的数据是真实的,DCT 的内存成本比傅里叶变换低几倍。因此,如果 φ 在每个维度上都是偶数,则获得 u 的计算有效策略是
在 tvreg 中,测试了 φ 的对称性,以便在可能的情况下可以使用 DCT 代替傅立叶。
完整算法 最小化 (1) 通过以下迭代求解:
算法-4 |
---|
初始化u = z = b2 = 0, d~ = ~ b1 = 0 |
while “not converged” “未收敛” |
Solve the u subproblem |
Solve the u subproblem |
Solve the z subproblem |
在解决子问题时,第 x 个子问题的解决方案是根据所有其他变量的当前值计算的,并覆盖变量 x 的先前值。例如,可以通过测试与前一次迭代的最大差异来检查收敛性:。
简化算法 使用高斯噪声模型$ F(z, f) = 1/2 (z − f)^2 $可以稍微简化问题。在这种情况下,z 辅助变量是不必要的,将问题简化为
通过这种简化,只有两个可变子问题。 d~ 子问题与前面相同。 u 子问题是
最优方程是
根据 K,最优方程可以在傅立叶域中求解或通过迭代矩阵技术求解。拆分 Bregman 算法与前面的 (4) 相同,但没有步骤“解决 z 子问题”和 b 2 : = b 2 + K u − z b_2 := b_2 + Ku - z b2:=b2+Ku−z。
实现细节 在实现中,变量和被用来代替~b1,b2。主要计算例程是 TvRestore,它运行 Bregman 迭代并调用解决可变子问题的子例程。下图说明了主循环。
et/2022/07/23/QaLHBkMbIlmP837.png" alt=“image-20220713194836398” style=“zoom:80%;” />被用来代替~b1,b2。主要计算例程是 TvRestore,它运行 Bregman 迭代并调用解决可变子问题的子例程。下图说明了主循环。