2011-05-26 58 views
11

一般:我希望我要描述的用例是一個光流問題的簡單情況,因爲我對這個主題沒有太多的知識,所以我想知道如果有人對我如何解決我的問題有任何建議。光流的簡單情況

研究,我已經做了:我已經開始閱讀High Accuracy Optical Flow Estimation Based on a Theory for Warping紙,就準備看在Particle Video紙。我發現一個MATLAB High Accuracy Optical Flow實現光流。然而,論文(和代碼)似乎描述了非常複雜的概念,可能需要很多時間才能深入並理解。我希望解決我的問題可能更簡單。

問題:我有一系列圖像。圖像描繪了材料破損過程,其中材料和背景是黑色的且裂縫是白色的。我有興趣反向掃描圖像序列,試圖將破損過程中形成的所有裂紋映射到第一張黑色圖像。你可以將這些材料想象成一個巨大的謎題,我試圖將這些材料以相反的順序放回到原來的位置。

在每個圖像中,可能會出現一些剛剛出現的裂縫和/或已經完全形成的裂縫(從而產生碎片)。在整個破碎過程中,一些碎片可能會分離並進一步破碎。碎片也可以彼此遠離(後續幀之間的變化很小)。

所需輸出:序列中的所有裂紋/線條都映射到序列中的第一個圖像。

附加說明:圖像以灰度格式(即原始)以及二進制格式提供,其中裂縫已用白色表示並且背景爲完全黑色。請參閱下面的一些圖像示例。

orig_img1 orig_img2 orig_img3

binary_img1 binary_img2 binary_img3

頂行示出了原始圖像和底部行示出了二值圖像。正如你所看到的,隨着圖像序列的進展,中間的裂縫會越來越寬。因此,底部裂縫與下部碎片一起移動。當逆向遍歷序列時,我希望通過算法實現中間裂縫作爲一個整體(並將其正確映射到第一個圖像),並且還正確映射底部裂縫,保持其正確對應(大小和位置)與底部片段。

一個序列通常包含大約30〜40個圖像,所以我剛剛展示了初始子集。而且,儘管這些圖像沒有顯示出來,但是特定的圖像可能只包含裂紋的開始(即其初始外觀),並且在隨後的圖像中它變得越來越長並且可能與其他裂縫結合。

語言:儘管沒有必要,但我想用MATLAB來實現這個解決方案(只是因爲與項目有關的其他大部分代碼都是在MATLAB中完成的)。但是,如果OpenCV可能更容易,我的語言/庫使用靈活。

任何想法,不勝感激。

+2

光流不會爲黑白圖像提供有意義的結果。另外,你的問題沒有詳細說明 - 你想要的輸出是什麼?和往常一樣,示例圖像當然有助於理解設置。 – etarion 2011-05-26 16:48:04

+0

爲什麼最後的圖像不是所需的輸出?碎片可以相互移動嗎? – Andrey 2011-05-26 17:26:27

+1

請確實提供圖片。一般來說,算法需要紋理,並不適合二值圖像。如果您提供了您閱讀過的論文的名稱,而不是指向PDF的鏈接,那麼我會提供幫助。 – 2011-05-26 17:52:36

回答

4

往前而不是反向,並且不使用光流。使用裂縫線分割黑色部分,隨着時間的推移跟蹤每個黑色部分的質心。每當出現穿過黑色段的新裂縫線時,將該段拆分爲兩個,並分別繼續跟蹤每個段。

由此您應該能夠構建代表黑色部分隨時間變化的樹狀結構。骨折線可以作爲元數據添加到該樹中,可能會將骨折線分配給它們首次出現的節點節點。

0

我建議你按照你最初的想法回溯裂縫。喲有點知道裂紋的樣子,所以你可以追蹤所有屬於裂紋的點。您只需使用光學流量跟蹤器跟蹤所有白點,從Lukas-Kanade跟蹤器開始,並查看您的位置。高精度的光流法是一種全球性的更一般的方法,我會跟蹤圖像中的所有像素,試圖在任何地方保持一定的平滑度。 LK是一種局部方法,只需在每個點周圍使用一個小窗口來進行跟蹤。問題是,所有像素的裂縫都是純黑色的,所以沒有任何可以跟蹤的地方,你只需要腰部時間試圖跟蹤你無法跟蹤的東西,而且你不需要跟蹤。 如果線條非常直,您可能會得到所謂的aperture problem,您將得到不準確的結果。你也可以嘗試一些基於蛇的形狀擬合/變形。

0

我同意damian。像HAOF這樣的大多數光學流動方法依賴於強度常數的一階泰勒近似constrian方程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 
相關問題