这个例子使用符号数学工具箱开发了一个数学模型来恢复图像的失真,并在活动脚本中提供了一个局部函数。
任何实世界点 可以根据某个三维世界原点来定义。
相对于相机镜头,这个三维点可以定义为 ,通过旋转和平移得到 .
=
三维点 作为一个二维点投影到相机的图像平面上,( , ).
,
当相机捕捉图像时,它并不是精确地捕捉到真实的点,而是真实点的一个稍微扭曲的版本,可以表示为( , ).被扭曲的点可以用以下函数来描述:
地点:
, =透镜的径向畸变系数
, =透镜的切向失真系数
透镜畸变的一个例子如下所示;原始扭曲图像(左)和未扭曲图像(右)。
请注意第一张图像中线条边缘的曲率。对于像图像重建和跟踪这样的应用,知道点的真实位置是很重要的。当我们有一个扭曲的图像时,我们知道扭曲的像素位置( , ).我们的目标是确定未失真的像素位置( , )给( , )和特定镜头的失真系数。
虽然其他方面都很简单,但透镜失真的非线性本质使这个问题具有挑战性。
我们首先定义我们的扭曲模型:
%的参数信谊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积极的eq = X == X
eq1 =
eq = Y == Y
eq2 =
定义给定畸变系数的畸变方程,求解未畸变的像素位置( , ).
参数= [k_1 k_2 p_1 p_2];parameterValues = [0.2 0 0 0];扩展(subs(eq1, parameters, parameterValues))
eq1 =
eq2 = expand(subs(eq2, parameters, parameterValues))
eq2 =
解([eq1, eq2], [x,y],“MaxDegree”3,“真实”的,真正的)
结果=结构体字段:X: [1x1 sym] y: [1x1 sym]
由于元素1是唯一的实际解,我们将把这个表达式提取到它自己的变量中。
[结果。xResult.y]
ans =
现在我们有了像素位置X和Y的解析表达式,我们可以使用它来消除图像的失真。
函数plotLensDistortion (distortionX distortionY、参数parameterValues)% distortionX是描述扭曲的x坐标的表达式% distortionY是描述扭曲的y坐标的表达式% k1和k2为径向畸变系数% p1和p2为切向畸变系数信谊xy%这是图像上的网格间距间隔= 0.2%检查并参数化代入k_1 k_2 p_1 p_2的值convert = subs(convert,parameters,parameterValues)%在网格上循环为x_i = 1:间隔:1为y_j = 1:间隔:1%计算扭曲的位置xout = subs(哈哈图x, {x,y}, {x_i,y_j});yout = subs(distortionY, {x,y}, {x_i,y_j});画出原始点情节(x_i y_j,“o”,“颜色”,[1.0, 0.0, 0.0])保持在用Quiver绘制扭曲方向p1 = [x_i, y_j];%第一点p2 = (xout,你);%的第二点dp = p2-p1;%的差异箭袋(p1 (1) p1 (2), dp (1), dp (2),自动定量的,“关闭”,“MaxHeadSize”,1,“颜色”(0 0 1))结束结束持有从网格在结束