2

我一直在编写一段代码来创建视差图。

我不想使用 OpenCV 来加载/保存将它们转换为灰度的图像。

到目前为止,我已经设法实现了这个网站中解释的算法。我正在使用使用绝对差和 (SAD) 的算法版本。为了测试我的实现,我使用了来自这个数据集的立体图像。

这是我的代码:

import cv2
import numpy as np

# Load the stereo images
img = cv2.imread('bow-view1.png')
img2 = cv2.imread('bow-view5.png')
# convert stereo images to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# get the size of the images
# l -> lines
# c -> columns
# v -> channel (RGB)
l,c,v = img.shape

# initialize arrays
minSAD = np.ones((l,c)) * 1000
sad = np.ones((l,c))
winsad = np.ones((l,c))
disp = np.zeros((l,c))

max_shift = 30

# set size of the SAD window
w_l = 2
w_c = 2

for shift in range(max_shift):
    print("New Shift: %d"%(shift))
    for u in range(0,l):
        for v in range(0,c):
            # calculate SAD
            if(u+shift < l):
                sad[u,v] = np.abs((int(gray[u,v]) - int(gray2[u+shift,v])))
            sum_sad = 0
            for d in range(w_l):
                for e in range(w_c):
                    if(u+d < l and v+e < c):
                        sum_sad +=  sad[u+d,v+e]

            winsad[u,v] = sum_sad
            # Save disparity
            if(sad[u,v] < minSAD[u,v]):
                minSAD[u,v] = winsad[u,v]
                disp[u,v] = shift

print("Process Complete")
# write disparity map to image  
cv2.imwrite('outputHT/disparity/sad.png',disp)
print("Disparity Map Generated")

这是该代码生成的输出: 代码生成的视差图。

我应该得到一个类似(或非常接近)的输出: 在此处输入图像描述

我尝试了几种窗口大小(在 SAD 步骤中),但我不断得到像这样的结果或全黑的图像。

任何帮助我找出问题或至少为我指明正确方向的答案将不胜感激!

4

1 回答 1

0

您在这里缺少的一件事是disp数组中的所有值都在 0 到 30 之间,对应于黑色像素,因此为了将这些值映射到 0 到 255 之间,您必须将移位乘以 8。

于 2017-08-30T06:45:19.513 回答