首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用单应性描述两个图像之间的非线性变换

使用单应性描述两个图像之间的非线性变换
EN

Stack Overflow用户
提问于 2013-01-19 02:53:29
回答 1查看 2.5K关注 0票数 7

已经在两个图像上的蓝点之间建立了一对一的点匹配。image2是image1的扭曲版本。失真模型似乎是眼镜片的失真。问题是:有没有办法计算一个描述这种转变的变换矩阵。实际上是一个矩阵,它将第一张图像上的蓝点转换为第二张图像上相应的蓝点?这里的问题是我们不知道焦距(意味着图像未校准),但是我们在两张图像上大约200个点之间有完美的匹配。

失真的图像:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-22 21:52:46

我认为你正在尝试做的事情可以被视为一个失真校正问题,而不需要传统的相机校准的其余部分。

矩阵变换是线性变换,线性变换总是将直线映射为直线(http://en.wikipedia.org/wiki/Linear_map)。从图中可以明显看出,变换是非线性的,因此您不能用矩阵运算来描述它。

也就是说,您可以使用像OpenCV (http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html)使用的镜头失真模型,并且获得系数应该不是很困难。以下是您可以在Matlab中执行的操作:

将(x,y)称为原始点(上图)的坐标,将(xp,yp)称为变形点(下图)的坐标,两者都移动到图像的中心,并除以比例因子(x和y相同),因此它们或多或少位于-1,1区间内。失真模型为:

代码语言:javascript
复制
x = ( xp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*xp*yp + p2*(r^2 + 2*xp^2));
y = ( yp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p2*xp*yp + p1*(r^2 + 2*yp^2));

哪里

代码语言:javascript
复制
r = sqrt(x^2 + y^2);

您有5个参数:用于径向和切向扭曲的k1、k2、k3、p1、p2和200对点,因此您可以求解非线性系统。

确保工作区中存在x、y、xp和yp数组,并将其声明为全局数组:

代码语言:javascript
复制
global x y xp yp

编写一个函数来计算给定一组任意失真系数的均方误差,假设它被称为'dist':

代码语言:javascript
复制
function val = dist(var)

global x y xp yp

val = zeros(size(xp));

k1 = var(1);
k2 = var(2);
k3 = var(3);
p1 = var(4);
p2 = var(5);

r = sqrt(xp.*xp + yp.*yp);
temp1 = x - ( xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2));
temp2 = y - ( yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2));
val = sqrt(temp1.*temp1 + temp2.*temp2);

用‘fsolve’解算系统:

代码语言:javascript
复制
[coef, fval] = fsolve(@dist, zeros(5,1));

“coef”中的值是您要查找的失真系数。要纠正原始集合中不存在的新点(xp,yp)的扭曲,请使用以下公式:

代码语言:javascript
复制
r = sqrt(xp.*xp + yp.*yp);
x_corr = xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2);
y_corr = yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2);

结果将移动到图像的中心,并根据上面使用的因子进行缩放。

备注:

  • 坐标必须移动到图像的中心,因为失真相对于它是对称的。
  • 应该没有必要归一化到-1,1的间隔,但这样做是必要的,因此获得的失真系数或多或少是相同的数量级(使用像素坐标的2,4和6次方将需要非常小的coefficients).
  • This方法不需要图像中的点在统一的网格中。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14405659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档