首页 > 搜索 > meanimage、算法,图像对齐之ECC算法学习笔记

meanimage、算法,图像对齐之ECC算法学习笔记

互联网 2020-10-24 14:36:17
在线算命,八字测算命理

引言

    最近做图像对齐的时候看到一个算法:Enhanced Correlation Coefficient Maximization(ECC),具体使用时遇到了部分图片算法不收敛的问题。Python的Opencv里具体实现函数是findTransformECC,函数源码在C++封装好的.pyd文件中。

    网上关于ECC的内容不太多(也可能是我没找到),为了找算法不收敛原因,前前后后看了很多遍算法论文和源码,好像抓到一些小头绪。感觉不总结一下对不起自己的劳动,就把内容整理整理放在公众号上吧。个人愚见仅供参考,如有错误欢迎指出。

    对齐至少需要两张图片,一张作为模板,用另一张目标图片来匹配模板。ECC算法通过warp矩阵将平移、旋转、裁剪等转换作用在目标图片上,使之最终和模板“重合”。根据warp转换类型不同,算法参数个数也不一样。本文以图片只有平移为例解释算法,参数个数只有2个。

参考资料:

论文信息:

Evangelidis G D , Psarakis E Z . Parametric Image Alignment Using Enhanced Correlation Coefficient Maximization[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2008, 30(10):1858-1865.

算法实现源码链接:

https://github.com/opencv/opencv/blob/c3cf35ab63c04fb1d7b2f6760128f42c20cac0e1/modules/video/src/ecc.cpp

一、论文内容整理

    论文用r标记作为模板的图片,用w标记目标图片warp变换后的结果。下面解释论文中的相关名词:

    算法的最终目的是找到warp矩阵对应的参数p,使下图所示误差最小:

    算法先对两张图进行了标准化处理,然后求其差的平方和,以此衡量转换误差。整理上图所示公式,可以把算法目的转换成求下图所示公式的最大值:

    为了求得上图公式的最大值,论文里使用了迭代的方法,先把p表示为:

头上有个波浪号的表示算法开始迭代时给p设置的初始值,为了计算目标p值,每次迭代都要更新delta_p。此时有下图所示公式:

红色方框圈起来的部分可以表示为Jacobian矩阵G:

warp后的目标图片矩阵表达式可以近似为:

把这个公式代入到rho的表达式里,得到以下近似:

整理之后有:

到此为止,算法目标转换为,将上图公式对delta_p求导,求delta_p取何值时rho最大。

    论文的后半部分是关于上述有关rho和delta_p公式最大值的求解和推导证明过程,好像是用Schwartz不等式求最优解并证明的。算法最后用迭代法求最优解,迭代过程如下(我太懒了不想翻译,凑合看吧。。):

    至此,论文的算法介绍部分结束。需要注意的是,迭代过程中有用到几个概念:delta_p,Jacobian_matrix,lamda,rho,正定矩阵P(似乎P对应算法代码实现里的Hessian矩阵?)等。这些概念在算法源码里都有对应形式的体现。

二、算法源码整理

    算法源码里很多中间变量,作为算法小白和C++半瓶水,我看了三遍才把计算过程理顺溜。。先介绍两个概念吧,A.mul(B)和A.dot(B)。

    C=A.mul(B)   返回值C是矩阵,A、B和C的行、列数均相同,矩阵C第i行第j列的值C(i,j)=A(i,j)*B(i,j)。

    c=A.dot(B)   返回值c是标量,A和B的行、列数均相同,标量c等于上述矩阵C所有元素之和。

(一)函数形参列表

    函数定义时形参列表如下:

templateImage:模板图片

inputImage:目标图片

warpMatrix:warp变换矩阵

motionType:变换类型,有translation、euclidean、affine、homography

                        四种,本文以translation为例进行说明

criteria:算法收敛规则,定义了最大迭代次数maxCount和算法收敛时的最大

               delta_rho(即eps)

inputMask:图片掩膜,和模板图片各像素点进行逻辑与操作

gaussFiltSize:高斯滤波核的维度

    需要注意的是,返回值在C++源码中是double型数据rho,但由于warpMatrix的数据类型是InputOutputArray,好像Python里调用函数时可以返回一个double型变量和一个数组。

(二)初始化

    findTransformECC函数初始化时做了以下几个事情(Xgrid的定义和初始化在translation模式里没有用到,所以没有研究这部分的作用):

1、对templateImage、inputImage和inputMask进行高斯滤波(高斯滤波核默认5*5);

2、求inputImage在行方向和列方向上的梯度,并分别保存在矩阵gradientX和gradientY中,同时对gradientX和gradientY和inputMask进行mul运算(掩膜);

3、定义Jacobian矩阵、Hessian矩阵、各种投影向量、delta_p以及error等(未初始化);

4、定义图片转换时的插值规则和warp变换方式,插值规则在模板图片和目标图片行、列数不同时才会用到;

5、定义初始rho。

(三)迭代循环

    首先是循环终止条件,函数形参列表中的criteria定义了最大迭代次数和迭代终止时的delta_rho值(即eps,算法认为前后两次迭代rho的变化值小于eps时说明没有必要再进行下一次迭代了)。算法在循环控制变量i

免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

相关阅读

一周热门

查看更多