开发一个算法Undistorting图像
这个例子使用符号数学工具箱开发数学模型™undistort图像和本地生活脚本函数的特性。
背景
任何现实点 可以定义一些3 d世界的起源。
相对于相机镜头,这可以被定义为3 d点 通过旋转和翻译 。
=
三维点 然后投射到摄像机的图像平面上二维点,( , )。
,
当照相机捕捉图像,它不精确捕捉真正的点,而是一个轻微的扭曲版本的真实点可以表示( , )。扭曲的点可以被描述使用以下功能:
地点:
, =镜头的径向畸变系数
, =镜头切向畸变系数
失真
透镜畸变的一个示例如下所示;原始扭曲图像(左)和无畸变的图像(右)。
注意线的曲率对第一图像的边缘。图像重建和跟踪等应用,重要的是要知道现实世界的位置点。当我们有一个扭曲的形象,我们知道扭曲的像素位置( , )。这是我们的目标来确定无畸变的像素位置( , )给( , )和特定的镜头的畸变系数。
否则直接时,镜头畸变的非线性性质使问题的挑战。
定义变形模型
我们首先定义我们的畸变模型:
%的参数信谊k_1k_2p_1p_2真正的信谊rxydistortionX =潜艇(x * (1 + k_1 * r ^ 2 + k_2 * r ^ 4) + 2 * p_1 * x * y + p_2 * (r ^ 2 + 2 * x ^ 2), r, sqrt (x ^ 2 + y ^ 2))
distortionX =
distortionY =潜艇(y) * (1 + k_1 * r ^ 2 + k_2 * r ^ 4) + 2 * p_2 * x * y + p_1 * (r ^ 2 + 2 * y ^ 2), r, sqrt (x ^ 2 + y ^ 2))
distortionY =
径向畸变
我们把一个网格像素位置的假设我们的镜头径向畸变系数 。注意,失真最小的中心附近最大图像和边缘附近。
%设置参数参数= (k_1 k_2 p_1 p_2];parameterValues = [0 0 0 0];plotLensDistortion (distortionX distortionY、参数parameterValues)
间隔= 0.2000
distortionX =
distortionY =
径向畸变
探讨变化的敏感性 。
%设置参数参数= (k_1 k_2 p_1 p_2];parameterValues = (0.15 0 0 0);plotLensDistortion (distortionX distortionY、参数parameterValues)
间隔= 0.2000
distortionX =
distortionY =
计算逆畸变模型
给定一个相机镜头畸变系数和扭曲的像素位置的一组( , ),我们希望能够计算无畸变的像素位置( , )。我们将看看具体情况所有除了失真系数是零 等于0.2。
我们首先定义畸变系数。
信谊XY积极的eq1 = X = = distortionX
eq1 =
eq2 = Y = = distortionY
eq2 =
我们定义的变形方程给出畸变系数,求出无畸变的像素位置( , )。
参数= (k_1 k_2 p_1 p_2];parameterValues = (0.2 0 0 0);eq1 =扩大(潜艇(eq1、参数parameterValues))
eq1 =
eq2 =扩大(潜艇(eq2、参数parameterValues))
eq2 =
结果=解决([eq1 eq2], (x, y),“MaxDegree”3,“真实”的,真正的)
结果=结构体字段:x: (x * (((5 * Y ^ 3) / (2 * (x ^ 2 + Y ^ 2)) + ((25 * Y ^ 6) / (4 * (x ^ 2 + Y ^ 2) ^ 2) + (125 * Y ^ 6) / (27 * (x ^ 2 + Y ^ 2) ^ 3)) ^ (1/2)) ^ (1/3)——(5 * Y ^ 2) / (3 * (x ^ 2 + Y ^ 2) * ((5 * Y ^ 3) / (2 * x ^ 2 + Y ^ 2 * 2) + ((25 * Y ^ 6) / (4 * (x ^ 2 + Y ^ 2) ^ 2) + (125 * Y ^ 6) / (27 * (x ^ 2 + Y ^ 2) ^ 3)) ^ (1/2)) ^ (1/3)))) / Y Y: ((5 * Y ^ 3) / (2 * (x ^ 2 + Y ^ 2)) + ((25 * Y ^ 6) / (4 * (x ^ 2 + Y ^ 2) ^ 2) + (125 * Y ^ 6) / (27 * (x ^ 2 + Y ^ 2) ^ 3)) ^ (1/2)) ^ (1/3)——(5 * Y ^ 2) / (3 * (x ^ 2 + Y ^ 2) * ((5 * Y ^ 3) / (2 * x ^ 2 + Y ^ 2 * 2) + ((25 * Y ^ 6) / (4 * (x ^ 2 + Y ^ 2) ^ 2) + (125 * Y ^ 6) / (27 * (x ^ 2 + Y ^ 2) ^ 3)) ^ (1/2)) ^ (1/3)
因为元素1是唯一能解决问题的,我们将这个表达式提取到自己的变量。
[结果。xResult.y]
ans =
现在我们有像素位置的解析表达式,X和Y,我们可以使用它来undistort图像。
函数绘制镜头畸变
函数plotLensDistortion (distortionX distortionY、参数parameterValues)% distortionX是扭曲的x坐标表达式描述% distortionY是扭曲的y坐标表达式描述% k1和k2的径向畸变系数% p1和p2是切向畸变系数信谊xy%这是在图像网格间距间隔= 0.2%检查和参数化代入的值k_1 k_2 p_1 p_2distortionX =潜艇(distortionX、参数parameterValues) distortionY =潜艇(distortionY、参数parameterValues)%遍历网格为x_i = 1:间隔:1为y_j = 1:间隔:1%计算扭曲的位置xout =潜艇(distortionX {x, y}, {x_i, y_j});你=潜艇(distortionY {x, y}, {x_i, y_j});%画出原始点情节(x_i y_j,“o”,“颜色”,1.0,0.0,0.0)在%画出变形方向与颤抖p1 = [x_i, y_j];%第一点p2 = (xout,你);%的第二点dp = p2-p1;%的差异箭袋(p1 (1) p1 (2), dp (1), dp (2),自动定量的,“关闭”,“MaxHeadSize”,1“颜色”(0 0 1))结束结束持有从网格在结束