目录

  • 前言
    • SAD 是一种简单高效的立体匹配算法,虽然由于精度等原因很少被实际应用,但可以帮助我们理解立体匹配过程
  • 一、SAD算法原理
    • SAD计算过程主要包括以下步骤:
  • 二、代码示例
    • 1.引入库
    • 2.设置窗口和最大视差
    • 3.读入左右图
    • 4.定义SAD类
    • 5.计算视差图
  • 总结

前言

SAD 是一种简单高效的立体匹配算法,虽然由于精度等原因很少被实际应用,但可以帮助我们理解立体匹配过程

一、SAD算法原理

Sum of Absolute Differences 即“绝对差之和”简称SAD。该算法通过比较立体图像对(一般为左右图)中的光照亮度差异来寻找匹配点对,进而计算视差。

SAD计算过程主要包括以下步骤:

  1. 选取窗口,窗口大小通常为3x3、5x5、7x7或者更大;
  2. 确定最大视差Dmax;
  3. 在左(右)图上以(x,y)为中心构建窗口,在右(左)图分别以(x,y-d)((x,y+d))
    ,d=0-Dmax构建窗口,并计算视差0-Dmax范围内的左右图窗口内像素亮度差异;
  4. 对窗口内的亮度差异求和,选取使绝对亮度差值之和最小的d作为(x,y)处的视差值。

二、代码示例

1.引入库

代码如下(示例):

import os
import time
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

2.设置窗口和最大视差

代码如下(示例):

window_size=5
Dmax=64

3.读入左右图

本文使用的图片来源于Middlebury数据集
代码如下:

#Read rectified stereo image pairs
os.chdir(r'此处为图片路径')
LeftRawImage = cv.imread("左图文件名")
RightRawImage = cv.imread("右图文件名")
#Convert to gray image
LeftRawImage = cv.cvtColor(LeftRawImage,cv.COLOR_BGR2GRAY)
RightRawImage = cv.cvtColor(RightRawImage,cv.COLOR_BGR2GRAY)

左图:
右图:


4.定义SAD类

代码如下,此代码对图片做了padding,保证输出视差图和原图具有相同分辨率:

class SAD():def __init__(self, Lraw, Rraw, window_size, Dmax):self.Lraw = Lrawself.Rraw = Rrawself.window_size = window_sizeself.Dmax = Dmaxself.ROWS = Lraw.shape[0]self.COLS = Lraw.shape[1]self.PADDING_SIZE = int((window_size-1)/2)#Calculate Absolute Differencesdef AD(self):AD_PADDING=np.zeros((self.ROWS,self.COLS,self.Dmax))AD_PADDING=np.pad(AD_PADDING,(self.PADDING_SIZE,self.PADDING_SIZE))Cost_SAD=np.zeros((self.ROWS,self.COLS,Dmax))for d in range(0,self.Dmax):for i in range(0,self.ROWS):for j in range(0,self.COLS):if(j - d >= 0):AD_PADDING[i+self.PADDING_SIZE,j+self.PADDING_SIZE,d]=np.abs(int(self.Lraw[i,j])-int(self.Rraw[i,j-d]))Cost_SAD[i,j,d] = np.sum(AD_PADDING[i:i+window_size,j:j+window_size,d])else:Cost_SAD[i,j,d]=0return Cost_SAD#Calculate the minimum indexdef argmin(self,Cost_volume):Disparity = np.zeros((self.ROWS,self.COLS),dtype=np.int8)for i in range(0,self.ROWS):for j in range(0,self.COLS):Cost_sad = Cost_volume[i,j,:]index_sort= np.argsort(Cost_sad)Disparity[i,j]=index_sort[0]return Disparity

5.计算视差图

代码如下:

#Calculate disparity
time_start = time.time()
SAD_Middleburry = SAD(LeftRawImage,RightRawImage,window_size, Dmax)
Cost_sad = SAD_Middleburry.AD()
Disparity_image = SAD_Middleburry.argmin(Cost_sad)
print("用时:",time.time() - time_start,"s")
plt.imshow(Disparity_image,cmap='plasma')
plt.show()
plt.imsave('./Disparity.png',  Disparity_image, cmap='plasma')

视差图:

总结

SAD算法虽然简单高效,但是容易受光照、曝光等噪声影响,视差图的效果往往不是特别鲁棒。

注:以上代码运行较慢,在作者的电脑上运行时间为325s左右,运行后请耐心等待。以后作者将不定时更新立体匹配算法的python代码,包括Census,AD-Census等,同时作者将学习相关加速方法,并对所写代码做出改进,以便高效运行。
作者并不精通python编程,如有错误,欢迎各位大佬不吝赐教!如有疑问,欢迎大家一起讨论!谢谢!

