你好!
我正在尝试学习手动实现立体匹配算法。我基本上从最基础的算法开始——绝对差异。
我在网上找到了一些幻灯片,描述了如何进行操作。从我的理解来看,我应该计算左图像中的像素与右图像中“移位”一定距离/视差的同一像素之间的差异。然后,在这些视差中,我选择最小值,这对我来说是有意义的,因为具有最低视差的像素意味着它很可能是左图像中相同的像素。
我已经在MATLAB中创建了原型。以下是代码:
im_left = imread('tsu_left.png');
im_right = imread('tsu_right.png');
height = size(im_left, 1);
width = size(im_left, 2);
disparity_max = 16;
ad_costs = zeros(height, width,disparity_max);
for disparity = 1:disparity_max
for row = 1:height
for col = 1:width
%Left to right matching
col_disp = col - disparity;
if col_disp < 1
ad_costs(row, col, disparity) = 0;
else
%Average RGB
left_pixel = (im_left(row, col, 1) + im_left(row, col, 2) + im_left(row, col, 3))/3;
right_pixel = (im_right(row, col_disp, 1) + im_right(row, col_disp, 2) + im_right(row, col_disp, 3))/3;
%Subtract averages
ad_costs(row, col, disparity) = abs(left_pixel - right_pixel);
end
end
end
end
min_costs = zeros(height, width);
for disparity = 1:disparity_max
for row = 1:height
for col = 1:width
%The minimum disparity is chosen
min_costs(row, col) = min(ad_costs(row, col, :));
end
end
end
请注意,我还没有实现在某个窗口中求和差异,导致了绝对差值之和。我只是按每个像素、每个视差的差异取值。我在网上找到的讲义说应该像这样(最右边的图片):https://dl.dropboxusercontent.com/u/92715312/lec.PNG。
然而,使用imshow(min_costs)生成的代码结果看起来像这样:https://dl.dropboxusercontent.com/u/92715312/res.PNG。
我无法弄清楚为什么输出结果如此不同。是否有一些微不足道的步骤我漏掉了,或者我的算法理解有误?我也使用tsukuba图像。