基于特征的图像拼接算法_图像拼接算法原理

基于特征的图像拼接算法_图像拼接算法原理目录APAP算法思路几个问题SVD在最小二乘中的应用DLT求单应性矩阵HMovingDLT求局部单应性矩阵实现的小细节文献图像拼接首先通过一些手段(标定、SIFT等特征点、其他传感器等)获取图像间的对应关系(2D-2D)。这个对应关系可以用单应性矩阵HHH(也称透视变换)描述[x′y′w′]=[h00h01h02h10h11h12h20h21h22][xyw]=H[xyw](1)\begin{aligned}\left[\begin{matrix}x’\\y’\\w’\end{matrix}\ri

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


图像拼接首先通过一些手段(标定、SIFT等特征点、其他传感器等)获取图像间的对应关系(2D-2D)。

这个对应关系可以用单应性矩阵 H H H(也称透视变换)描述
[ x ′ y ′ w ′ ] = [ h 00 h 01 h 02 h 10 h 11 h 12 h 20 h 21 h 22 ] [ x y w ] = H [ x y w ] (1) \begin{aligned}\left[\begin{matrix}x’\\y’\\w’\end{matrix}\right]=&\left[\begin{matrix}h_{00}&h_{01}&h_{02}\\h_{10}&h_{11}&h_{12}\\h_{20}&h_{21}&h_{22}\end{matrix}\right]\left[\begin{matrix}x\\y\\w\end{matrix}\right]\\=&H\left[\begin{matrix}x\\y\\w\end{matrix}\right]\end{aligned} \tag{1} xyw==h00h10h20h01h11h21h02h12h22xywHxyw(1)

但上述思路的前提是:待拼接的目标处于或者近似处于同一平面。否则就会产生遮挡和角度差异,从而造成拼接图的“虚影”
在这里插入图片描述
                                                 图1. 由于相机角度差异造成的虚影现象(红圈)

针对上述问题,Autostitch(OpenCV实现的方法)和Photosynth等方法走的是一个全局H + 虚影后处理的路线;
APAP【1】算法则使用多个局部H的方式尝试在拼接时就尽可能精确。


APAP算法思路

APAP算法官方主页提供了matlab的源码
Github上有第三方实现的C++代码

算法以A图为基准,首先计算B图到A图的全局变换 H H H(DLT方法),
然后将B图等间距划分小网格,逐个计算B图每个小网格与A图的局部变换 H ∗ H_* H(Moving DLT方法),
最后将B图每个网格内的点按对应的 H ∗ H_* H做局部变换,与A图融合。

在这里插入图片描述
                                                        图2. 网格局部变换(摘自APAP论文)


几个问题

SVD在最小二乘中的应用

参考博文《SVD之最小二乘【推导与证明】》

– 模型 A x = b Ax=b Ax=b的求解
A A A尺寸为 m × n m\times n m×n,且 m > n m>n m>n(超定问题)
则优化目标为 m i n ∣ ∣ A x − b ∣ ∣ min||Ax-b|| minAxb

首先对 A A A做SVD分解,有
A = U Σ V T (2) A=U\Sigma V^T \tag{2} A=UΣVT(2)
其中 U U U V V V分别称为 A A A的左、右奇异向量,满足正交性(即 U T = U − 1 U^T=U^{-1} UT=U1
Σ \Sigma Σ为对角阵,对角元素是 A A A的奇异值

将式(2)代入目标函数,有
m i n ∣ ∣ A x − b ∣ ∣ → m i n ∣ ∣ U Σ V T x − b ∣ ∣ → m i n ∣ ∣ Σ V T x − U T b ∣ ∣ ( 正 交 性 ) → m i n ∣ ∣ Σ y − b ′ ∣ ∣ ( 令 y = V T x , b ′ = U T b ) (3) \begin{aligned}&min||Ax-b||\\&\rightarrow min||U\Sigma V^Tx-b||\\&\rightarrow min||\Sigma V^Tx-U^Tb|| (正交性) \\&\rightarrow min||\Sigma y-b’|| (令y=V^Tx,b’=U^Tb)\end{aligned} \tag{3} minAxbminUΣVTxbminΣVTxUTb()minΣyb(y=VTx,b=UTb)(3)
注意到 Σ \Sigma Σ是一个对角阵,令 λ i \lambda_i λi为其对角线元素,则有
y i = b i ′ λ i x = V y (4) y_i=\frac{b’_i}{\lambda_i}\\x=Vy \tag{4} yi=λibix=Vy(4)

– 模型 A x = 0 Ax=0 Ax=0的求解
A A A尺寸为 m × n m\times n m×n,且 m > n m>n m>n ∣ ∣ x ∣ ∣ = 1 ||x||=1 x=1
则优化目标为 m i n ∣ ∣ A x ∣ ∣ min||Ax|| minAx

首先对优化目标做等价变化:
m i n ∣ ∣ A x ∣ ∣ ⇒ m i n ∣ ∣ x T A T A x ∣ ∣ (5) min||Ax||\Rightarrow min||x^TA^TAx|| \tag{5} minAxminxTATAx(5)
A A A做SVD分解(式2),考虑到 U V UV UV的正交性,则有
A T A = V T Σ T U T U Σ V T = V Σ T Σ V T = V [ λ 0 2 ⋱ λ n 2 ] V T = λ 0 2 v 0 v 0 T + . . . + λ n 2 v n v n T (6) \begin{aligned}A^TA=&V^T\Sigma^TU^TU\Sigma V^T\\=&V\Sigma^T\Sigma V^T\\=&V\left[\begin{matrix}\lambda_0^2\\&\ddots\\&&\lambda_n^2\end{matrix}\right]V^T\\=&\lambda_0^2v_0v_0^T+…+\lambda_n^2v_nv_n^T\end{aligned} \tag{6} ATA====VTΣTUTUΣVTVΣTΣVTVλ02λn2VTλ02v0v0T+...+λn2vnvnT(6)
其中 λ 0 . . . λ n \lambda_0…\lambda_n λ0...λn由大到小排列

x = ∑ k i t i x=\sum{k_it_i} x=kiti,其中 t i t_i ti为基向量,结合向量正交性质,则有
x T A T A x = λ 0 2 k 0 2 t 0 T v 0 v 0 T t 0 + . . . + λ n 2 k n 2 t n T v n v n T t n = λ 0 2 k 0 2 + . . . + λ n 2 k n 2 (7) \begin{aligned}x^TA^TAx=&\lambda_0^2k_0^2t_0^Tv_0v_0^Tt_0+…+\lambda_n^2k_n^2t_n^Tv_nv_n^Tt_n\\=&\lambda_0^2k_0^2+…+\lambda_n^2k_n^2\end{aligned} \tag{7} xTATAx==λ02k02t0Tv0v0Tt0+...+λn2kn2tnTvnvnTtnλ02k02+...+λn2kn2(7)
由于 ∣ ∣ x ∣ ∣ = 1 ||x||=1 x=1,则 ∑ k i 2 = 1 \sum{k_i^2}=1 ki2=1
式(7)取最小时有 k n = 1 , k i ( i ≠ n ) = 0 k_n=1,k_i(i\neq n)=0 kn=1,ki(i=n)=0
此时 x = v n x=v_n x=vn,即最小奇异值 λ n \lambda_n λn对应的特征向量


DLT求单应性矩阵H

理论上8个自由度的单应性矩阵 H H H只需要4组数据就可以唯一求解
但实际中考虑到数据的误差,一般希望通过多于4组的数据逼近真实值,此时 H H H的求解属于一个超定问题

将式(1)展开,同时令 w = 1 w=1 w=1,有
h 00 x + h 01 y + h 02 − h 20 x ′ x − h 21 x ′ y − h 22 x ′ = 0 h 10 x + h 11 y + h 12 − h 20 x y ′ − h 21 y ′ y − h 22 y ′ = 0 (8) h_{00}x+h_{01}y+h_{02}-h_{20}x’x-h_{21}x’y-h_{22}x’=0\\h_{10}x+h_{11}y+h_{12}-h_{20}xy’-h_{21}y’y-h_{22}y’=0 \tag{8} h00x+h01y+h02h20xxh21xyh22x=0h10x+h11y+h12h20xyh21yyh22y=0(8)

A h = 0 (9) Ah=0 \tag{9} Ah=0(9)
其中
A = [ x y 1 0 0 0 − x ′ x − x ′ y − x ′ 0 0 0 x y 1 − x y ′ − y ′ y − y ′ ] (10) A=\left[\begin{matrix}x&y&1&0&0&0&-x’x&-x’y&-x’\\0&0&0&x&y&1&-xy’&-y’y&-y’\end{matrix}\right] \tag{10} A=[x0y0100x0y01xxxyxyyyxy](10)
h = [ h 00 h 01 . . . h 21 h 22 ] T (11) h=\left[\begin{matrix}h_{00}&h_{01}&…&h_{21}&h_{22}\end{matrix}\right]^T \tag{11} h=[h00h01...h21h22]T(11)

根据(9)式,得优化目标
h ′ = m i n ∣ ∣ A h ∣ ∣ (12) h’=min||Ah|| \tag{12} h=minAh(12)
通过上一节 A x = 0 Ax=0 Ax=0模型求解的讨论,可知只需对 A A A做SVD分解,取 v n v_n vn即为所求。


Moving DLT求局部单应性矩阵

APAP算法在利用DLT求得全局单应性矩阵 H H H的基础上,对每个小格子应用式(13)求得局部修正矩阵
h ∗ = m i n ∣ ∣ W ∗ A h ∣ ∣ (13) h_*=min||W_*Ah|| \tag{13} h=minWAh(13)
对比式(12),局部单应性其实只是对 A A A乘以了不同的权重

算法通过计算每个像素与格子左上角的坐标的欧式距离确定上述权重
w i = m a x ( e − ∣ ∣ x ∗ − x i ∣ ∣ 2 / σ 2 , α ) (14) w_i=max(e^{-||x_*-x_i||^2/\sigma^2},\alpha) \tag{14} wi=max(exxi2/σ2,α)(14)
注: W ∗ A W_*A WA是对式(10)内的值做[0,1]加权,如果只是取0或者1比较好理解。但取中间的数,不知道能不能从数学上严格推导?


实现的小细节

1)找到两张图对应的特征点后,需要将这些点的坐标归一化到均值为0,标准差 2 \sqrt{2} 2

  float cx = mat.col(0).mean();
  float cy = mat.col(1).mean();
  mat.array().col(0) -= cx;
  mat.array().col(1) -= cy;
  
  float sqrt_2 = sqrt(2);
  float meandist = (mat.array().col(0)*mat.array().col(0) + mat.array().col(1)*mat.array().col(1)).sqrt().mean();
  float scale = sqrt_2/meandist;
  mat.leftCols<2>().array() *= scale; 

  T << scale, 0, -scale*cx, 0, scale, -scale*cy, 0, 0, 1;

通过转换后的坐标计算 H ′ H’ H,然后通过 T T T恢复到 H H H
2) 图像拼接的时候首先根据B图warp后的4个顶点确定A图需要做的offX和offY
然后利用4邻域插值反向查找warp后的B图在原始B图中的位置


