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