2013-01-12 16 views
3

我用直線繪製圖像。 我想檢查這些線是否使用頻域相似。 我在圖像上做了fft,我得到了變換圖像。使用頻域檢測圖像中的平行線

有誰知道我該如何使用變換圖像來查找線是否平行?

+1

您確定需要使用頻域嗎?還有其他方法,如hough變換用於此目的。 –

+1

是的,我知道如何做到這一點與霍夫變形。我想用我從fft –

+0

Noam得到的trnaform圖像找到它,示例圖像將幫助我們瞭解您的問題的級別,即圖像的清晰程度,除了事實之外是否還有關於線條的任何信息它們是否平行等... – bla

回答

4

因此,這裏有兩種情況,使用一些隨機角度或相同的角度,2行可變長度,以及它們的絕對值f fs。 sample img

所以有很多方法可以通過查看它們的fft來判斷它們是否平行,我會給出一個更簡單方向的提示,從fft'ed圖像的中心開始。 ..

+1

謝謝,這真的很有幫助。 我知道fft是對稱的。但是fft圖像中的線條比原始圖像中的線條更粗。 我如何在變換圖像上運行並實際檢查它? –

1

如果您有興趣確定許多等距平行線的週期性,那麼可以使用FFT。在這種情況下,FFT變換後的圖像會給出特定頻率的峯值。通過閾值處理,您還可以擺脫圖像中的這些線條。但是,您實際上不會找到圖像中的線條。

爲了找到平行線,您可以使用其他技術,如:

+2

Thnaks的答案。但我怎麼知道tresholding的價值? –

+1

我不想找到平行線。我只需要使用trandorm圖像來說明這些線是否平行。對或錯。 –

3

如果你只有2行而不是FFT是一個壞主意。這是緩慢而複雜的。

最簡單的實現是平滑圖像。計算梯度角度(atan2(gradY,gradX))而不是將它們放在直方圖中。如果您有一個清晰的峯值 - 線條平行。否則,他們不是。從直方圖中,您還可以知道每條線的角度(局部最大值代表一條線)。

最快運行時間將使用連接組件風格。

  1. 在循環中搜索黑色圖像,直到找到白色像素。這是一個行開始
  2. 遞歸遍歷像素鄰居,直到找到最遠的像素。這是行的末尾
  3. 當您知道起點和終點時,您可以計算每行的斜率atan2(endY-startY,endX-startX)。現在你可以比較分析線條。如果它們的斜率差異超過0.1弧度(5度)的差異,則線條不被視爲平行。該解決方案適用於線中的任意量,同時也給出了每行+數學方程行AX + BY + C = 0

如果你還是堅持FFT的所有像素的名單我建議旋轉原始圖像或FFT圖像,使至少一條線平行於Y軸(FFT表示在X軸上)。比較容易檢查第二行是否平行。如果它們平行,則它們都與y軸對齊,並且意味着整個FFT變換位於X軸上。只要檢查幾個中心行上面的FFT的所有像素都是零。如果不是這樣,則意味着線不平行,因爲第一條線位於FFT圖像的X軸上,第二條線位於上方和下方。 P.s.我沒有解釋如何旋轉圖像,所以至少有一條線與Y軸對齊。如果您在原始圖像上執行此操作,只需計算漸變的方向(角度),找到最大值並旋轉圖像(減去以度爲單位的最大值)。在FFT圖像上,您可以做同樣的事情,因爲圖像中的兩行仍然看起來像FFT中的兩行。

重要注意事項:您的問題得到了許多來自其他人的不準確答案。這裏有一些更正

  1. 不要使用霍夫或氡變換!它相對較慢,對於只有兩條線的簡單任務來說是完全矯枉過正的。
  2. 當你使用FFT時,你實際上可以知道線條的位置。到目前爲止,我們使用FFT的幅度圖像,但也存在相位圖像,並且線條的位置在相位圖像中被編碼。

結束語:我建議您實施我稱爲最快運行時間的解決方案。如果圖像具有N個像素,則平均執行O(N)步驟,而只有FFT至少執行O(N*log(N))步驟。