立体匹配算法-SAD相关推荐

  1. python立体匹配评价,sad立体匹配算法的Python实现,SAD,PYTHON

    SAD立体匹配算法的PYTHON实现 这是第一次发CSDN博客,因为在机器视觉的学习中CSDN帮助了我很多,那么我也应该为CSDN社区做一些贡献,所以本文将介绍我用python实现的SAD匹配算法. ...

  2. 基于深度学习算法和传统立体匹配算法的双目立体视觉

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...

  3. 立体匹配十大概念综述---立体匹配算法介绍

    from:https://blog.csdn.net/wintergeng/article/details/51049596 一.概念 立体匹配算法主要是通过建立一个能量代价函数,通过此能量代价函数最 ...

  4. 局部立体匹配算法介绍及代码实现

    作者I dulingwen@CSDN 编辑I 3D视觉开发者社区 01 什么是局部匹配算法?优势如何? 局部(Local)立体匹配是相对于半全局以及全局(Non-Local)立体匹配算法而言的,它不构 ...

  5. 双目立体匹配算法SGBM

    semi-global matching(SGM)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SG ...

  6. 双目立体匹配算法漫谈

    双目立体匹配算法漫谈 双目立体匹配算法漫谈 前提 一些基本假设 框架 matching cost computation cost (support) aggregation;代价聚合 双目立体匹配算 ...

  7. [双目视差] 立体匹配算法推理 - SGBM算法(一)

    文章目录 立体匹配算法推理 - SGBM算法(一) 一.SGBM与SGM的区别 二.代价计算 立体匹配算法推理 - SGBM算法(一) SGBM立体匹配算法,总体来讲包含以下6个步骤: Preproc ...

  8. 《一种新颖的自适应权重 Census变换立体匹配算法》(2016)

    摘要:针对当前 Census 变换立体匹配算法深度不连续区域匹配精度低的缺陷,提出了一种新颖的自适应权重的Census 变换立体匹配算法.在 Census 变换阶段计算变换窗口中心点上下左右四个像素的 ...

  9. 双目立体匹配算法:SGM

    一.简介   立体匹配旨在为校正后的左右视图提供稠密的匹配对,这种问题称为"stereo correspondence problem".有大量的算法用于求解立体匹配问题,根据Sc ...

最新文章

  1. AI闯入法律界,第一步是当律师的得力助手
  2. 一个封装的使用Apache HttpClient进行Http请求(GET、POST、PUT等)的类。
  3. 让思考成为一种习惯:一位软件工程专业学生的大学生涯规划
  4. 分享《组播技术白皮书》
  5. 未能加载文件或程序集或它的某一个依赖项_手写一个miniwebpack
  6. 利用python开发购物车系统
  7. linux vino vnc,Ubuntu下包含2种远程桌面的方式:VINO-Server以及VNC Server。 .
  8. 浙大PAT的大量感悟
  9. Atitit swt 4.3 4.4 4.5 新特性java attilax总结
  10. (翻译)UIP Application Block学习系列(三)UIP概念
  11. Verilog实现的格雷码与二进制码的互相转换
  12. 在Qt环境下进行人机交互界面设计--工具条
  13. 推荐:HP大中华区总裁孙振耀退休十五天后九大感言
  14. [软件更新]vidalia 0.2.0.32
  15. 安卓手机如何打开.crx文件_安卓手机打开.crx文件的方法
  16. 微商城分销系统开发方式需求与价格开发周期评估
  17. matlab生成随机数,matlab随机数生成方法
  18. 如何理解空洞卷积(dilated convolution)ID-CNN
  19. 深度学习概念——Epoch, Batch, Iteration
  20. 计算机组成原理mips描述,计算机组成原理与接口技术:基于MIPS架构/华中科技大学教学改革建设教材...

热门文章

  1. 馈线自动化终端(FTU)
  2. 苏州文正学院计算机专业,苏州大学文正学院公共计算机课程教学改革方案(试行)...
  3. 电脑上使用的便签纸电子版类型的软件可用什么软件?
  4. 想转行人工智能?机会来了!!!
  5. 贾樟柯监制X水井坊呈现,微电影《以桌·会友》
  6. Android 进阶14:源码解读 Android 消息机制( Message MessageQueue Handler Looper)
  7. 精力管理3—体能精力
  8. Gingko Framework:避免数据缓存
  9. 最新的Android版本是什么?
  10. win10电脑怎样扩大C盘空间