SAD立體匹配演算法的PYTHON實現

2021-10-02 16:38:24 字數 3622 閱讀 5026

這是第一次發csdn部落格,因為在機器視覺的學習中csdn幫助了我很多,那麼我也應該為csdn社群做一些貢獻,所以本文將介紹我用python實現的sad匹配演算法。

sad演算法是立體匹配演算法中,隸屬於區域性區域匹配演算法中的乙個演算法,原理是從左圖中找出乙個小視窗,利用極線約束,在 ** 右圖中同一行中間隔d為d_1處找到同樣大小的乙個小視窗,比方說都是 9*9 大小, 然後比較這個小視窗中每乙個畫素灰度差是多少,比如說灰度差為x_1,接著更換間隔d為d_2**,再次計算灰度差x_2,比較灰度差最小的即為右圖中的用一位置。

比如左圖有一本書,演算法可以找到這本書在右圖的哪個位置,然後計算這本書在左圖和右圖中的位置差了多少,就可以計算出距離了

原理我就不多說了,已經有很多演算法解釋類的博文了,本文專注於演算法實現

import os

import time

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

from numba import jit

from pil import image

maxdisparity=

25#最大視差

window_size=

5#滑動視窗大小

#-------------------------------

'''這一部分是讀取,請輸入已經極線校準過的左圖和右圖,本演算法不支援未校準影象的匹配'''

#------------------------------

)lraw=np.asanyarray(image.

open

(r"scene1.row3.col1.ppm"))

rraw=np.asanyarray(image.

open

(r"scene1.row3.col3.ppm"))

# os.chdir(r'c:\users\86198\desktop\l')

# lraw=cv.imread('zed_image0l.png')

# os.chdir(r'c:\users\86198\desktop\r')

# rraw=cv.imread('zed_image0r.png')

#-------------------------------

'''這一部分是轉換彩色影象為灰度影象,並且轉為double格式'''

#------------------------------

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]plt.imshow(limg)

plt.show(

)plt.imshow(rimg)

plt.show(

)#-------------------------------

'''這一部分是加速後的sad演算法,具體做法是先計算右圖按照視差由0到maxdisparity減去左圖所得的矩陣'''

#------------------------------

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=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]

=e2dispmap=np.zeros(img_size)

#-------------------------------

'''這一部分整找到使灰度差最小的視差,並繪圖'''

#------------------------------

for x in

range(0

,img_size[0]

):for y in

range(0

,img_size[1]

):val=np.sort(imgdiff[x,y,:]

)if np.

abs(val[0]

-val[1]

)>10:

val_id=np.argsort(imgdiff[x,y,:]

) dispmap[x,y]

=val_id[0]

/maxdisparity*

255#其實dispmap計算的是視差的大小,如果視差大,那麼就相當於兩張中同樣物品的位移大,就是距離近

print

('用時:'

左相機

右相機

深度圖(視差圖)

1.閱讀更多相關文獻,找到比sad效果更好的區域性匹配演算法

目前已經完成了sad的進化版本,sad滑動視窗版本

匹配率更高,生成深度圖更平滑,以及魯棒性和sad互補的census代價函式

2.做更多有意義的**實現

SAD立體匹配詳解

1.概念 sad sum of absolute differences 是一種影象匹配演算法。基本思想 差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速 但並不精確,通常用於多級處理的初步篩選。2.步驟 1 構造乙個小視窗,類似...

立體匹配SAD演算法matlab實現

sad sum of absolute differences 是一種影象匹配演算法。用公式表示為 sad u,v sum選擇最小值。基本思想 差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速 但並不精確,通常用於多級處理的初步篩...

Census立體匹配演算法演算法的Python實現

census作為立體匹配的代價函式之一,不論是區域性立體匹配還是全域性立體匹配都有很重要的作用,今天直入主題,直接給出 並解釋一下 的實現,具體原理有很多優秀的博文已經貼出來了,本文不再贅述 import os import time import cv2 as cv import numpy as...