摄像头图像桶形畸变校正测试

from: http://blog.csdn.net/hyanglu1573/article/details/12876727

1        桶形畸变原理

如果摄像头使用短焦距广角镜头,那么得到的图像会发生桶形畸变,如下图所示。

图 1 摄像头畸变图像

 

产生桶形畸变的原因是:镜头的放大倍数随着距离增大而逐渐减小,造成图像像素点放射形地围绕中心点的。原理图如下所示。

 

2 桶形畸变原理

 

桶形畸变的数学模型是:


 

 

(1)

其中,是非畸变图像中某像素点到图像中心的距离,是畸变后该像素点到图像中心的距离,是畸变因子,与具体的镜头相关。

 


 

2        使用Matlab进行校正

根据图 2公式(1),我们可以使用Matlab进行畸变校正,算法比较简单,不详细解释原理了,Matlab代码如下所示。

 

% Barrel Distortion correction

clear;

clc;

 

img_origin = imread('5642_vga.jpg');

 

% Change this two parameters to improve image quality

k1 = -0.0000026;

k2 = -0.0000026;

 

img_size = size( img_origin );

img_undist = zeros( img_size );

img_undist = uint8( img_undist );

 

for l0 = 1:img_size(3)

    for l1 = 1:img_size(1)

        y = l1 - img_size(1)/2;

        for l2 = 1:img_size(2)

            x = l2 - img_size(2)/2;

            x1 = round( x * ( 1 + k1 * x * x + k2 * y * y ) );

            y1 = round( y * ( 1 + k1 * x * x + k2 * y * y ) );

            y1 = y1 + img_size(1)/2;

            x1 = x1 + img_size(2)/2;

            % if x1 or y1 exceeds boundary force them to 0(black)

            if x1 < 1 || x1 > img_size(2) || y1 < 1 || y1 > img_size(1)

                img_undist(l1,l2,l0) = 0;

            else

                img_undist(l1,l2,l0) = img_origin(y1, x1,l0);

            end

        end

    end

end

 

figure(1);

% compare the two images in one figure

subplot(121);

imshow(img_origin);

subplot(122);

imshow(img_undist);

 

% save the original image to 1.jpg

imwrite(img_origin,'1.jpg');

% save the changed image to 2.jpg

imwrite(img_undist,'2.jpg');

 

 

代码中的k1和k2是分别用来调整x轴畸变和y轴畸变的参数,调整两个参数就可以调整图像的畸变率。

设置k1=k2=0.000003时,校正图像如下:

 

图 3 k1=k2=0.000003

 

从图中可以看出,原图像中间部分的弯曲已经被纠正了,但是四个角落里却出现了较大的形变,图像反畸变效果不理想。

改变参数,设置k1=k2=0.000001,校正后的图像效果如下:

 

图 4 k1=k2=0.000001

 

从图中可以看出,整幅图像的变形很小,画面效果还可以,但是却没有完全将桶形畸变的完全线校正为直线。

继续改变参数,经过多次尝试,最终选择出一个较为理想的参数为k1=k2=0.000002,显示效果如下图所示。

可以看出,在为了保证图像质量的前提下,设置的参数并没有完全将桶形畸变造成的物体弯曲进行纠正。


图 5 k1=k2=0.000002

展开阅读全文

没有更多推荐了,返回首页