图像拼接、匹配检索与序列处理技术详解
1. 图像拼接与正射影像
在图像拼接过程中,曝光情况是一个关键因素。若图像拍摄时曝光相同,拼接块的边缘将不可见;若曝光不同,则需要分析两组重叠像素,以确定平均强度偏移和比例因子,用于在拼接前校正拼接块,这一过程被称为色调匹配。
此外,还需考虑图像中不在地平面上的点的影响,例如高楼大厦上的点。从正上方拍摄的图像只会显示建筑物的屋顶,而从远处拍摄的图像则是能看到建筑物侧面的斜视图。在拼接图像时,我们希望营造出从正上方观察图像中每个点的错觉,因此不应看到任何建筑物的侧面。这种类型的图像被称为正射影像,与透视视图不同,正射影像中的光线是平行的,意味着观察点在无穷远处。在合成图像的每个像素处,我们可以从任何重叠的拼接块中选择一个像素。为了最佳地近似正射影像,我们应选择最接近正上方的像素,即在变形之前最接近主点的像素。
在摄影测量中,这种不使用显式控制点(即图像中手动识别的对应特征)的拼接方式被称为无控制数字拼接,其结果是得到一个观察点在无穷远处的正射影像。完整代码可在示例目录中的
mosaic1
中找到。相关原理也可应用于图像稳定问题,通过单应性矩阵将新图像中的特征映射到前一图像中的位置。
2. 图像匹配与检索
给定一组图像 ${I_j, j = 1 \cdots N}$ 和一张新图像 $I’$,图像匹配问题就是要确定 $j$,使得 $I’$ 和 $I_j$ 最为相似。考虑到视角和曝光变化的影响,这是一个具有挑战性的问题。之前使用的像素级相似度度量方法(如 SSD 或 ZNCC)并不适用于此问题,因为视角的微小变化就可能导致相似度几乎为零。
图像匹配可用于机器人判断是否曾访问过特定地点或见过相同物体。若之前的图像包含一些语义数据(如物体名称或地点名称),那么通过推理,这些语义数据也适用于新图像。例如,如果一张新图像与带有“大厅”语义标签的现有图像匹配,那么意味着机器人正在看到相同的场景,因此它处于或接近大厅。
这里介绍的“词袋”技术在过去几年的机器人领域中变得非常流行,它基于之前介绍的 SURF 点特征和 k-means 聚类技术。具体操作步骤如下:
1.
加载图像并计算 SURF 特征
:
images = iread('campus/*.jpg', 'mono');
sf = isurf(images);
sf
是一个 MATLAB 单元数组,其元素是对应输入图像的 SURF 特征向量。例如,
sf{1}
是与序列中第一张图像对应的 663 个 SURF 特征对象的向量。所有图像的 SURF 特征集合可通过以下代码获取:
sf = [sf{:}]
此时
sf
是一个包含 17945 个 SURF 特征对象的向量。
2.
查看特定 SURF 特征
:
sf(380)
可以看到该特征的属性,如质心、尺度和方向等。
image_id
属性表明该特征是从原始图像序列的第一张图像中提取的。我们可以显示该图像并叠加该特征:
idisp(images(:,:,1))
sf(380).plot('g+')
sf(380).plot_scale('g', 'clock')
该特征的支持区域可通过以下代码显示:
sf(380).support(images)
-
进行 k-means 聚类
:
将每个 SURF 特征描述符视为 64 维空间中的一个点,相似的描述符会形成聚类,这是一个 k-means 问题。为了找到 2000 个特征聚类,可使用以下代码:
bag = BagOfWords(sf, 2000)
这将返回一个
BagOfWords
对象,其中包含原始特征、每个聚类的中心以及其他各种信息。每个聚类被称为一个视觉词,由一个 64 元素的 SURF 描述符描述。所有视觉词的集合(这里是 2000 个)构成一个视觉词汇表。
4.
为每个 SURF 特征分配视觉词索引
:
bag.words(380)
可以看到 k-means 聚类将该图像特征分配给了词汇表中的第 1057 个视觉词。该视觉词在图像集中出现的次数可通过以下代码查看:
bag.occurrence(1057)
它至少在以下图像中出现过一次:
bag.contains(1057)
我们可以显示该视觉词的一些不同实例:
bag.exemplars(1057, images)
- 统计视觉词的频率 :
[word,f] = bag.wordfreq()
word
是包含所有唯一视觉词的向量,
f
是它们对应的频率。我们可以按频率降序显示这些视觉词:
bar( sort(f, 'descend') )
出现频率非常高的视觉词对区分图像的意义不大,类似于文本检索中的停用词。我们可以从词袋中移除这些视觉停用词:
bag.remove_stop(50)
这将移除与 50 个最频繁出现的视觉词相关的 1850 个特征。
6.
描述图像并计算相似度
:
我们的视觉词汇表包含 $K$ 个视觉词(这里 $K = 1950$),我们可以用一个 $K$ 元素的向量来描述每个图像,该向量的元素描述了对应视觉词在图像中的频率。加权词频向量是
BagOfWords
对象的一个属性,可通过以下代码访问:
M = bag.wordvector;
两个图像之间的相似度是它们对应词频向量之间夹角的余弦值,可通过
similarity
方法实现。为了计算两组词袋中图像之间的相互相似度,可使用以下代码:
S = bag.similarity(bag)
这将返回一个 20×20 的相似度矩阵,其中元素 $S(i,j)$ 表示第 $i$ 列和第 $j$ 列(即图像 $i$ 和图像 $j$)之间的相似度。该相似度矩阵可以通过以下代码可视化:
idisp(S, 'bar')
考虑图像 11,它与其他图像的相似度可通过相似度矩阵的第 11 行(或列)获得:
s = S(:,11);
[z,k] = sort(s, 'descend');
[z k]
可以看到图像 11 与自身的相似度为 1,按相似度降序排列的其他图像依次为 9、13、10 等。
现在假设有一些新图像,我们希望确定它们与之前图像中最相似的图像。步骤与上述类似:
images2 = iread('campus/holdout/*.jpg', 'mono');
sf2 = isurf(images2)
bag2 = BagOfWords(sf2, bag)
S2 = bag.similarity(bag2);
[z,i] = max(S2)
通过这些步骤,我们可以找到每个新图像在原始图像序列中最相似的图像。
3. 图像序列处理
在处理图像序列时,我们可以使用相关工具包。以下是具体的操作步骤:
1.
加载图像序列
:
im = iread('bridge-l/*.png', 'roi', [20 750; 20 480]);
'roi'
选项用于选择每个图像中的感兴趣区域,以消除不规则的黑色边框。这些图像的像素为 16 位,由于序列已经接近 200 Mbyte,为避免内存需求增加四倍,我们不将其转换为双精度。
2.
显示图像序列动画
:
ianimate(im, 'fps', 10);
以每秒 10 帧的速度显示图像序列动画。
3.
计算角点特征
:
c = icorner(im, 'nfeat', 200, 'patch', 7);
这里使用了 Harris 角点,因为它们的计算成本较低。对于此应用,帧与帧之间的方向和尺度变化较小,Harris 角点特征非常适合。该函数返回一个单元数组,每个元素是每个输入图像中 200 个最强 Harris 角点特征的向量。
'patch'
选项指定了一个 15×15 的局部邻域描述符,是一个 225 元素的单位向量。我们可以显示叠加了特征的图像序列动画:
ianimate(im, c, 'fps', 10);
特征与高梯度区域(如树木边缘、标志和汽车的角点)相关联。观察动画可以发现,角点特征在许多帧中可靠地附着在世界点上。图像中特征的运动被称为光流,它是相机在世界中的运动和世界三维结构的函数。
4.
跟踪特征
:
使用
Tracker
类来维护特征的运动轨迹:
t = Tracker(im, c);
对于每个新帧,每个轨迹会在其前一帧位置的指定半径内找到一个特征子集,将这些特征的描述符与轨迹在前一帧的特征描述符进行比较,如果找到匹配,则更新轨迹。未被轨迹认领的特征被视为新轨迹的起点,会在表中创建一个新条目并分配一个唯一的轨迹标识符。如果轨迹在当前帧中未找到匹配特征,则计数器会递增,当计数器超过某个阈值时,轨迹将被移除。
轨迹的描述符在每个时间步都会更新,这样即使支持区域的外观在帧与帧之间发生变化,我们也总是将新特征与被跟踪特征的最新外观进行比较。轨迹数据作为类的属性存储,特征轨迹可以通过以下代码显示为单独的线条:
t.plot()
可以看到特征从图像中心向外的运动,特征似乎扩展的点被称为扩展中心。在双相机对极几何中,第二个相机位于第一个相机的前方,因此对极点将靠近图像的中间,对极线都通过该点。对应点必须位于对极线上,因此会沿着这些辐射线移动,且移动量与世界点的深度成反比。
可以使用以下代码查看每个特征被跟踪的帧数分布:
ihist( t.tracklengths(), 'normcdf' )
大多数特征的跟踪帧数较短,平均为 14 帧,但最长可达 140 帧。
总结
本文详细介绍了图像拼接、匹配检索和序列处理的相关技术,包括色调匹配、正射影像生成、词袋技术进行图像匹配以及图像序列中的特征跟踪等内容,并给出了具体的代码实现和操作步骤。这些技术在机器人视觉、摄影测量等领域具有广泛的应用前景。
相关流程图
graph TD;
A[加载图像] --> B[计算SURF特征];
B --> C[k-means聚类];
C --> D[分配视觉词索引];
D --> E[统计视觉词频率];
E --> F[移除停用词];
F --> G[描述图像并计算相似度];
表格:图像匹配与检索步骤总结
| 步骤 | 操作 | 代码示例 |
|---|---|---|
| 加载图像 | 加载一组图像和新图像 |
images = iread('campus/*.jpg', 'mono'); images2 = iread('campus/holdout/*.jpg', 'mono');
|
| 计算特征 | 计算图像的SURF特征 |
sf = isurf(images); sf2 = isurf(images2);
|
| 聚类 | 进行k-means聚类 |
bag = BagOfWords(sf, 2000); bag2 = BagOfWords(sf2, bag);
|
| 分配索引 | 为特征分配视觉词索引 |
bag.words(380);
|
| 统计频率 | 统计视觉词频率 |
[word,f] = bag.wordfreq();
|
| 移除停用词 | 从词袋中移除停用词 |
bag.remove_stop(50);
|
| 计算相似度 | 计算图像之间的相似度 |
S = bag.similarity(bag); S2 = bag.similarity(bag2);
|
| 查找匹配 | 找到新图像最相似的图像 |
[z,i] = max(S2);
|
列表:图像序列处理步骤
- 加载图像序列并选择感兴趣区域。
- 显示图像序列动画。
- 计算每个帧的角点特征。
-
使用
Tracker类跟踪特征。 - 显示特征轨迹并分析跟踪帧数分布。
图像拼接、匹配检索与序列处理技术详解
4. 技术要点总结与对比
为了更清晰地理解图像拼接、匹配检索和序列处理这三项技术,下面对它们的关键要点进行总结和对比。
| 技术类型 | 关键要点 | 应用场景 | 主要操作步骤 |
|---|---|---|---|
| 图像拼接 |
- 考虑曝光情况进行色调匹配
- 生成正射影像,避免看到建筑物侧面 - 不使用显式控制点的无控制数字拼接 | 摄影测量、创建全景图像等 |
1. 分析重叠像素确定平均强度偏移和比例因子进行色调匹配
2. 选择最接近正上方的像素近似正射影像 3. 利用单应性矩阵解决图像稳定问题 |
| 图像匹配与检索 |
- 基于“词袋”技术,结合 SURF 点特征和 k - means 聚类
- 考虑视角和曝光变化对匹配的影响 - 用视觉词频率向量描述图像并计算相似度 | 机器人导航、图像数据库检索等 |
1. 加载图像并计算 SURF 特征
2. 进行 k - means 聚类得到视觉词汇表 3. 为特征分配视觉词索引 4. 统计视觉词频率并移除停用词 5. 计算图像之间的相似度并查找匹配图像 |
| 图像序列处理 |
- 使用 Harris 角点计算特征,成本较低
- 利用 Tracker 类跟踪特征运动轨迹 - 分析特征的光流和跟踪帧数分布 | 自动驾驶、视频监控等 |
1. 加载图像序列并选择感兴趣区域
2. 显示图像序列动画 3. 计算每个帧的角点特征 4. 使用 Tracker 类跟踪特征 5. 显示特征轨迹并分析跟踪帧数分布 |
通过这个表格,我们可以直观地看到三种技术在不同方面的差异和特点,有助于在实际应用中根据具体需求选择合适的技术。
5. 技术应用拓展
这些图像相关技术在实际应用中有着广泛的拓展空间。
在机器人领域 :图像匹配与检索技术可以帮助机器人更好地识别环境和物体。例如,在室内导航中,机器人可以通过拍摄周围环境的图像,与预先存储的地图图像进行匹配,从而确定自己的位置。图像序列处理技术可以用于机器人对动态环境的感知,通过分析图像序列中特征的运动,机器人可以判断周围物体的运动状态,从而做出相应的决策。
在摄影测量领域 :图像拼接技术可以用于创建高精度的正射影像地图。通过将多个拍摄的图像进行拼接和处理,可以得到覆盖大面积区域的正射影像,为地理信息系统(GIS)提供准确的数据。同时,图像匹配技术可以帮助在不同时间拍摄的图像中找到对应点,用于监测地形变化等。
在视频处理领域 :图像序列处理技术可以用于视频的稳定化和目标跟踪。通过跟踪视频中特征点的运动,可以对视频进行校正,减少抖动,提高视频的质量。同时,准确的目标跟踪可以用于视频编辑、安防监控等方面。
6. 技术挑战与解决方案
虽然这些图像技术有着广泛的应用前景,但也面临着一些挑战。
视角和光照变化问题 :在图像匹配和拼接过程中,视角和光照的变化会导致图像之间的相似度降低,影响匹配和拼接的效果。解决方案可以是采用更鲁棒的特征提取算法,如 SURF 特征在一定程度上对光照和旋转具有不变性。同时,在图像预处理阶段,可以进行光照归一化等操作,减少光照变化的影响。
计算资源消耗问题 :特别是在处理大规模图像序列或进行复杂的聚类操作时,计算资源的消耗会成为一个瓶颈。可以采用并行计算的方法,利用多核处理器或 GPU 加速计算过程。另外,优化算法的复杂度,减少不必要的计算步骤,也是提高效率的有效途径。
特征跟踪的稳定性问题 :在图像序列处理中,特征跟踪可能会因为目标的遮挡、快速运动等原因而丢失。可以采用多特征融合的方法,结合不同类型的特征进行跟踪,提高跟踪的稳定性。同时,引入预测模型,对特征的运动进行预测,在特征暂时丢失时可以根据预测结果进行恢复。
7. 未来发展趋势
随着计算机技术和人工智能的不断发展,这些图像技术也将呈现出一些新的发展趋势。
深度学习的融合 :深度学习在图像领域已经取得了显著的成果,将深度学习模型与现有的图像技术相结合,可以进一步提高图像匹配、拼接和序列处理的性能。例如,使用卷积神经网络(CNN)进行特征提取,能够学习到更高级的图像特征,提高匹配的准确性。
实时处理能力的提升 :在实际应用中,如自动驾驶、实时监控等场景,对图像技术的实时处理能力提出了更高的要求。未来的研究将致力于优化算法和硬件架构,实现更高效的实时处理。
多模态数据融合 :除了图像数据,还可以结合其他模态的数据,如激光雷达数据、深度数据等,进行更全面的场景感知和分析。多模态数据的融合将为图像技术带来更广阔的应用前景。
相关流程图
graph TD;
A[图像技术应用场景] --> B[机器人领域]
A --> C[摄影测量领域]
A --> D[视频处理领域]
B --> B1[环境识别与导航]
B --> B2[物体识别与跟踪]
C --> C1[正射影像地图创建]
C --> C2[地形变化监测]
D --> D1[视频稳定化]
D --> D2[目标跟踪与编辑]
表格:技术挑战与解决方案对比
| 挑战问题 | 解决方案 |
|---|---|
| 视角和光照变化 |
- 采用鲁棒的特征提取算法(如 SURF)
- 进行光照归一化预处理 |
| 计算资源消耗 |
- 并行计算(多核处理器或 GPU)
- 优化算法复杂度 |
| 特征跟踪稳定性 |
- 多特征融合跟踪
- 引入预测模型 |
列表:未来发展趋势要点
- 深度学习与现有图像技术融合。
- 提升实时处理能力。
- 实现多模态数据融合。
综上所述,图像拼接、匹配检索和序列处理技术在多个领域有着重要的应用价值,虽然面临一些挑战,但随着技术的不断发展,它们将不断完善和拓展,为我们带来更多的便利和创新应用。
超级会员免费看
27万+

被折叠的 条评论
为什么被折叠?



