匹配两个图 Matlab实战
让我们尝试实现一种非常简单的方法来匹配来自两个图像带的相应区域。首先,回忆一下查找最佳匹配问题。给定一个图像贴片和一个贴片,您的任务是找到贴片在贴片中的最佳x位置。您可以自由使用这个参考实现,也可以使用自己的实现。
现在,您的任务是匹配两个条贴片。您将获得两个条贴片,左条贴片和右条贴片,以及块大小为b的贴片。
请注意,您只考虑完整的、不重叠的块。这意味着如果你的贴片是640宽,而块大小是100,那么你只有6个整块。这些条带的最后40列没有使用。返回视差值向量,每个块对应一个视差值。all right。下面是一些用于测试的代码。
我们使用与以前相同的一对花卉图像,
并从每个图像中提取一个条带。
上面这个是左边的图,下面这个是右边的图。现在我们应该能够通过传入两个带和块大小来调用函数。
那么,如何解决这个问题呢? 我们先算出方块的个数。因为我们只对整块感兴趣,所以我们使用 floor函数 来舍入。
okay,现在将视差初始化为行向量。
对于每个块,我们计算左边缘的 x 坐标。注意 MATLAB 和Octave从1 开始索引。
使用此方法从左侧条带中提取图像贴片。
现在在右边的条带中找到最匹配的说明。
最后,将视差计算为左右图像中的展示之间的差异。
okay? 让我们运行。
六个视差值,如预期,但是它们没有多大意义,不是吗? 我们试着画出它们。
Okay,那么第一个block位置上的0是什么意思呢?
它只是说,对于左边图像中的块的最佳匹配是在右边图像中的相同位置找到的。
那么2号位置的峰值呢?
这说明第二个方块移动了很多。你可以直观地验证一下。
查看左侧条带中的此特征及其在右侧条带中的位置。不同的区块移动的数量显然不同。
现在,这些视差值如何与场景的深度相关?想一下这种简单方法的缺点是什么。
立体效果
我们已经看了一下以简单方式完成的匹配(Correspondence)。事实上,简单时尚是你们作业中要做的,我想看几个稍微复杂一点的方法,它们更接近立体视觉的艺术状态。
有几种方法可以做到这一点。有一堆立体对它们都有已知的深度地面真值。这是筑波大学的一个众所周知的场景(如图),右边的图像是实际的深度。这些东西可以以多种方式产生。你使用激光扫描仪。另一种非常精确的匹配方法。但这个想法是,如果你在开发一个立体算法或者你在写一篇论文什么的,你有一个场景,你可以说,我知道实际值应该是多少。
我之前展示给你们的方法类型,是基于窗口的匹配,在左边我们有基于窗口匹配的最佳结果(如图1)。右边是基本事实。这里我们用的是假彩色图像。这样更容易看到错误。如果一切都只是灰色值和差异,那么就很难看到事情发生了怎样的变化。你会注意到它做得很好。你知道,模特的头在其他东西前面,但它的边缘确实很糟糕。后面的这个摄像机,哎呀,颜色太糟糕了,后面的这个摄像机差不多都被吃光了(如图2),别管这里发生了什么(如图3)。所以它有一些一般的困难,我们想做的是看看我们是否能更接近基本的真相解决方案。
1
2
3
所以更好的解决方案不仅仅是单个匹配估计,all right? 本质上他们想做的是,他们想优化视差分配的集合,在某种意义上,是连带的,也就是说,我不只是把这个像素分配到某个地方,然后这个像素是独立的。我想把所有的分配放在一起考虑,想出一个最优解。
这可以用两种不同的方法,至少两种不同的方法。一种是一次做一个扫描线。所以我们还是一次画一条线。但对于这一行的所有像素,我们要考虑的是我们要怎么做分配。然后我们对每个扫描线都这样做。然后是更现代的方法,那些得到更多改进的方法,它们实际上是在一个完整的二维网格上完成的。所以我们不只是在扫描线上思考,而是在垂直方向上思考。
我们来讨论一下扫描线方法。这是Kuva大学的图片,我们有两个强度分布图,左边和右边,all right? 为了精确起见,这里有一个一维信号,这里也有一个一维信号(如图2),我们必须将这里的每个像素与这里的某个像素匹配(如图3),all right? 但是我们想要找到的是我们想要找到最好的整体匹配,也就是所有的匹配,我们想要最好的集合(如图4)。
1
2
3
4
有编过程的人的代码,比那些无知的人使用的软件更有价值。