24小时热门版块排行榜    

查看: 328  |  回复: 1

pdsnj

金虫 (正式写手)

[求助] 关于图像匹配的代码--看不大懂

CODE:
function [fdsp dsp] = stereo(i1,i2, maxs)
  win_size  = 7; %-- size of window used when smoothing
  tolerance = 2; %-- how close R-L and L-R values need to be
  weight    = 5; %-- weight on gradients opposed to color
  
  %--determine pixel correspondence Right-to-Left and Left-to-Right
  [dsp1, diff1] = slide_images(i1,i2, 1, maxs, win_size, weight);
  [dsp2, diff2] = slide_images(i2,i1, -1, -maxs, win_size, weight);
  
  %--keep only high-confidence pixels
  dsp = winner_take_all(dsp1,diff1,dsp2,diff2,tolerance);
  
  %--try to eliminate bad pixesl
  fdsp = modefilt2(dsp,[win_size,win_size],2);
  
%%----- HELPER FUNCTIONS
%-- takes the best disparity when we're within tolerance
function pd = winner_take_all(d1,m1,d2,m2,tolerance,maxs)
  pixel_dsp = zeros(size(d1));               %-- initialize output
  idx1 = find(abs(d1-d2)   idx2 = find(abs(d1-d2)   pixel_dsp(idx1) = d1(idx1);                %-- fill with d1
  pixel_dsp(idx2) = d2(idx2);                %-- fill with d2
  pd = shift_image(pixel_dsp,5);             %-- shift to match i1
%-- slides images across each other to get disparity estimate
function [disparity mindiff] = slide_images(i1,i2,mins,maxs,win_size,weight)
  [dimy,dimx,c] = size(i1);
  disparity = zeros(dimy,dimx);    %-- init outputs
  mindiff = inf(dimy,dimx);   
  
  h = ones(win_size)/win_size.^2;  %-- averaging filter
  [g1x g1y g1z] = gradient(double(i1)); %-- get gradient for each image
  [g2x g2y g2z] = gradient(double(i2));
  
  step = sign((maxs-mins)/10);          %-- adjusts to reverse slide
  for i=mins:step:maxs
    s  = shift_image(i2,i);        %-- shift image and derivs
    sx = shift_image(g2x,i);
    sy = shift_image(g2y,i);
    sz = shift_image(g2z,i);
    %--CSAD  is Cost from Sum of Absolute Differences
    %--CGRAD is Cost from Gradient of Absolute Differences
    diffs = sum(abs(i1-s),3);       %-- get CSAD and CGRAD
    gdiffx = sum(abs(g1x-sx),3);
    gdiffy = sum(abs(g1y-sy),3);
    gdiffz = sum(abs(g1z-sz),3);
    gdiff = gdiffx+gdiffy+gdiffz;
   
    CSAD  = imfilter(diffs,h);
    CGRAD = imfilter(gdiff,h);
    d = CSAD+weight*CGRAD;          %-- total 'difference' score
   
    idx = find(d     disparity(idx) = abs(i);        %   into correct place in image
    mindiff(idx) = d(idx);
  end
  
%-- Shift an image
function I = shift_image(I,shift)
  dimx = size(I,2);
  if(shift > 0)
    I(:,shift:dimx,:) = I(:,1:dimx-shift+1,:);
    I(:,1:shift-1,:) = 0;
  else
    if(shift<0)  
      I(:,1:dimx+shift+1,:) = I(:,-shift:dimx,:);
      I(:,dimx+shift+1:dimx,:) = 0;
    end  
  end

代码看不大懂,请指点,具体就是上面的几个嵌套的函数i1和i2是RGB图像,maxs值为20
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

靠山山会倒,靠人人会跑,只有自己最可靠
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

pdsnj

金虫 (正式写手)


xiegangmai(金币+1): 鼓励讨论交流! 2011-09-23 19:32:10
似乎懂了,[fdsp dsp] = stereo(i1,i2, maxs)是获得最后的视差图和经过滤波后的视差图。function [disparity mindiff] = slide_images(i1,i2,mins,maxs,win_size,weight) 得到每幅图的视差和梯度
靠山山会倒,靠人人会跑,只有自己最可靠
2楼2011-09-23 16:37:03
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 pdsnj 的主题更新
信息提示
请填处理意见