這是第一次發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...