11

一般:我希望我将要描述的用例是一个光流问题的简单案例,由于我对此主题了解不多,我想知道是否有人对我的方法有任何建议可以解决我的问题。

我已经完成的研究:我已经开始阅读基于翘曲理论的高精度光流估计论文,并计划查看粒子视频论文。我找到了光流的 MATLAB高精度光流实现。然而,论文(和代码)似乎描述了非常复杂的概念,我可能需要很多时间来挖掘和理解。我希望我的问题的解决方案可能更简单。

问题:我有一系列图像。图像描绘了材料破损过程,其中材料和背景为黑色,裂缝为白色。我有兴趣反向遍历图像序列,以尝试将破损过程中形成的所有裂缝映射到第一个黑色图像。你可以把这些材料想象成一个大拼图,我试图按照它们破坏的相反顺序将这些碎片重新组合在一起。

在每个图像中,可能会有一些刚刚出现的裂缝和/或一些已经完全形成的裂缝(并因此产生了一个片段)。在整个破碎过程中,一些碎片可能会分离并进一步破碎。片段也可以彼此远离(后续帧之间的变化很小)。

期望的输出:序列中的所有裂缝/线都映射到序列中的第一个图像。

附加说明:图像以灰度格式(即原始)和二进制格式提供,其中裂缝已用白色勾勒出来,背景是完全黑色的。请参阅下面的一些图像示例。

orig_img1 orig_img2 orig_img3

binary_img1 binary_img2 binary_img3

顶行显示原始图像,底行显示二值图像。正如你所看到的,随着图像序列的进行,中间的裂缝会变得越来越宽。因此,底部裂纹与下部碎片一起移动。当反向遍历序列时,我希望通过算法实现中间裂缝作为一个整体(并将其正确映射到第一张图像),并正确映射底部裂缝,保持其正确的对应关系(大小和位置)与底部片段。

一个序列通常包含大约 30~40 张图像,所以我只展示了开始的子集。此外,虽然这些图像没有显示它,但特定图像可能仅包含裂缝的开始(即其初始外观),并且在随后的图像中它变得越来越长并且可能与其他裂缝连接。

语言:虽然没有必要,但我想使用 MATLAB 来实现该解决方案(因为与该项目相关的大部分其他代码已在 MATLAB 中完成)。但是,如果 OpenCV 可能更容易,我可以灵活地使用我的语言/库。

任何想法都非常感谢。

4

3 回答 3

4

向前遍历而不是反向遍历,并且不要使用光流。使用断裂线分割黑色部分,随着时间的推移跟踪每个黑色部分的质心。每当出现穿过黑色段的新断裂线时,将该段分成两部分并继续分别跟踪每个段。

由此,您应该能够构建一个树结构,表示随着时间的推移对黑色部分的分割。断裂线可以作为元数据添加到这棵树,也许将断裂线分配给它们首次出现的段节点。

于 2011-06-13T08:35:19.000 回答
0

我会建议你按照你最初的想法回溯裂缝。哟有点知道裂缝的样子,所以你可以跟踪属于裂缝的所有点。您只需使用光流跟踪器跟踪所有白点,从 Lukas-Kanade 跟踪器开始,看看您会得到什么。高精度光流法是一种全局性的,更通用的,我会跟踪图像中的所有像素,试图在任何地方保持一些平滑度。LK 是一种局部方法,它只会在每个点周围使用一个小窗口来进行跟踪。问题是,除了裂缝之外,所有像素都是纯黑色的,所以在那里没有什么可以追踪的,你只会花时间试图追踪你无法追踪且不需要追踪的东西。如果线条很直,你可能会得到什么'你会得到不准确的结果。您还可以尝试一些基于蛇的形状拟合/变形。

于 2013-08-01T16:14:40.180 回答
0

我同意达米安。大多数光流方法(如 HAOF)依赖于强度常数约束方程 I(x,t)=I(x+v,t+dt) 的一阶泰勒近似。这意味着解决方案取决于图像导数,其中梯度确定运动矢量幅度和角度,即您需要一定数量的纹理。但是,非二值化图像的纹理非常低就足够了。您可以尝试直方图均衡化来增加输入数据的对比度,但重要的是对两个输入图像应用相同的转换。例如如下:

cv::Mat equalizeMat(grayInp1.rows, grayInp1.cols * 2 , CV_8UC1);
grayInp1.copyTo(equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows))); 
grayInp2.copyTo(equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows)));
cv::equalizeHist(equalizeMat,equalizeMat);
equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows)).copyTo(grayInp1);
equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows)).copyTo(grayInp2);
// estimate optical flow
于 2015-11-16T22:23:35.200 回答