如何在Matlab中跟踪图像序列中具有变形的对象

时间:2015-05-12 10:07:32

标签: image matlab detection matching

我目前正在尝试在Matlab中创建一个程序来检测图像中的对象,并在一系列图像中跟踪它。

在匹配算法中,我尝试比较对象的面积,周长和长轴长度。当对象在跟踪时间内保持相同的形状(它可以移动或旋转)时,这种方法有效。但是,我的目标是在卫星图像上使用这个程序,我想跟踪冰。问题是浮冰不能保持完全相同的形状。我有一些变形。

你有什么建议可以采用不同的方法做到这一点,这对变形是不变的吗?

在我当前的程序中,我加载每个图像并使它们成为二进制。然后,为了找到每个图像中每个对象的属性,我在图像的二进制表示上运行此代码:

% Find object properties
[clust,numb] = bwlabel(image, 8);
area = regionprops(clust,'Area');
s = regionprops(clust, {'Centroid'});
measurements = regionprops(clust,'MajorAxisLength','MinorAxisLength');
theta = regionprops(clust,'orientation');
perimeter = regionprops(clust,'Perimeter');

% Store centroids in matrix
centroids = zeros(numb,2);
for n=1:numb
    centroids(n,1)=s(n).Centroid(1);
    centroids(n,2)=s(n).Centroid(2);
end

% Store other properties in matrix (Order: area, majoraxis, minoraxis,
% orientation, perimeter)
properties = zeros(numb, 6);
for m=1:numb
    properties(m,1)=area(m).Area;
    properties(m,2)=measurements(m).MajorAxisLength;
    properties(m,3)=measurements(m).MinorAxisLength;
    properties(m,4)=theta(m).Orientation;
    properties(m,5)=perimeter(m).Perimeter;
end

然后我在比较图像中的对象时使用存储的属性。

我的示例图片是:

Test images

在处理它们后看起来像这样(使用二进制文件删除所有对象,除了我想要跟踪的对象):

Processed images

很抱歉使用拼贴而不是原始图片。我没有足够的声誉来发布所有图片。

1 个答案:

答案 0 :(得分:2)

如果您对相关系统有一些先验知识,那么这样的问题通常只能处理。你必须从你的领域知识中挖掘出来(除非有icefloes.stackoverflow.com),但我们可以制定一个天真的一阶方法,以便了解如何使用它来开发跟踪算法。

因此,让我们说变形是渐进的,并且块的运动是连续的。在这种情况下,您可以在一帧中提取给定冰块的形状,并将其用作下一帧中局部空间区域中相关性搜索的核心。您的结果将为您提供新位置的质心,然后您可以使用它来提取新形状以与下一帧相关联。逐渐变形将导致不完美的相关性,但每次迭代使用新形状应该允许您继续跟踪。

如果变形不是渐进的怎么办?也许块可以保持相同的形状,然后突然切成两个(似乎很可能)。然后你可以通过它保持相同形状的帧来跟踪块,但是当块切割时(我猜这种情况发生在小于帧间隔的时间尺度上),跟踪将会中断。但是如果你已经将块的轨迹存储在前n帧中,你可以推断出路径,然后在预期的位置查找新的块。

如果你正在跟踪多个区块,它们都应该遵循大致相似的轨迹 - 我认为海洋中适当的当前向量 - 你也许也可以使用这些轨迹进行空间插值以查看裂缝块最终的位置。 / p>

你的问题不同于一些类似的成像问题,因为这些块不会消失(我认为,如果不是这样的话,道歉)所以你知道你的块在某个地方,即使它是碎片。如果您可以识别多种跟踪它们的方法,那么执行所有这些方法并对结果进行投票 - 这可能会非常有效,尤其是当您有两个或更多个不正常的结果时。