Algorithm 识别规则网格中的畸变

Algorithm 识别规则网格中的畸变,algorithm,image,matlab,image-processing,image-recognition,Algorithm,Image,Matlab,Image Processing,Image Recognition,给你们一些我正在做的背景:我试图通过图像分析定量记录可压缩流体流动的变化。一种方法是利用流体的折射率与其密度直接相关这一事实。如果在流动后面设置某种图像,由于整个流场中折射率的变化而导致的图像失真会导致密度梯度,这有助于描述流动模式 我有一套程序,可以用规则的2D点模式成功地实现这一点。点图案有点扭曲,通过比较扭曲图像和非扭曲图像中点的位置,我得到了位移场,这正是我需要的。这种方法的问题是分辨率。分辨率仅限于现场的点数,我正在探索提供更多数据的方法 我的一个想法是使用由水平线和垂直线组成的规则网

给你们一些我正在做的背景:我试图通过图像分析定量记录可压缩流体流动的变化。一种方法是利用流体的折射率与其密度直接相关这一事实。如果在流动后面设置某种图像,由于整个流场中折射率的变化而导致的图像失真会导致密度梯度,这有助于描述流动模式

我有一套程序,可以用规则的2D点模式成功地实现这一点。点图案有点扭曲,通过比较扭曲图像和非扭曲图像中点的位置,我得到了位移场,这正是我需要的。这种方法的问题是分辨率。分辨率仅限于现场的点数,我正在探索提供更多数据的方法

我的一个想法是使用由水平线和垂直线组成的规则网格。这张图像也会以同样的方式扭曲,但是我不会只得到一个点的位移,我会得到一个网格的连续扭曲。似乎必须有一些标准的算法或程序来比较一个几何网格与另一个几何网格,并推断出某种位移场。尽管如此,我在研究中还没有发现类似的情况

有没有人有什么想法可以为我指明正确的方向?仅供参考,我不是计算机科学家——我是工程师。我之所以这么说,只是因为可能有一些明显的方法,我因为来自不同的领域而忽略了。但我会编程。我正在使用MATLAB,但我能阅读Python、C/C++等

以下是我正在处理的图像类型的示例:

     Regular:                               Distorted: 

--------

我想您正在寻找算法

来自维基百科:

数字图像相关与跟踪(DIC/DDIT)是一种光学方法,它利用跟踪和图像配准技术对图像变化进行精确的二维和三维测量。这通常用于测量变形(工程)、位移和应变,但在科学和工程的许多领域都有广泛的应用

编辑

在这里,我将DIC算法应用到您的扭曲图像中,使用,显示相对位移

编辑

您还可以轻松确定最大位移区:

编辑

经过一些工作(坦白地说,相当多),你可以得出这样的结果,表示“位移场”,清楚地表明你正在处理一个漩涡:

(更暗和更大的箭头意味着更大的位移(速度))


如果您对Mathematica代码感兴趣,请给我留言。我认为我的代码不会帮助任何人,所以我省略了发布它。

我还建议使用行跟踪算法

只需从图像的第一条像素线开始,然后沿着每一条垂直线向下(你只需要从第一条线开始就可以得到起点。这可以通过一个简单的模式来完成,该模式垂直于该线的梯度,ergo跟随一条线。当你到达一条水平线的交叉点时,你可以测量该点(在x,y坐标中)并将其与扭曲图像中相应的交叉点进行比较

由于你的网格是规则的,你知道第m条垂直黑线上的第n个测量交叉点在两幅图像中都是对应的。然后你只需通过计算它们的距离来比较这两个点。对网格上的每一条线这样做,你就会得到网格的每个交叉点扭曲的程度

这种跟随线算法也用于基本边缘链接算法或Canny边缘检测器


(所有这些都只是理论上的想法,我无法为你提供一个算法。但我想它应该可以很容易地处理扭曲的图像,就像你在那里看到的那样……但也许它对你有帮助)

这太棒了,我想这正是我需要的。谢谢你的快速回答和热情欢迎!@belisarius如果能有更多关于你到底做了什么的细节(直到最后一个数字,速度场):-)@Szabolcs不是真正的“速度”,只是位移。无论如何,这是很棘手的,因为网格变形需要一些工作才能确定哪个源点最终位于何处。最后,边距没有变形这一事实是关键。我会看看是否为后代保存了源代码(:),如果不让我脸红的话,我会将其发布在这里看一看(商业)软件