这篇论文对立体匹配算法做了非常大的改进,与传统的立体匹配算法不同,这个算法对每个窗口中的像素点,根据与需要匹配的像素点的距离和灰度值加以权值,使匹配更精确。
创新:原创代码,通过自己编程实现深刻理解立体匹配算法,也对立体匹配算放中的一些问题有深刻的体会。
困难:进入计算机视觉的第一篇论文实现,从完全没有概念到最后得到满意的结果
leftI = imread('left.ppm'); rightI = imread('right.ppm'); maxDisp = 15; factor = 16; A = makecform('srgb2lab'); leftLab = applycform(leftI, A); rightLab = applycform(rightI, A); leftLab = double(leftLab); rightLab = double(rightLab); leftL = leftLab(:,:,1); rightL = rightLab(:,:,1); lefta = leftLab(:,:,2); righta = rightLab(:,:,2); leftb = leftLab(:,:,3); rightb = leftLab(:,:,3); [nrLeft,ncLeft] = size(leftL); dispMap = zeros(nrLeft,ncLeft); leftI = double(leftI); rightI = double(rightI); leftR = leftI(:,:,1); leftG = leftI(:,:,2); leftB = leftI(:,:,3); rightR = rightI(:,:,1); rightG = rightI(:,:,2); rightB = rightI(:,:,3); WindowSize = 35; win =(WindowSize - 1)/2; gammac = 13; gammap = 31; weight1 = zeros(WindowSize, WindowSize); weight2 = zeros(WindowSize, WindowSize); td = zeros(maxDisp+1, 1); for i = (1+win):(nrLeft-win) for j = (1+win+maxDisp):(ncLeft-win) Llij = leftL(i,j); Laij = lefta(i,j); Lbij = leftb(i,j); for k = (i-win):(i+win) for l = (j-win):(j+win) deltaGpq = sqrt((k-i)^2+(l-j)^2); dl = leftL(k,l)-Llij; da = lefta(k,l)-Laij; db = leftb(k,l)-Lbij; deltaCpq = sqrt(dl^2+da^2+db^2); weight1 = exp(-(deltaCpq/gammac+deltaGpq/gammap)); end end for d = 0:maxDisp sum1 = 0; sum2 = 0; Rlijd = rightL(i,j-d); Raijd = righta(i,j-d); Rbijd = rightb(i,j-d); for k = (i-win):(i+win) for l = (j-win):(j+win) deltaGpq2 = sqrt((k-i)^2+(l-j)^2); deltaCpq2 = sqrt((rightL(k,l-d)-Rlijd)^2+(righta(k,l-d)-Raijd)^2+(rightb(k,l-d)-Rbijd)^2); weight2 = exp(-(deltaCpq2/gammac+deltaGpq2/gammap)); e = min((abs(leftR(k,l)-rightR(k,l-d))+abs(leftG(k,l)-rightG(k,l-d))+abs(leftB(k,l)-rightB(k,l-d))), 40); sum1 = sum1 + weight1*weight2*e; sum2 = sum2 + weight1*weight2; end end td(d+1) = sum1/sum2; end [minV,minIdx] = min(td); dispMap(i,j) = minIdx-1; end i end dispMap = dispMap*factor; imshow(dispMap,[])