Matlab中的图像校正算法

Matlab中的图像校正算法,matlab,computer-vision,matlab-cvst,stereo-3d,stereoscopy,Matlab,Computer Vision,Matlab Cvst,Stereo 3d,Stereoscopy,我最近发现了一篇关于两个立体图像对的图像校正的有趣文章。我喜欢这个算法,因为它非常紧凑,并且从文章中可以看出它做了正确的事情。在两幅图像上实现了matlab版本后,我没有得到正确的校正图像。我得到的图像是一片漆黑,除了左边和下面有像素的线条。在图像中,也有一些原始图像的灰色像素,但只有一手。我在下面发布了matlab代码,文章的链接,以及一张图片的结果示例(另一张图片也是一样的) 这是文章的链接 带有初始图像和结果的屏幕截图如下: 初始图像为以下两个(这样您就不必搜索其他立体声对): 这是我调

我最近发现了一篇关于两个立体图像对的图像校正的有趣文章。我喜欢这个算法,因为它非常紧凑,并且从文章中可以看出它做了正确的事情。在两幅图像上实现了matlab版本后,我没有得到正确的校正图像。我得到的图像是一片漆黑,除了左边和下面有像素的线条。在图像中,也有一些原始图像的灰色像素,但只有一手。我在下面发布了matlab代码,文章的链接,以及一张图片的结果示例(另一张图片也是一样的)

这是文章的链接

带有初始图像和结果的屏幕截图如下:

初始图像为以下两个(这样您就不必搜索其他立体声对):

这是我调用校正函数的“主”代码

img1 = imread('D:\imag1.png');
img2 = imread('D:\imag2.png');

im1 = rgb2gray(img1);
im2 = rgb2gray(img2);

im1 = im2double(im1);
im2 = im2double(im2);

figure; imshow(im1, 'border', 'tight')
figure; imshow(im2, 'border', 'tight')

%pair projection matrices obtained after the calibration P01,P02

a = double(9.765*(10^2))
b = double(5.790*(10^-1))
format bank;
Po1 = double([a 5.382*10 -2.398*(10^2) 3.875*(10^5); 
    9.849*10 9.333*(10^2) 1.574*(10^2) 2.428*(10^5);
    b 1.108*(10^(-1)) 8.077*(10^(-1)) 1.118*(10^3)]);
Po2 = [9.767*(10^2) 5.376*10 -2.400*(10^2) 4.003*(10^4);
    9.868*10 9.310*(10^2) 1.567*(10^2) 2.517*(10^5);
    5.766*(10^(-1)) 1.141*(10^(-1)) 8.089*(10^(-1)) 1.174*(10^3)];
[T1, T2, Pn1, Pn2] = rectify(Po1, Po2);

imnoua =  conv2(im1, T1);
imnoua2 = conv2(im2, T2);

fprintf('Imaginea noua e \n');

figure; imshow(imnoua, 'border', 'tight')
figure; imshow(imnoua2, 'border', 'tight')
谢谢你抽出时间

As、
T1
T2
是投影变换矩阵,而不是过滤核。您应该使用
imwarp
,而不是
conv2

imnoua = imwarp(im1, projective2d(T1));
imnoua2 = imwarp(im2, projective2d(T2));

更好的方法是使用计算机视觉系统工具箱中的
整流系统图像
。看看这个。

你为什么要用
T
转换图像?你不应该使用几何变换吗?非常感谢你的回答。首先,我用imwrap尝试了这个解决方案,但它没有给我一个校正过的图像,它只给了我屏幕上的一个小点。第二,我不想使用预定义的Matlab函数的原因是,在我完全了解矫正过程中发生了什么之后,我想在嵌入式板上实现它:)以制作一个小型立体视觉机器人。最后的实现将在C++中。在这种情况下,您似乎需要进行一些调试。您可以尝试
estimateUncalibratedRectification
了解投影矩阵的外观。
imnoua = imwarp(im1, projective2d(T1));
imnoua2 = imwarp(im2, projective2d(T2));