视差图块匹配

Disparity Map Block Matching

我正在编写一个使用块匹配的视差匹配算法,但我不确定如何在副图像中找到相应的像素值。

给定一个一定大小的正方形 window,有哪些技术可以找到相应的像素?我是否需要使用特征匹配算法或是否有更简单的方法,例如对像素值求和并确定它们是否在某个阈值内,或者可能将像素值转换为二进制字符串,其中值大于或小于中心像素?

我假设您正在谈论立体视差,在这种情况下,您可能希望在阅读更多内容之前使用简单的 Sum of Absolute Differences (read that wiki article before you continue here). You should also read this tutorial by Chris McCormick

旁注: SAD 不是唯一的方法,但它确实很常见,应该可以解决您的问题。

你已经有了正确的想法。制作 windows,移动 windows,对像素求和,找到最小值。所以我会给你我认为可能有帮助的东西:

开始:

如果您有彩色图像,首先您需要将它们转换为黑白图像。在 python 中,您可以对每个像素使用这样的简单函数,其中 x 是包含 RGB 的像素。

def rgb_to_bw(x):
    return int(x[0]*0.299 + x[1]*0.587 + x[2]*0.114)

您会希望它是黑白的,以使 SAD 更易于计算机处理。如果您想知道为什么不从中丢失重要信息,您可能有兴趣了解 Bayer Filter 是什么。 Bayer Filter,通常是 RGGB,也解释了像素的红色、绿色和蓝色部分的倍增比率。

计算 SAD:

您已经提到您有一个 window 的大小,这正是您想要做的。假设这个 window 的大小是 n x n。您还会在左图 WL 中有一些 window,在右图 WR 中也有一些 window。这个想法是找到具有最小 SAD 的货币对。

因此,对于 window (x,y) 中某个位置的每个左侧 window 像素 pl,您将获得右侧差异的绝对值 window 像素 pr 也位于 (x,y)。您还需要一些 运行 值,这是这些绝对差异的总和。在 sudo 代码中:

SAD = 0
from x = 0 to n:
   from y = 0 to n:
       SAD = SAD + absolute_value|pl - pr|

在计算出这对 windows、WLWR 的 SAD 之后,您需要 "slide" WR 到一个新的位置并且计算另一个 SAD。您想要找到具有最小 SAD 的 WLWR 对 - 您可以将其视为最相似的 windows。也就是说,SAD最小的WLWR是"matched"。当您拥有当前 WL 的最小 SAD 时,您将 "slide" WL 并重复。

根据匹配的 WLWR 之间的距离计算差异。对于可视化,您可以将此距离缩放到 0-255 之间并将其输出到另一个图像。我在下面张贴了 3 张图片来向您展示这一点。

典型结果:

左图: 右图: 计算出的差异(来自左图):

您可以在此处获取测试图像:http://vision.middlebury.edu/stereo/data/scenes2003/