前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[图像]畸变校正详解

[图像]畸变校正详解

作者头像
祥知道
发布2020-03-10 14:55:25
4.2K0
发布2020-03-10 14:55:25
举报
文章被收录于专栏:祥的专栏

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接: http://blog.csdn.net/humanking7/article/details/45037239


1.摄像机成像原理简述

成像的过程实质上是几个坐标系的转换。首先空间中的一点由 世界坐标系 转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 ( 图像像素坐标系 )

详细的可以参考我之前的博客[图像]摄像机标定(1) 标定中的四个坐标系

图像像素坐标系 (uOv坐标系) 下的无畸变坐标 (U, V),经过 经向畸变切向畸变 后落在了uOv坐标系(Ud, Vd) 上。即就是说,真实图像 imgR畸变图像 imgD 之间的关系为: imgR(U, V) = imgD(Ud, Vd)

2.成像畸变

2.1. 畸变数学模型

摄像头成像畸变的数学模型 (符合的对应关系有问题,可能会造成一些干扰,公式主要看后面推导的过程)

2.2. 公式推导

公式推导:

3.畸变校正

3.1. 理论推导

我们已知的是畸变后的图像,要得到没有畸变的图像就要通过畸变模型推导其映射关系。 真实图像 imgR畸变图像 imgD 之间的关系为: imgR(U, V) = imgD(Ud, Vd) 。通过这个关系,找出所有的 imgR(U, V)(U, V) 映射到 (Ud, Vd) 中的 (Ud, Vd) 往往不是整数 (U和V是整数,因为它是我们要组成图像的像素坐标位置,以这正常图像的坐标位置去求在畸变图像中的坐标位置,取出对应的像素值,这也是正常图像的像素值)。 但是畸变的像素往往不是整数,所以需要通过插值来进行求解,详细见我之前的博客 [图像]图像缩放算法-双线性内插法

3.2. 代码实现

代码语言:javascript
复制
    clear;
    clc;
    A =[5.9418398977142772e+002 0 3.1950000000000000e+002;
        0    5.941839897714e+002 2.3950000000000000e+002;
        0 0 1];
    D = [6.7442695842244271e-002 2.4180872220967919e-001 0 0 -3.3970575589699975e-001];
    fx = A(1,1);
    fy = A(2,2);
    cx = A(1,3);
    cy = A(2,3);
    k1 = D(1);
    k2 = D(2);
    k3 = D(5);
    p1 = D(3);
    p2 = D(4);

    K = A;
    I_d = imread('img_d.png');
    I_d = rgb2gray(I_d);
    I_d = im2double(I_d);

    I_r = zeros(size(I_d));

    %图像坐标系和矩阵的表示是相反的
    %[row,col] = find(X),坐标按照列的顺序排列,这样好和reshape()匹配出响应的图像矩阵
    [v u] = find(~isnan(I_r));

    % XYZc 摄像机坐标系的值,但是已经归一化了,因为没有乘比例因子
    %公式 s[u v 1]' = A*[Xc Yc Zc]' ,其中s为比例因子,不加比例因子,Zc就为1,所以此时的Xc相对于( Xc/Zc )
    XYZc= inv(A)*[u v ones(length(u),1)]';

    % 此时的x和y是没有畸变的
    r2 = XYZc(1,:).^2+XYZc(2,:).^2;
    x = XYZc(1,:);
    y = XYZc(2,:);

    % x和y进行畸变的
    x = x.*(1+k1*r2 + k2*r2.^2) + 2*p1.*x.*y + p2*(r2 + 2*x.^2);
    y = y.*(1+k1*r2 + k2*r2.^2) + 2*p2.*x.*y + p1*(r2 + 2*y.^2);

    % (u, v) 对应的畸变坐标 (u_d, v_d)
    u_d = reshape(fx*x + cx,size(I_r));
    v_d = reshape(fy*y + cy,size(I_r));

    % 线性插值出非畸变的图像
    I_r = interp2(I_d, u_d, v_d);
    %对比图像
    subplot(121);     
        imagesc(I_d);
        title('畸变原图像');
    subplot(122);
        imagesc(I_r);
        title('校正后图像');

运行效果(摄像机内参是取网上的,图也是自己画的,图像本身没有参考价值):

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.摄像机成像原理简述
  • 2.成像畸变
    • 2.1. 畸变数学模型
      • 2.2. 公式推导
      • 3.畸变校正
        • 3.1. 理论推导
          • 3.2. 代码实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档