matlab練習程序(立體相關塊匹配)


立體感知對應點匹配基本分為兩種:一是低層的基於像素級的匹配,二是高層的基於特征級的匹配。

這里介紹的是底層的像素級匹配。

用攝像頭平行移動獲取兩張圖片,其實就是雙目感知到的兩張圖片。

原理是在一定的窗口中,兩張圖片具有相同的水平視差,而對比這兩個局部窗口中的像素相似度就能計算出當前像素的深度。

先看下效果吧:

                      

    left.img              right.img

                       

            depth.img

具體判斷像素相似度的判據有以下幾種:

所有公式(非官方公式哈,自己憑理解寫的)中ds是原圖中的像素塊(左圖),dd是待檢測圖的像素塊(右圖),i是要搜尋深度的距離。

當然,左右都是相互的,顛倒過來比較是一樣的。

1.Sum of Absolute Differencse(sad)公式如下:

2.Root Mean Squared Error(rms)公式如下:

3.Sum of Squared Differences(ssd)公式如下:

4.Normalized Cross Correlation(ncc)公式如下:

5.Sum of Hamming Distances(shd)公式如下:

公式5中的bit()的含義是像素轉為二進制后含有多少個1,整個公式意思就是兩張局部圖先異或一下,然后統計所有像素二進制化后1的個數,取最少的那個就行了。

我只用matlab實現了第一個公式,其他的都是類似的。

代碼如下:

clear all;
close all;
clc;

left=double(imread('left.jpg'));
right=double(imread('right.jpg'));

[m n]=size(left);

w=3;       %模板半徑
depth=5;    %最大偏移距離,同樣也是最大深度距離
imgn=zeros(m,n);
for i=1+w:m-w
   for j=1+w+depth:n-w 
       tmp=[];
       lwin=left(i-w:i+w,j-w:j+w);
       for k=0:-1:-depth        
           rwin=right(i-w:i+w,j-w+k:j+w+k);
           diff=lwin-rwin;
           tmp=[tmp sum(abs(diff(:)))];
       end
       [junk imgn(i,j)]=min(tmp);   %獲得最小位置的索引
   end
end

imshow(imgn,[])

之所以沒有全部實現是因為所有版本的實現在這個老外的博客(需翻牆)里都能找到,我就不多此一舉了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM