2010年1月26日 星期二

視差值計算原理

Bee最近被問到視差值如何計算,還是貼圖舉例說明比較容易。

首先找二張有視差的圖:


相減圖片:


其實有人從相減的圖片中就已經在猜視差值。

在數學計算上面,要找出最像的地方。最簡單的就是做移位再相減取絕對值。
每移動一個點,就會產生一個值。
但因單點判定有可能誤判,所以通常是連同附近的圖一併做計算,將所有的差值和記錄下來。
如果圖片夠像,其差值和就會最小。所以找出最小值是移位多少pixel,其移位值就是視差值。

以下為x=71,y=106(Matlab座標)附近取出的sad值分布圖:
x軸為位移,y軸為和。

可以知道此處以15為最低的值。故視差即為15。
這只是計算一個點,其實是整個圖每一點都要算,所以運算量很大。

以下為Matlab程式:
close all;clear all;
l_img=imread('corridorL.bmp');
r_img=imread('corridorR.bmp');
figure;imshow(l_img);
figure;imshow(r_img);
l=double(l_img);
r=double(r_img);
d=l-r;
figure;imshow(uint8(abs(d)));
[hight,weight]=size(l_img);
range=8;
search=64;
x=71;
y=106;
m=1;
if( search > weight-2*range )
    search = weight-2*range;
end
    while(m <= search)
        n=1;
        sad(m)=0;
        while( n <= 2*range+1)
            sad(m)=sad(m)+abs(l(x+n,y)-r(x-m+n-1,y));
            n=n+1;
        end
        m=m+1;
    end
    figure;plot(sad);


4 則留言:

  1. 大大您好,小弟剛入門所以問的問題可能會有些愚蠢,請見諒!
    請問大大利用兩台攝相機各自模擬左右眼的生成圖像
    之後相減取得圖3(相減圖片)
    請問這結果轉灰階之後是否就為所謂的depth map?
    [版主回覆12/22/2010 18:21:46]不是,那只是depth有變化的地方。和真正的depth map差很多。

    回覆刪除
  2. 那請問假如我已有兩張雙眼BMP圖檔
    如果我想用C使之產生成一張depth map該如何做呢?
    爬了很多文,知道要產生深度資訊最好的辦法是用兩張圖取得
    但怎麼取得的辦法就是沒找著
    能請大大指點一下嗎?
    謝謝!
    [版主回覆12/23/2010 09:28:15]單點的程式也有,圖也有,只差二件事。
    單點變成二維的圖,以及找出最小值在那。這在一般程式的書都有。
    如果連這點程度的修改都做不好,那這個題目對您來說也許是太難了。

    回覆刪除
  3. 請問大大
    "單點變成二維的圖,以及找出最小值在那。"
    圖片本身不就是2D了嗎?不太懂您的意思!
    找出最小值的意思是要找出該圖最小的像素值嗎?
    [版主回覆12/23/2010 13:23:07]我真的很不想說明原理。因為以研究生來說那是基本功課。
    不過我還是找說明原理的網站給你參考。
    http://inperc.com/wiki/index.php?title=Stereo_vision
    首先要找到在3D中同一點,因為視角關係,在左右視窗上會各有一點對應點。
    再利用三角關係回推可以得到相對距離。
    現實上可以得到的只有左右視覺的影像。只能用圖形比對去找出對應的點。
    這就是我的程式所做的。

    回覆刪除
  4. 謝謝大大的指教,我再研究看看!
    [版主回覆12/25/2010 21:44:40]您要的資料,要等我畢業後,我才會公布。
    沒辦法這個關係到我能不能順利畢業。要是我提早公布,可能有人會比我早一步做出來。
    這在資料的取得上,我們屬於相競爭的對手。這點希望您可以見諒。

    回覆刪除