计算机视觉 特征检测与匹配 轮廓跟踪

        第一个在图像中定位此类边界曲线的方法是主动轮廓模型, 也叫snakes,是一种能量最小化的二维样条曲线,它向图像特征(如强边缘)发展(移动)。第二个叫智能剪刀(Intelligent-Scissors),允许用户实时绘制紧贴对象边界的曲线(在很多图像软件里面都有,比如gimp,它与套索有一些相似)。最后是水平集(level set)技术,将曲线演变为特征函数的零集,这使它们能够轻松更改拓扑结构并结合基于区域的统计信息。

一、snakes

1、简述

        在计算机视觉中,轮廓模型描述了图像中形状的边界。特别是snakes旨在解决边界的近似形状已知的问题。作为可变形模型,snakes可以适应立体匹配和运动跟踪中的差异和噪声。

        Snakes 是一维能量最小化样条的二维推广。

        下面空心方块表示城市,由直线段连接的封闭方块为旅游点。 蓝色圆圈表示每个城市的吸引力的大致程度,随着时间的推移而降低。 在弹性网络的贝叶斯解释下,蓝色圆圈对应于从某个未知旅游点生成每个城市的圆形高斯的一个标准差。

         因为常规snakes有缩小的趋势,所以通常最好通过将snakes绘制到要跟踪的感兴趣对象之外来初始化它们。也可以用深度神经网络代替能量最小化的变分进化方程以显着提高性能。

        原始snakes还有一些变体,比如下面,有兴趣可以自行搜索相关资料看看。

        Elastic nets and slippery springs

        Splines and shape priors

        Dynamic snakes and CONDENSATION

2、示例

import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contour


img = data.astronaut()
img = rgb2gray(img)

s = np.linspace(0, 2*np.pi, 400)
r = 100 + 100*np.sin(s)
c = 220 + 100*np.cos(s)
init = np.array([r, c]).T

snake = active_contour(gaussian(img, 3, preserve_range=False),
                       init, alpha=0.015, beta=10, gamma=0.001)

fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(img, cmap=plt.cm.gray)
ax.plot(init[:, 1], init[:, 0], '--r', lw=3)
ax.plot(snake[:, 1], snake[:, 0], '-b', lw=3)
ax.set_xticks([]), ax.set_yticks([])
ax.axis([0, img.shape[1], img.shape[0], 0])

plt.show()

我们围绕宇航员的脸初始化一个圆圈,并使用默认边界条件boundary_condition='periodic'来拟合闭合曲线。

二、Scissors

        活动轮廓允许用户粗略地指定感兴趣的边界,并让系统将轮廓向更准确的位置演进,并随着时间的推移对其进行跟踪。 然而,这种曲线演变的结果可能是不可预测的,并且可能需要额外的基于用户的提示来实现所需的结果。

        另一种方法是让系统在用户绘制时实时优化轮廓。 Mortensenand Barrett (1995) 开发的智能剪刀系统就是这样做的。当用户画出一个粗略的轮廓(下图a中的白色曲线)时,系统计算并绘制出一条更好的曲线,它紧贴高对比度(橙色曲线)。

(a)当鼠标沿着白色路径移动时,剪刀沿着对象边界沿着橙色路径(绿色曲线显示中间位置) (b) 普通剪刀有时会跳到更强(不正确)的边界; (c) 在对前一段进行训练后,首选相似的边缘轮廓。

        为了计算最佳曲线路径(火线),首先对图像进行预处理,以将低成本与可能是边界元素的边缘(相邻水平、垂直和对角线之间的链接,即 N8 个邻居)关联起来。他们的系统使用过零、梯度幅度和梯度方向的组合来计算这些成本。

        接下来,当用户追踪一条粗略的曲线时,系统会使用 Dijkstra 算法(一种在当前目标位置终止的广度优先动态规划算法)不断地重新计算起始种子点和当前鼠标位置之间的最低成本路径。

        为了防止系统出现不可预知的跳跃,系统会在一段时间不活动后“冻结”当前的曲线(重置种子点)。为了防止火线跳到相邻的高对比度轮廓上,系统还“学习”了当前优化曲线下的强度分布,并使用它来优先保持导线沿着相同(或外观相似)的边界移动(上图C)。

        Mortensen 和 Barrett (1999) 使用了一种简单的分水岭区域分割形式,将图像预分割成区域边界成为优化曲线路径的候选者。生成的区域边界变成了一个小得多的图,其中节点位于三个或四个区域相遇的任何地方。然后在这个简化图上运行 Dijkstra 算法,从而获得更快(通常更稳定)的性能。 智能剪刀的另一个扩展是使用考虑边界当前轨迹的概率框架,发展出来一个称为 JetStream 的系统。

三、Level Set

        基于f (s)形式的参数曲线(例如snakes、Bsnakes 和 CONDENSATION)的活动轮廓的一个限制是随着曲线的发展而改变其拓扑结构具有挑战性。 此外,如果形状发生剧烈变化,可能还需要对曲线进行重新参数化。

        这种闭合轮廓的另一种表示是使用水平集,其中特征(或有符号距离)函数的过零定义曲线。水平集演变为通过以下方式拟合和跟踪感兴趣的对象修改底层嵌入函数(此 2D 函数的另一个名称)(x, y)而不是曲线f(s)。 为了减少所需的计算量,每一步只需要更新当前过零位置周围的一小条带(边界),就是所谓的快速行进方法。

        演化方程的一个例子是由Caselles等人在1997提出的测地线活动轮廓。

        其中 g(I) 是蛇边势的广义版本。 为了直观地了解曲线的行为,假设嵌入函数是远离曲线的有符号距离函数(下图),在这种情况下。上面等式中的第一项移动曲线在 它的曲率方向,即,它起到拉直曲线的作用,在调制函数 g(I) 的影响下。 第二项将曲线向下移动 g(I) 的梯度,促使曲线向 g(I) 的最小值移动。

测地线活动轮廓的水平集演化。 嵌入函数基于由边缘/速度函数 g(I) 调制的底层表面的曲率以及 g(I) 的梯度进行更新,从而将其吸引到强边缘。

        虽然这种水平集公式可以很容易地改变拓扑结构,但它仍然容易受到局部最小值的影响,因为它基于局部测量,例如图像梯度。 另一种方法是在分割框架中重新投射问题,其中能量测量分割区域内外的图像统计数据(例如颜色、纹理、运动)的一致性。这些方法建立在Leclerc (1989)、Mumford 和 Shah (1989) 以及 Chan 和 Vese (2001) 引入的早期基于能量的分割框架之上。

四、小结

        活动轮廓可用于各种对象跟踪应用程序。 例如,它们可用于跟踪性能驱动动画的面部特征。 它们还可用于跟踪头部和人,以及移动的车辆。 其他应用包括医学图像分割,其中轮廓可以在计算机断层扫描(Cootes 和 Taylor2001)中逐层跟踪,或者随着时间的推移,如在超声扫描中。

        一个更接近计算机动画和视觉效果的有趣应用是 rotoscoping,它使用跟踪的轮廓来变形一组手绘动画(或修改或替换原始视频帧)。Agarwala,Hertzmann 等人(2004) 提出了一个基于跟踪在选定关键帧绘制的手绘 B 样条轮廓的系统,使用几何和基于外观的标准的组合(下图)。

基于关键帧的 rotoscoping (a) 原始帧; (b) 旋转轮廓; (c) 重新着色的衬衫; (d) rotoscoped手绘动画。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/124767341