【问题标题】:Get disparity map from two images taking by single moving camera从单个移动相机拍摄的两张图像中获取视差图
【发布时间】:2018-03-13 09:30:13
【问题描述】:

我正在使用单个移动相机拍摄两张图像。我试图将它们从同一极线中取出。

然后我在 Matlab 中计算视差。

I1 = imread('4.jpg');  %right image
I2 = imread('3.jpg');  %left image

figure
imshow(stereoAnaglyph(I1,I2));
title('Red-cyan composite view of the stereo images');

disparityRange = [-6 26];
disparityMap = disparity(rgb2gray(I1),rgb2gray(I2),'DisparityRange',disparityRange);

figure 
imshow(disparityMap,disparityRange);
title('Disparity Map');
colormap(gca,jet) 
colorbar

我的输出包含许多噪音。当我尝试用 tsukuba 左右图像进行计算时,它显示了一个完美而平滑的视差图。为什么会这样?我错过了任何重要的步骤吗?视差范围有影响吗?

【问题讨论】:

  • 旁注:jet 颜色图是可用于此类数据的最糟糕的选择之一。你想要一些不同的颜色图
  • 另外,“试图”将它们带入核平面和它们处于核平面是非常不同的概念;)
  • 感谢您的评论。但是,我对立体视觉完全陌生,我不太了解。为什么jet colormap是最糟糕的选择?它只是可视化最差的吗?所以我必须纠正图像以使它们在同一极平面上?
  • 是的,jet 有多种颜色,而在这里你有不同的数据。要么选择发散的颜色图,要么选择统一的颜色图(如 parula、gray)
  • 我一直在环顾四周,你的结果似乎并不太疯狂,这取决于 MATLAB 使用什么算法。样本数据集非常好,但对于任何任意图像,计算视差图都非常困难,尤其是当你有均匀区域时。墙在各处看起来几乎相同,因此视差图“随机”匹配它。请注意所有确实是对象的东西是如何正确绘制的,但并非所有均匀区域都没有

标签: matlab image-processing


【解决方案1】:

如果您可以发布已实现的disparity 函数,将会有所帮助。 我建议传递一个正数的视差值e.g. 59 您可以尝试以下方法:

function disparity_map = disparity(I1, I2, disp_value)

shiftedWin = 5 %any odd number
windowSize = (shiftedWin-1)/2;

lImage = im2double(I1)
rImage = im2double(I2)
disp2 = uint8(imread(I1));

[lRow , lCol] = size(lImage);
DispImg = zeros(lRow,lCol);

for i = windowSize+1 :1: lRow-windowSize
    for j = windowSize+1 :1:  lCol-windowSize-disp_value

        previousScore = 9999;
        bestDisparity = 0;

        lReg = lImage(i-windowSize:i+windowSize,j-windowSize:j+windowSize);

        for cDisparity = 1:disp_value

                rReg = rImage(i-windowSize:i+windowSize,j+cDisparity-windowSize:j+windowSize+cDisparity); %% correlated shifted window

                %%SAD method%%
                tempScore = abs(rReg - lReg);
                curScore = sum(tempScore(:));        
                %lineSums = [lineSums, corrScore];

            if (previousScore > curScore)                
                previousScore = curScore;
                bestDisparity = cDisparity;
            end
        end

        DispImg(i,j) = bestDisparity;

    end
end

ilumImg = DispImg *4;
imagesc(ilumImg)
colorbar

diffImg = imabsdiff(uint8(ilumImg),disp2);
figure
imshow(diffImg,[])    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    相关资源
    最近更新 更多