• 泊松抠图论文复现


    泊松抠图论文复现

    简介

    Poisson Matting论文,主要目标是从用户给定的Trimap,也就是指定的背景,前景和未知区域抠出前景。主要采用的Poisson 方程的方法。

    这篇文章的抠图效果非常精细,但是实现出来的效果却不太尽如人意,但是由于本文只实现了Global Phase部分,所以可能并没有完全发挥这篇论文的全部实力。

    项目github链接

    形式化问题

    给定一张图片 I ( x , y ) I(x,y) I(x,y),我们希望还原出一个遮罩(matte) α \alpha α和前景图片,背景图片,使得

    I = α F + ( 1 − α ) B (1) I=\alpha F + (1-\alpha)B \tag{1} I=αF+(1α)B(1)

    (这个方程省略了 ( x , y ) (x,y) (x,y),下述的所有方程都是如此,而不是矩阵的意思)

    当然有一些确定为Foreground和Background的区域,我们称这两个区域为 Ω F , Ω B \Omega_F,\Omega_B ΩF,ΩB,我们真正希望计算的是位置区域 Ω \Omega Ω α \alpha α

    我们定义外边界为 ∂ Ω = { p ∈ Ω F ∪ Ω B ∣ N ( p ) ∩ Ω ≠ ∅ } \partial \Omega = \{p\in \Omega_F\cup \Omega_B|N(p)\cap \Omega \neq \empty\} Ω={pΩFΩBN(p)Ω=}

    其中 N ( p ) N(p) N(p)为p的四邻域。

    泊松方程

    我们先对方程(1)求导

    ∇ I = α ∇ F + ∇ α F + − ∇ α B + ( 1 − α ) ∇ B ∇ I = ∇ α ( F − B ) + α ∇ F + ( 1 − α ) ∇ B (2) \nabla I=\alpha \nabla F + \nabla \alpha F + -\nabla \alpha B + (1-\alpha)\nabla B \\ \nabla I=\nabla \alpha(F-B)+\alpha \nabla F+(1-\alpha)\nabla B \tag{2} I=αF+αF+αB+(1α)BI=α(FB)+αF+(1α)B(2)

    接下来有一个很重要的近似,我们假设自然图片是平滑的,所以 α ∇ F + ( 1 − α ) ∇ B \alpha \nabla F+(1-\alpha)\nabla B αF+(1α)B是相对较小的,所以在global过程中就假设他们是0,因此得到

    ∇ α = ∇ I F − B (3) \nabla \alpha=\frac{\nabla I}{F-B}\tag{3} α=FBI(3)

    因此最终,我们得到了最终的优化目标

    α ∗ = arg min ⁡ α ∬ p ∈ Ω ∣ ∣ ∇ α p − ∇ I p F p − B p ∣ ∣ 2 d p (4) \alpha^*=\argmin_\alpha \iint_{p\in\Omega}|| \nabla \alpha_p-\frac{\nabla I_p}{F_p-B_p}||^2dp \tag{4} α=αargminpΩ∣∣∇αpFpBpIp2dp(4)

    在已知 F , B F,B F,B的情况下。

    当然我们有迪利克雷边界

    α ^ p ∣ ∂ Ω = { 1 p ∈ Ω F 0 p ∈ Ω B (5) \hat \alpha_p|_{\partial \Omega} =

    {1pΩF0pΩB" role="presentation">{1pΩF0pΩB
    \tag{5} α^pΩ={10pΩFpΩB(5)

    全局解方法

    形式化了问题之后,我们可以相关的泊松方程,得到如下的公式

    Δ α = d i v ( ∇ I F − B ) = Δ I ( F − B ) − ∇ I ⋅ ( ∇ F − ∇ B ) ( F − B ) 2 (6) \Delta\alpha=div(\frac{\nabla I}{F-B}) \\ =\frac{\Delta I(F-B)-\nabla I \cdot (\nabla F-\nabla B)}{(F-B)^2}\tag{6} Δα=div(FBI)=(FB)2ΔI(FB)I(FB)(6)

    我们现在就是希望解这个泊松方程。

    细化问题

    一个问题的雏形已经出现,但是还有很多细节需要讨论

    1. 彩色图三通道,怎么解泊松方程?
    • 原文通过合并为灰色通道解决
    1. 泊松方程通过什么来解?
    • 可以直接通过Eigen库解离散形式的泊松方程。

    • 但是注意到事实上这个方程式有限制条件的 0 ≤ α ≤ 1 0\leq \alpha\leq 1 0α1

    • 采取高斯迭代更为平滑

    1. F-B=0的情况?
    • 原文并未提及,实际处理两种方式:把F-B看成一个特别小的数,或者直接令 Δ α = 0 \Delta \alpha=0 Δα=0,实现起来发现效果差不多
    1. 上述讨论都是在F和B确定的情况下讨论的,但事实上并不知道F和B,怎么做?
    • 通过已知边界估算F和B,然后计算 α \alpha α,再反过来用 α \alpha α更新边界,如此迭代

    主算法

    在这里插入图片描述

    备注:第三步骤的约等于是通过设置阈值来实现的,只有灰度差不超过阈值的图像才可以被添加。迭代终止条件是没有新的点加入F和B

    代码实现方法

    • 使用ANN库,把所有边界点插入kd-tree来寻找最近点估计F,B

    • α \alpha α的计算分为Eigen库解方程计算和Gauss迭代计算两种方法

    实现结果

    原图:

    在这里插入图片描述

    暴力解方程:

    在这里插入图片描述

    高斯解方程:
    在这里插入图片描述

  • 相关阅读:
    IDEA中的“Deployment“ 将项目直接部署到服务器上
    机器学习强基计划7-1:无监督学习常用性能指标与距离度量总结
    Pytorch 自己搭建的一个神经网络
    【C语言进阶(11)】动态内存管理
    Geode安装管理指南
    SpringCloud 微服务全栈体系(十四)
    Notepad2 v4.22.11r4478 开源轻量级文本编辑软件
    密码学与网络安全:量子计算的威胁与解决方案
    04-学成在线之系统管理服务模块之查询数据字典表中的内容,前后端联调测试
    【STM32】定时器与PWM的LED控制
  • 原文地址:https://blog.csdn.net/lvzelong2014/article/details/127744020