视差图块匹配
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、WL
和 WR
的 SAD 之后,您需要 "slide" WR
到一个新的位置并且计算另一个 SAD。您想要找到具有最小 SAD 的 WL
和 WR
对 - 您可以将其视为最相似的 windows。也就是说,SAD最小的WL
和WR
是"matched"。当您拥有当前 WL
的最小 SAD 时,您将 "slide" WL
并重复。
根据匹配的 WL
和 WR
之间的距离计算差异。对于可视化,您可以将此距离缩放到 0-255
之间并将其输出到另一个图像。我在下面张贴了 3 张图片来向您展示这一点。
典型结果:
左图:
右图:
计算出的差异(来自左图):
您可以在此处获取测试图像:http://vision.middlebury.edu/stereo/data/scenes2003/
我正在编写一个使用块匹配的视差匹配算法,但我不确定如何在副图像中找到相应的像素值。
给定一个一定大小的正方形 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、WL
和 WR
的 SAD 之后,您需要 "slide" WR
到一个新的位置并且计算另一个 SAD。您想要找到具有最小 SAD 的 WL
和 WR
对 - 您可以将其视为最相似的 windows。也就是说,SAD最小的WL
和WR
是"matched"。当您拥有当前 WL
的最小 SAD 时,您将 "slide" WL
并重复。
根据匹配的 WL
和 WR
之间的距离计算差异。对于可视化,您可以将此距离缩放到 0-255
之间并将其输出到另一个图像。我在下面张贴了 3 张图片来向您展示这一点。
典型结果:
左图:
您可以在此处获取测试图像:http://vision.middlebury.edu/stereo/data/scenes2003/