Matlab实现二维数字图像相关(2D Digital Image Correlation, 2D-DIC)ADIC2D代码复现及原理介绍

Posted ViolentElder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab实现二维数字图像相关(2D Digital Image Correlation, 2D-DIC)ADIC2D代码复现及原理介绍相关的知识,希望对你有一定的参考价值。


前言

由于本人近期正在展开数字图像相关技术用于测量材料形变方向的研究,其中需要对别人现有算法的复现和调研,尽管其中很多算法都已经非常成熟,但对于初学者而言即使明白其中的原理,无法上手实践和操作的话,依然无法能够将其完全的应用起来或者在上面进行创新,我希望能将自己作为一个初学者复现他人代码和学习该原理的过程记录下来,方便每一个涉足该领域的人能更快应用这些知识。

本文所复现的论文——Atkinson D, Becker T. A 117 Line 2D Digital Image Correlation Code Written in MATLAB[J]. Remote Sensing, 2020, 12(18): 2906.1
GitHub源码地址:https://github.com/SUMatEng/ADIC2D.git


这篇论文是让我真正想要将自己正在做的这些事进行记录的源动力,因为这篇文章的作者也是考虑到尽管数字图像相关技术很成熟,但是网络上缺乏可以实操的源码便于理解,从而将简化的代码以及对于原理的解释共享在网络上便于他人学习。非常感谢Devan Atkinson,Thorsten Becker两位作者对于他们知识成果的共享。我将在这里将我学到的东西以中文的形式以方便国内的学者进行进一步的研究。

This paper aims to bridge the gap between the theory and implementation of DIC. It does this by firstly presenting the theory for a 2D, subset based DiC framework that is predominantly consistent with current state-of-the-art practices. 1

一.数字图像相关(Digital Image Correlation)

数字图像相关技术(Digital Image Correlation, DIC) 是广泛应用于刚体结构形变检测的视觉测量技术。它通过在被测物表面投影或绘制随机散斑图案,定义图像的相似度函数,对物体形变前后的两幅图像进行分析即可得到采样点的位移场,从而得到形变2。数字图像相关技术按照其测量的维数,可以被分为二维数字图像相关(Two-Dimensional Digital Image Correlation, 2D-DIC)三维数字图像相关(Three-Dimensional Digital Image Correlation, 3D-DIC)3。如图所示4就是2D-DIC获取形变后子区位移场的过程。

对于数字图像相关而言,其流程可以分为标定、相关运算、位移变换以及最后根据实际需要计算应变或者其他信息四个步骤,标定就是通过一系列拍摄的特定图案的图片,利用标定算法求解出相机图像坐标系与真实世界坐标系下的映射关系,之后我单独写一篇来分享好了,这里主要分享一下相关运算的流程与推导。

二.相关运算

数字图像相关的本质就是在参考图像上设置好子区后,找到形变后图片上对应的已经产生过位移的子区,从而计算出形变子区相对于参考子区在图像坐标系上的位移,最终利用标定好的映射关系求解出该区域在实际物理空间中的位移,最后利用得到的位移计算得到所拍摄表面所发生的形变。在这个过程中参考子区是已知的,但形变后的图片上原本的子区必然发生了变化,其具体位置是未知的,因此如何才能找到和原先参考子区对应的那块区域(求解这一未知量)正是关键所在,这正是相关运算所做的事情。

1.数学模型

我强烈建议大家能一起推导一次这一部分,对于理解相关运算有很大的作用!!

首先设参考图像 F F F,它很多时候代表了 t = 0 t=0 t=0时刻所拍摄到的散斑图案,其上的参考子区设为 f f f

子区的排布有很多种,可以加步进那样整列排布,也可以随机的点选;子区的形状也可以各种各样,矩形、圆型,只要保证相关运算所处理的所有子区为同一种形状、大小的即可。

接下来设形变图像 G G G,其上的形变子区 g g g,如下为一个在相机图像坐标系下的示意图1

图中左上角的矩形框即为参考子区,右下角的平行四边形即为形变子区,其中参考子区 f f f中心点为 x 0 = [ x 0 y 0 ] T \\boldsymbolx^0=\\left[\\beginarrayllx_0 & y_0\\endarray\\right]^T x0=[x0y0]T(后面的公式表达请注意上下标),参考子区上的其他像素点为 x i = [ x i y i ] T \\boldsymbolx^i=\\left[\\beginarrayllx_i & y_i\\endarray\\right]^T xi=[xiyi]T。以中心点 x 0 \\boldsymbolx^0 x0作为参考,我们可以得到
x i = Δ x i x 0 + x o = [ x i y i ] = [ Δ x i Δ y i ] + [ x 0 y 0 ] \\boldsymbolx^i=\\Delta \\boldsymbolx^i \\boldsymbolx^0+\\boldsymbolx^o=\\left[\\beginarrayl x_i \\\\ y_i \\endarray\\right]=\\left[\\beginarrayl \\Delta x_i \\\\ \\Delta y_i \\endarray\\right]+\\left[\\beginarrayl x^0 \\\\ y^0 \\endarray\\right] xi=Δxix0+xo=[xiyi]=[ΔxiΔyi]+[x0y0]其中 Δ x i x 0 \\Delta \\boldsymbolx^i \\boldsymbolx^0 Δxix0表示 x 0 \\boldsymbolx^0 x0 x i \\boldsymbolx^i xi的坐标偏移。现在我们设置形变子区中与之前 x i \\boldsymbolx^i xi相对应的当前坐标点为 x i ′ = [ x i ′ y i ′ ] T \\boldsymbolx^i' =\\left[\\beginarrayllx_i' & y_i'\\endarray\\right]^T xi=[xiyi]T,与之前中心点 x 0 \\boldsymbolx^0 x0相对应的形变子区中心点为 x d \\boldsymbolx^d xd。与上式同理,我们同样可以得到 x i ′ \\boldsymbolx^i' xi的表达式为
x i ′ = Δ x i ′ x 0 + x o = [ x i ′ y i ′ ] = [ Δ x i ′ Δ y i ′ ] + [ x 0 y 0 ] \\boldsymbolx^i'=\\Delta \\boldsymbolx^i' \\boldsymbolx^0+\\boldsymbolx^o=\\left[\\beginarrayl x_i' \\\\ y_i' \\endarray\\right]=\\left[\\beginarrayl \\Delta x_i' \\\\ \\Delta y_i' \\endarray\\right]+\\left[\\beginarrayl x^0 \\\\ y^0 \\endarray\\right] xi=Δxix0+xo=[xiyi]=[ΔxiΔyi]+[x0y0]其中 Δ x i ′ x 0 \\Delta \\boldsymbolx^i' \\boldsymbolx^0 Δxix0表示 x 0 \\boldsymbolx^0 x0 x i ′ \\boldsymbolx^i' xi的坐标偏移。注意,没有使用形变子区中心点作为参考点,是有两个原因的,第一个原因是由于本身 x d \\boldsymbolx^d x以上是关于Matlab实现二维数字图像相关(2D Digital Image Correlation, 2D-DIC)ADIC2D代码复现及原理介绍的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB实现图像的傅立叶变换

将图像从圆柱体内部投影到二维平面 [Matlab]

计算下列数字两个图像块的二维DFT和二维DCT,并用Matlab编程验证计算结果

计算下列数字两个图像块的二维DFT和二维DCT,并用Matlab编程验证计算结果

手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI

手写数字识别基于支持向量机SVM实现手写数字识别matlab源码含GUI