抠图应用程序设计(二)——磁性套索工具Livewire算法的实现

简介

​ LiveWire是一种图像分割技术,允许用户使用相对少的鼠标点击次数快速准确地选择感兴趣区域,其实现过程可分为以下两个部分:

  1. 使用滤波算法过滤并转换成灰度
  2. 使用Dijkstra算法应用到修改后的图像,从用户分别点击的两个点中找寻出最佳路径

​ 在 LiveWire 算法中, 待分割二维图像被视作有向加权图 G, 像素被视为 G 中的节 点, 连接相邻节点的视为边。由此可以定义代价函数作为边的权值, 即:

C o s t ( p , q ) = ω C f c ( p ) + ω LoG  f LoG  ( p ) + ω G f G ( p ) + ω G D f G D ( p , q ) Cost(p, q)=\omega_{C} f_{c}(p)+\omega_{\text {LoG }} f_{\text {LoG }}(p)+\omega_{G} f_{G}(p)+\omega_{G D} f_{G D}(p, q) Cost(p,q)=ωCfc(p)+ωLoG fLoG (p)+ωGfG(p)+ωGDfGD(p,q)

​ 其中 q \mathrm{q} q 为像素 p \mathrm{p} p 的邻域像素; f c f_{c} fc 为基于 Canny 算子的函数, f LoG  f_{\text {LoG }} fLoG  为基于 L o G L o G LoG 算子的 函数; f G f_{G} fG f G D f_{G D} fGD 分别为梯度算子的强度和方向函数; ω C 、 ω L o G 、 ω G \omega_{C} 、 \omega_{L o G} 、 \omega_{G} ωCωLoGωG ω G D \omega_{G D} ωGD 为上述算子的 对应权值。

Dijkstra算法

​ Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,可以解决有向图中的最短路径问题,从起始点开始,采用贪心算法的策略,每次遍历到起始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

算法原理

  1. 首先, 引入一个辅助数组 D D D, 它的每个元素 D [ i ] D[i] D[i] 表示当前所找到的从起始点 v v v (即源 点 v v v ) 到其他每个顶点 v i v_{i} vi 的长度。
  2. 设置 D D D 的初始状态

若从 v v v v i v_{i} vi 存在连接边, 则 D [ i ] D[i] D[i] 为弧上的权值, 否则置 D [ i ] D[i] D[i] ∞ \infty

  1. 找到从源点 v v v 到下一个顶点的最短路径长度所对应的顶点, 且这条最短路径长度仅 次于从源点 v v v 到顶点 v j v_{j} vj 的最短路径长度
  2. 假设 S \mathrm{S} S 为已求得的从源点 v v v 出发的最短路径长度的顶点的集合, 则可证明: 下一条 次最短路径 (设其终点为 x x x ), 要么是弧 ( v , x ) (v, x) (v,x), 或者是从源点 v v v 出发的中间只经过 S \mathrm{S} S 中的 顶点而最后到达顶点 x x x​ 的路径。

实现步骤

  1. 初始时令 S = V 0 , T = V − S = { S=V 0, T=V-S=\{ S=V0,T=VS={ 其余顶点 } , T \}, T },T 中顶点对应的距离值, 若存在, d ( V 0 , V i ) d(V 0, V i) d(V0,Vi) 为弧上的权值, 若不存在, d (   V 0 , V i ) d(\mathrm{~V} 0, \mathrm{Vi}) d( V0,Vi) ∞ \infty
  2. T \mathrm{T} T 中选取一个与 S \mathrm{S} S 中顶点有关联边且权值最小的顶点 W \mathrm{W} W, 加入到 S \mathrm{S} S
  3. 对其余 T T T 中顶点的距离值进行修改: 若加进 W W W 作中间顶点, 从 V 0 V 0 V0 V i V i Vi 的距离值缩短, 则修改此距离, 重复上述步骤 2 、 3 2 、 3 23, 直到 S S S 中包含所有顶点, 即 W = V i W=V i W=Vi​ 为止。

效果

​ 点击鼠标左键可以人工确定轮廓点,LiveWire算法会在用户定义的点与当前鼠标所在像素点进行路径生成。其中,蓝色路径表示已经生成的轮廓,绿色路径表示待确定的轮廓。

​ 用户完成轮廓选定。

​ 最终抠图效果:

源码下载

基于opencv和qt的多功能抠图应用

参考

Live-wire revisited

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rosen.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值