census作為立體匹配的代價函式之一,不論是區域性立體匹配還是全域性立體匹配都有很重要的作用,今天直入主題,直接給出**並解釋一下**的實現,具體原理有很多優秀的博文已經貼出來了,本文不再贅述
import os
import time
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from numba import jit
maxdisparity=
12#最大視差,也就是搜尋範圍,搜尋範圍越大耗時越長
window_size=
5#滑動視窗大小,視窗越大匹配成功難度越高
same=np.int64(window_size/2)
#視窗大小的一半向下取整,比如用來衡量視窗左上角與視窗中點的距離的x與y座標
@jit
defcensus
(img)
: size=np.shape(img)[0
:2] h=size[0]
w=size[1]
census = np.zeros(
(h-2
*same, w-
2*same)
, dtype=np.int64)
#census就是經過變換後的影象
cp = img[same:h-same, same:w-same]
#cp是變換中心點的座標,0,0點作為左上角的視窗中,中心點就是(same,same)
offsets =
[(u, v)
for v in
range
(window_size)
for u in
range
(window_size)
ifnot u == same == v]
#offset是分別衡量某個點作為視窗左上角是否匹配成功,作為視窗左上角向左平移乙個匹配是否成功,一直到作為視窗右下角匹配是否成功,都有衡量
for u,v in offsets:
census =
(census <<1)
|(img[v:v+h-
2*same, u:u+w-
2*same]
>= cp)
return census
'''上面那一部分是生成census變化後的,每乙個畫素座標其實是乙個2進製串,代表每一位的匹配情況
如果視窗大小選擇為3,那麼每乙個畫素匹配總數就是3*3=9次,但是要去掉中心點,也就是8次,8位2進製字串能構成
的十進位制數最大為255,當然也可以選擇更大的視窗'''
'''下面這一部分是兩張的匹配過程,因為最終目的是匹配左右影象,找出最佳視差'''
@jit
defhanming
(limg,rimg,dispmap,diffmap)
: size=np.shape(limg)[0
:2] h=size[0]
w=size[1]
lres=census(limg[
:,maxdisparity:w]
) rres=census(rimg[:,
0:w-maxdisparity]
)for x in
range(0
,np.shape(lres)[0
]):for y in
range
(maxdisparity,np.shape(lres)[1
]):for i in
range(0
,maxdisparity)
: dispmap[x,y,i]=''
.format((
(rres[x,y-i])^
(lres[x,y]))
).count(
'0')
#從當前位置開始,在右圖中尋找和左圖最接近的二進位制串,從而完成匹配
for x in
range(0
,np.shape(lres)[0
]):for y in
range(0
,np.shape(lres)[1
]): val=np.sort( dispmap[x,y,:]
)#排名
val_id=np.argsort(dispmap[x,y,:]
)#找出最接近的
diffmap[x,y]
=dispmap[x,y,:]
.argsort()[
-1]
)limg=np.asanyarray(cv.imread(
'l.png'
,cv.imread_grayscale)
,dtype=np.int64)
rimg=np.asanyarray(cv.imread(
'r.png'
,cv.imread_grayscale)
,dtype=np.int64)
# img_size=np.shape(limg)
size=np.shape(limg)[0
:2]h=size[0]
w=size[1]
rres=np.zeros(
(np.shape(lres)[0
],np.shape(lres)[1
],maxdisparity)
,dtype=np.int64)
dispmap=np.zeros(
(np.shape(lres)[0
],np.shape(lres)[1
],maxdisparity)
,dtype=np.int64)
diffmap=np.zeros(
(np.shape(lres)[0
],np.shape(lres)[1
]),dtype=np.int64)
tic1=time.time(
)hanming(limg,rimg,dispmap,diffmap)
plt.imshow( diffmap[
:,maxdisparity:])
plt.show(
)print
('用時:'
,time.time(
)-tic1)
圖一:執行速度有待提公升,目前任務為作出demo,等各類立體匹配演算法全部完成後會進行**的優化
圖二:census變換後的左圖
圖三:最終生成的深度圖
立體匹配演算法 RankTransform
1.基本介紹 立體匹配演算法,關鍵是計算左右圖對應點的匹配代價。但是基於畫素的匹配方法有乙個問題就是對於重複紋理區域,支援視窗選取太小則不利於獲取準確的匹配代價,視窗選取過大則計算複雜度過高。對於這種情況,我們應該適當的考慮支援視窗的結構資訊,但是結構資訊如何表示,怎樣定量計算,這裡就要用到標題中提...
立體匹配演算法 RankTransform
1.基本介紹 立體匹配演算法,關鍵是計算左右圖對應點的匹配代價。但是基於畫素的匹配方法有乙個問題就是對於重複紋理區域,支援視窗選取太小則不利於獲取準確的匹配代價,視窗選取過大則計算複雜度過高。對於這種情況,我們應該適當的考慮支援視窗的結構資訊,但是結構資訊如何表示,怎樣定量計算,這裡就要用到標題中提...
立體匹配演算法不足
根據不同的標準,立體匹配演算法有不同的分類方法。首先,根據匹配基元的不同,立體匹配演算法可分為 基於區域的匹配演算法,基於特徵的匹配演算法和基於相位的匹配演算法。基於區域的匹配演算法。主要利用左右檢視中,區域性視窗之間灰度資訊的的相關程度進行匹配。該演算法可利用所有的影象資訊,最大限度地恢復場景細節...