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

2021-10-02 20:27:21 字數 3400 閱讀 1304

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.基本介紹 立體匹配演算法,關鍵是計算左右圖對應點的匹配代價。但是基於畫素的匹配方法有乙個問題就是對於重複紋理區域,支援視窗選取太小則不利於獲取準確的匹配代價,視窗選取過大則計算複雜度過高。對於這種情況,我們應該適當的考慮支援視窗的結構資訊,但是結構資訊如何表示,怎樣定量計算,這裡就要用到標題中提...

立體匹配演算法不足

根據不同的標準,立體匹配演算法有不同的分類方法。首先,根據匹配基元的不同,立體匹配演算法可分為 基於區域的匹配演算法,基於特徵的匹配演算法和基於相位的匹配演算法。基於區域的匹配演算法。主要利用左右檢視中,區域性視窗之間灰度資訊的的相關程度進行匹配。該演算法可利用所有的影象資訊,最大限度地恢復場景細節...