文献

【1】Zaragoza J, Chin T J, Brown M S, et al. As-projective-as-possible image stitching with moving DLT[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2013: 2339-2346.


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190681.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Nginx 和 Apache 安装[通俗易懂]

    Nginx 和 Apache 安装[通俗易懂]Nginx和Apache安装Nginx安装Ubuntu下安装CentOS下安装安装依赖下载并解压Nginx创建www用户运行configure文件检测程序编译安装创建软连接在init.d中创建nginx启动Nginx配置防火墙端口Apache安装Ubuntu下安装CentOS下安装安装依赖安装apr安装apr-util安装httpd在init.d中创建软连接启动Nginx安装Ubuntu下安装sudoapt-getinstallnginx–upgr

    2022年5月26日
    40
  • 解决ajax跨域问题【5种解决方案】「建议收藏」

    解决ajax跨域问题【5种解决方案】「建议收藏」什么是跨域问题?跨域问题来源于JavaScript的”同源策略”,即只有协议+主机名+端口号(如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题。查看浏览器开发者工具Console报错:Failedtoloadhttp://a.a.com:8080/A/…

    2022年8月24日
    10
  • js数组反转的几种方法「建议收藏」

    js数组反转的几种方法「建议收藏」第一种:创建一个新数组使用reverse()的方法进行反转。letarr=[1,2,3,4]letarr1=arr.reverse()console.log(arr1);//[4,3,2,1]第二种:利用数组循环,使用unshift()方法将新项添加到数组的开头,并返回新的长度。unshift()方法会改变数组的长度。letarr2=[1,2,3,4]letarr3=[]arr2.forEach((element)=>{..

    2022年6月1日
    135
  • idea激活码2021分享【2021.10最新】

    (idea激活码2021分享)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1STL…

    2022年3月27日
    99
  • 内外网数据库同步方式「建议收藏」

    内外网数据库同步方式「建议收藏」项目环境:公司中心有一个数据库,产品部署地有多个,每个部署地是一个局域网,部署地内有一台对外通讯的服务器(可能会断网)。项目需要将每个部署地的部分数据,同步到中心数据库。基本思路:在需要同步的数据库的说明中添加Update标识,在需要同步的表中添加UpdateDate字段。在每一天的0点时候,会执行一次同步,根据UpdateDate字段进行时间比对,同步会遍历当前数据库的所以后表,如果表中包含

    2022年10月16日
    4
  • Linux从入门到指令详解

    Linux从入门到指令详解一、概述我们为什么要学习Linuxlinux诞生了这么多年,以前还喊着如何能取代windows系统,现在这个口号已经小多了,任何事物发展都有其局限性都有其天花板。就如同在国内再搞一个社交软件取代腾讯一样,想想而已基本不可能,因为用户已经习惯于使用微信交流,不是说技术上实现不了解而是老百姓已经习惯了,想让他们不用,即使他们自己不用亲戚朋友还是要用,没有办法的事情。用习惯了windows操作系统,再让大家切换到别的操作系统基本上是不可能的事情,改变一个人已经养成的习惯太难。没有办法深入到普通老百姓的生

    2022年6月5日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号