SAD立体匹配算法SW滑动窗口python程序

直入主题

window_half_size_SW=int(window_size_SW/2)
os.chdir(r'C:\Users\86198\Desktop\learn\AAAAAAAAAAAA相机程序\下载的双目图像')
lraw=np.asanyarray(Image.open(r"scene1.row3.col1.ppm"))
rraw=np.asanyarray(Image.open(r"scene1.row3.col3.ppm"))
limg= cv.cvtColor(lraw,cv.COLOR_BGR2GRAY)
rimg= cv.cvtColor(rraw,cv.COLOR_BGR2GRAY)
limg=np.asanyarray(limg,dtype=np.double)
rimg=np.asanyarray(rimg,dtype=np.double)
img_size=np.shape(limg)[0:2]
tic1=time.time()
imgDiff=np.zeros((img_size[0],img_size[1],maxDisparity))
e = np.zeros(img_size)
for i in range(0,maxDisparity):
    e[:,i:img_size[1]]=np.abs(rimg[:,0:(img_size[1]-i)]- limg[:,i:img_size[1]]) #视差为多少,那么生成的图像就会少多少像素列,e负责计算视差为i时,两张图整体的差距
    e2=np.zeros(img_size) #计算窗口内的和
    for x in range((window_size),(img_size[0]-window_size)):
        for y in range((window_size),(img_size[1]-window_size)):
            e2[x,y]=np.sum(e[(x-window_size):(x+window_size),(y-window_size):(y+window_size)])
            #其实相当于用111 111 111的卷积核去卷积,如果用tensorflow会不会更快一些,其实就是先做差再加和以及先加和再做差的关系
    imgDiff[:,:,i]=e2



errMap=np.ones((img_size[0],img_size[1],maxDisparity))*100000

# min_errorMap=np.zeros(img_size)


for i in range(maxDisparity):
    for x in range(window_half_size_SW+window_size,img_size[0]-window_half_size_SW-window_size):
        for y in range(window_half_size_SW+window_size,img_size[1]-window_half_size_SW-window_size):
            SW_err_list=[(x-1,x-1,x-1,x,x,x,x+1,x+1,x+1),(y-1,y,y+1,y-1,y,y+1,y-1,y,y+1),(i,i,i,i,i,i,i,i,i)]            
            min_test=np.min(imgDiff[SW_err_list])
            
            
            if imgDiff[x,y,i]>min_test:
                index_pre_minerr=np.argmin(imgDiff[SW_err_list])
                index_after_minerr= [SW_err_list[0][index_pre_minerr],SW_err_list[1][index_pre_minerr],SW_err_list[2][index_pre_minerr]]
                errMap[x,y,i]=imgDiff[      index_after_minerr[0],index_after_minerr[1],index_after_minerr[2]    ]
# errMap[:,:,0]=imgDiff[:,:,0]
# errMap[:,:,-1]=imgDiff[:,:,-1]
dispMap=np.zeros(img_size)      
for x in range(0,img_size[0]):
    for y in range(0,img_size[1]):
        val=np.sort(errMap[x,y,:])
        # min_errorMap[x,y]=val[0]
        # if min_errorMap[x,y]==0:
        #     min_errorMap[x,y]=100000
        val_id=np.argsort(errMap[x,y,:])
        dispMap[x,y]=val_id[0]/maxDisparity*255#其实dispmap计算的是视差的大小,如果视差大,那么就相当于两张图片中同样物品的位移大,就是距离
disp_fix= dispMap.copy()
            # disp_fix[x,y]=np.min([x-window_half_size_SW:x+window_half_size_SW,y-window_half_size_SW:y+window_half_size_SW])
# disp_fix= dispMap.copy()
# for x in range(window_half_size_SW,img_size[0]-window_half_size_SW):
#     for y in range(window_half_size_SW,img_size[1]-window_half_size_SW):
#         for i in range(-window_half_size_SW,window_half_size_SW+1):
#             for j in range(-window_half_size_SW,window_half_size_SW+1):
#                 if  min_errorMap[x,y]>min_errorMap[x+i,y+j]:
#                     min_errorMap[x,y]=min_errorMap[x+i,y+j]
#                     disp_fix[x,y]=dispMap[x+i,y+j]
plt.imshow(disp_fix)
plt.show()
dispMap=np.array(dispMap,dtype=np.uint8)
# bi_demo(dispMap)
print('用时:',time.time()-tic1)

运行效果

在这里插入图片描述

用时: 65.38784909248352

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
SAD立体匹配算法是一种基于局部窗口匹配的视差计算方法。它的基本思路是:对于左视图中的每个像素,在右视图中搜索匹配像素,以找到对应的视差值。具体实现步骤如下: 1. 对于左视图中的每个像素,在右视图中搜索与其匹配的像素。 2. 定义一个窗口,以左视图中的当前像素为中心,对应右视图中的搜索区域进行匹配。 3. 计算窗口内每个像素的灰度值之差的绝对值,并将这些值累加得到SAD(Sum of Absolute Differences)值。 4. 重复步骤2和3,以找到SAD值最小的匹配像素,并记录其视差值。 SAD立体匹配算法代码实现的关键就在于如何实现窗口匹配和SAD计算。下面是一份简单的SAD立体匹配算法代码供参考: ``` // 定义窗口大小 int winSize = 5; // 定义最大可搜索视差 int maxDis = 64; // 定义SAD值最小阈值 int SADThresh = 200; // 定义左右图像 Mat imgL, imgR; // 循环遍历左视图中的每个像素 for (int i = 0; i < imgL.rows; i++) { for (int j = 0; j < imgL.cols; j++) { int minSAD = INT_MAX; // 初始化最小SAD值为最大整数 int bestDis = 0; // 初始化最佳视差为0 // 循环遍历右视图中的搜索区域 for (int d = 0; d < maxDis; d++) { int SAD = 0; // 循环遍历窗口内的像素 for (int u = -winSize/2; u <= winSize/2; u++) { for (int v = -winSize/2; v <= winSize/2; v++) { // 计算左右像素之间的灰度值差异,并累加得到SAD值 int grayL = imgL.at<uchar>(i+u,j+v); int grayR = imgR.at<uchar>(i+u,j+v- grayR); } } // 如果当前SAD值小于最小SAD值,则更新最小SAD值和最佳视差 if (SAD < minSAD) { minSAD = SAD; bestDis = d; } } // 如果最小SAD值小于阈值,则认为找到了合适的匹配像素,并将对应的视差值存储到视差图像中 if (minSAD < SADThresh) { disp.at<uchar>(i,j) = bestDis; } } } ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值