图像处理 图像畸变_图像处理 畸变 - CSDN
  • 透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。 1. 径向畸变 顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的...

    透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。

    1. 径向畸变

    顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在短焦镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:

     

     

    成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:

    公式里(x0,y0)是畸变点在成像仪上的原始位置,(x,y)是校正后新的位置。

    注意这个公式,(x0,y0)是畸变的原图上像素点的位置;(x,y)是校正后输出图像上像素点的位置。

    实现过程是,对输出图的点做遍历——以1080p的图像为例,从点(0,0)到点(1919,1079),一行一行的遍历——依次找到输出点(x, y)对应的原图点(x0, y0)的像素值,再将(x0, y0)的值赋给(x, y)。如果计算出来的对应的原图的点(x0, y0)不是整数,则用二次线性插值计算此点,然后赋值给(x, y)。

    举个一维差值示例:

    计算得到,要用x0=0.3位置的点赋值到纠正后的图像的对应点上。

    x0=0的点RGB(120, 120, 240),x0=1的点RGB(100, 110, 250)。

    那么可以计算x0=0.3位置的

    R=120*(1-0.3)+100*0.3=114;

    G=120*(1-0.3)+110*0.3=117;

    B=240*(1-0.3)+250*0.3=243

     

    完成所有遍历后,就得到了输出图像。

     

    下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。

     

    注:OpenCV官网上对于这部分的解释是错了,原图和输出图像说反了。但其软件模型没有问题。


     

    2. 切向畸变

     

    切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。

     

    畸变模型可以用两个额外的参数p1和p2来描述:

    下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线是对称的,说明该镜头在垂直于该方向上有一个旋转角度。

     

    3. 畸变模型

    同时对径向、切向畸变消除就是将两组式子合并。

    x0=x(1+k1r2+k2r4+k3r6)+x+2p1xy+p2(r2+2x2)y0=y(1+k1r2+k2r4+k3r6)+y+p1(r2+2y2)+2p2xyx0=x(1+k1r2+k2r4+k3r6)+x+2p1xy+p2(r2+2x2)y0=y(1+k1r2+k2r4+k3r6)+y+p1(r2+2y2)+2p2xy

    最终可以得到5个畸变参数

    Distortioncoefficients=(k1,k2,p1,p2,k3)Distortioncoefficients=(k1,k2,p1,p2,k3)

    畸变参数的一般顺序是k1,k2,p1,p2,k3。之所以把k3放在最后其实也很容易理解,因为前面说了一般k1,k2用来处理径向畸变足矣,k3相对而言用的比较少。

    在Opencv中他们被排列成一个5*1的矩阵,经常被定义为Mat矩阵的形式,如Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0))

    这5个参数就是相机标定中需要确定的相机的5个畸变系数。求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真,下图显示根据镜头畸变系数校正后的效果:

     

     

    参考文章:https://blog.csdn.net/dcrmg/article/details/52950141

    转自:https://blog.csdn.net/lyfwill/article/details/81636281
    展开全文
  • 图像畸变与去畸变

    2019-06-28 10:49:24
    本文主要介绍图像畸变产生的原因,广角镜头的一般畸变模型和去畸变的方法。 1.图像畸变 图像畸变是由于透镜制造精度以及组装工艺的偏差会引入畸变,导致原始图像失真。镜头的畸变分为径向畸变和切向畸变两类。 ...

    本文主要介绍图像畸变产生的原因,广角镜头的一般畸变模型和去畸变的方法。

    1.图像畸变

    图像畸变是由于透镜制造精度以及组装工艺的偏差会引入畸变,导致原始图像失真。镜头的畸变分为径向畸变和切向畸变两类。

    1.1 径向畸变与畸变模型

    径向畸变是由于镜头自身凸透镜的固有特性造成的,产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲。

    畸变沿着透镜半径方向分布,主要包括桶形畸变和枕形畸变两种,如下图所示:

                        正常物体                                                       枕形畸变                                                        桶形畸变

    畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,可以增加使用第三项k3来进行描述:

       

    其中,(x,y)是非畸变的坐标位置,(x0,y0)是畸变后的坐标位置。成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。

    1.2 切向畸变与畸变模型

    切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。

    畸变模型可以用两个参数p1和p2来描述:

      

    其中,(x,y)是非畸变的坐标位置,(x0,y0)是畸变后的坐标位置。

    注意:

    1)所有的畸变计算均在摄像机坐标系下进行。

    2)每个镜头的畸变系数[k1,k2,k3,p1,p2],可以通过标定得出。

     

    2.图像去畸变

    从镜头获取的原始图像,都是存在第一部分所述的两种畸变的,为了后续进行更好的图像操作,我们需要首先执行去畸变过程:

    1)首先将像素坐标(u,v)转到摄像机坐标系下(通过camera内参):

    x=(u-cx)/fx;

    y=(v-cy)/fy;

    z=1;//单位平面

    2)计算畸变量:

    3)畸变位置:

    4)将该摄像机坐标系下的坐标转到像素坐标系下:

    for (int v = 0; v < grayimg.rows; v++)
    {
         for (int u = 0; u < grayimg.cols; u++)
         {

             image_de_distort.at<unsigned char>(v, u) = imgsrc.at<unsigned char>(v′, u′);

         }

    }

    imgsrc是直接获取的有畸变的图像, image_de_distort是去畸变后的图像。

            

                                        原始图像(存在畸变)                                                                                    去畸变后的图像

     

    第二部分:

    摄像头模组的畸变是无法避免的,那为了保证相机的成像质量,必然涉及到图像的畸变处理,这里试图说明Brown畸变模型下的去畸变和加畸变的原理和过程,多项式畸变的处理方式类似。

    1. 像素位置加畸变和去畸变

    畸变前的像素位置和畸变后的像素位置关系式:

    从未畸变的像素位置变换到畸变的位置这一正向过程比较简单,直接套用公式就可以得到。从畸变的像素位置得到去畸变后的像素位置是比较复杂的,这是一个逆向的过程,由于函数关系是单调的,一般采用迭代法,这样方便编程实现和计算机的计算

    2. 线性插值和双线性插值

    插值法常用于计算周围点的之间点的值,插值法分为线性插值、双线性插值、三次样条插值等,这里介绍线性插值和双线性插值的原理,双线性插值在图像像素的插值中被频繁采用。线性插值如公式:

    从公式中可以看出该线性插值的含义:以距离为权重,加权y1、y2得到的值。

    双线性插值法:双线性插值是线性插值的扩展,像素值双线性插值的示意如图所示。

    X方向的插值为: 

    Y方向的插值为:

    最后得到双线性的插值结果:

     

    双线性插值在图像的过滤、变换、形态学处理、去畸变、加畸变用得很多。

    3. 图像去畸变和加畸变的过程

    图像去畸变是指依据畸变参数,将图像恢复到畸变前。图像去畸变的过程示意如图所示。

        

    图左中rectified image是去畸变后的图像REC,distorted image为畸变后的图像DIS。去畸变流程如下:

    1. 按顺序对REC中的像素位置加畸变处理,得到畸变后的浮点像素位置映射图
    2. 基于映射图,找到REC像素位置在DIS中的对应位置P,对P的4个邻位置的像素值进行双线性插值得到P点的像素值。
    3. 这样REC的每个位置都从DIS中找到了对应的像素值,从而得到去畸变后的图像。

    图像加畸变的过程和图像去畸变的过程相反,如图右所示,加畸变的像素位置进行去畸变处理,找到在未畸变图像中的对应位置,双线性插值计算其像素值,从而得到加畸变的图像。

    展开全文
  • 几何畸变图像恢复 OpenCV3 - 数字图像处理作业3 作业3:相同条件下拍到的棋盘图和日历钟表图,尝试建立几何畸变关系,并对它们进行恢复。注意:不能采用椭圆的变换。 算法步骤: 坐标变换: 在畸变和正常图象之间...

    几何畸变图像恢复 OpenCV3 - 数字图像处理作业3

    作业3:相同条件下拍到的棋盘图和日历钟表图,尝试建立几何畸变关系,并对它们进行恢复。注意:不能采用椭圆的变换。
    在这里插入图片描述
    在这里插入图片描述

    算法步骤

    1. 坐标变换: 在畸变和正常图象之间建立坐标关系。
      在这里插入图片描述
    2. 灰度级插值,最邻近像素灰级代替法
      在这里插入图片描述

    实际操作过程:

    第一步. 角点检测

    调用openCV角点检测函数获取棋盘格角点。

    	//cornerMat CV_32FC2 56 rows * 1 cols * 2channel 取值用Point2f 或者 Vec2f
    	findChessboardCorners(chessImg, Size(8, 7), cornerMat, CALIB_CB_FILTER_QUADS);
    	drawChessboardCorners(chessCorner, Size(8, 7), cornerMat, true);
    	imshow("chess with corner", chessCorner);
    

    在这里插入图片描述

    第二步. 得到畸变前的网格点位置

    通过图片中心畸变小(基本无畸变)的特性,计算得出棋盘格角点畸变前的坐标,见下图绿色点。
    畸变前网格点

    第三步. 控制网格法得出畸变函数

    为了拟合该图的函数,双线性变换参数不够,增加参数数量得到如下公式:
    x=a0+a1x+a2y+a3xy+a4x2+a5y2+a6xy2+a7x2yx&#x27;=a_0+a_1x+a_2y+a_3xy+a_4x^2+a_5y^2+a_6xy^2+a_7x^2y y=b0+b1x+b2y+b3xy+b4x2+b5y2+b6xy2+b7x2yy&#x27;=b_0+b_1x+b_2y+b_3xy+b_4x^2+b_5y^2+b_6xy^2+b_7x^2y
    一共16个未知数,通过梯度下降算法迭代来拟合函数,计算参数。由于畸变的中心对称性质,注意在参数计算中,将原点设为画面中心的点。

    梯度下降拟合函数曲线过程

    第四步. 最近邻像素插值

    通过上一步得到的参数,计算原图中每个点的畸变后位置坐标,取最近邻像素值替代,即可恢复出原图像。
    在这里插入图片描述
    源代码下载链接

    展开全文
  • 图像处理各种畸变

    2020-07-30 23:30:42
    进行图像处理的很好用的代码,C++的,已经测试过了,完全可以使用
  • 相同条件下拍到的棋盘图和日历钟表图,尝试建立几何畸变关系,并对它们进行恢复。
  • [图像]畸变校正详解

    2018-05-25 13:47:22
    首先空间中的一点由 世界坐标系 转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 ( 图像像素坐标系 ) 。详细的可以参考我之前的博客[图像]摄像机标定...

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

    原文链接: 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. 代码实现

    
        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('校正后图像');
    
    

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

    这里写图片描述

    donate

    展开全文
  • 畸变 概念本质 规律 像差 根本原因 单镜头在平面上描绘物体空间远近关系的必然缺陷 能让画面有更强的纵深感 能否补救 由机位和拍摄距离等因素决定的,对于单镜头而言无法补救 可通过技术改善 包含类型 ...
  • 图像畸变校正

    2020-07-21 09:56:27
    本文包为图像畸变校正算法,内涵校正matlab源代码以及双线性插值算法源代码。
  • 一般的针孔相机模型如下: 三维坐标点经过透视投影变换,转换到一个图像平面坐标点。 而相机透镜还存在一定的畸变,包括横向畸变和切向...接下来,对投影坐标,进行畸变处理; 最后,由相机坐标转换到图像坐标。
  • 最近在研究畸变图像畸变矫正问题。网上关于畸变矫正的方法多是采用OpenCV镜头标定的方法,标定出畸变模型参数和镜头内参,再根据参数后向映射得到矫正图像。但是存在这样一种情况:当我们手上只有畸变图像,没有...
  • 一般的针孔相机模型如下: 三维坐标点经过透视投影变换,转换到一个图像平面坐标点。 而相机透镜还存在一定的畸变,包括...接下来,对投影坐标,进行畸变处理; 最后,由相机坐标转换到图像坐标。   在使...
  • 什么是数字图像处理?历史、以及它所研究的内容。 说起图像处理,你会想到什么?你是否真的了解这个领域所研究的内容。纵向来说,数字图像处理研究的历史相当悠久;横向来说,数字图像处理研究的话题相当广泛。 ...
  • 图像畸变的矫正,matlab代码,无需配置环境,里面带实验原图和效果图
  • 透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。 1. 径向畸变 顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的...
  • 图像矫正去畸变

    2018-09-07 21:28:17
    首先空间中的一点由 世界坐标系 转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 ( 图像像素坐标系 ) 。 详细的可以参考我之前的博客...
  • 图像畸变校正技术 MATLAB实现
  • 图像添加径向畸变

    2019-07-30 22:18:52
    通常摄像机的镜头都会有镜头畸变,尤其是广角镜头,在做图像处理中往往会通过摄像机标定获取镜头的畸变系数,然后进行畸变校正。而在某些特殊的情况下,你可能会需要往图像中加入畸变,下面简单实现了一个向无畸变...
  • 畸变校正 畸变 摄像机的成像过程主要是主要涉及到几个坐标系的变换(具体过程可以参考相机模型): Created with Raphaël 2.1.2物体世界坐标 摄像机坐标 图像物理坐标 图像像素坐标 从摄像机成像畸变的...
  • 图像畸变理解

    2020-03-30 10:46:22
    目的:找到正确图像畸变图像像素点之间的映射关系 去畸变过程: ① 已知像素 (u,v)—>计算其对应的归一化坐标(x,y) ② 通过畸变公式计算该归一化坐标对应的畸变归一化坐标(x_distorted,y_distorted) ③ ...
1 2 3 4 5 ... 20
收藏数 5,276
精华内容 2,110
关键字:

图像处理 图像畸变