1. 程式人生 > >數字影象處理筆記——邊緣連線和直線檢測(Edge linking and line detection)

數字影象處理筆記——邊緣連線和直線檢測(Edge linking and line detection)

邊緣連線

我們得到邊緣圖以後會出現是一個問題,就是由於有的畫素偏暗,會出現邊緣不連續的現象,這種情況我們就要採用邊緣連線演算法。我們對每一個邊緣上的點進行遍歷,以這個畫素為中心看一個矩形窗內的其他畫素,如果存在邊緣幅度響應M與邊緣相角響應α都與中心畫素差別不太大的畫素,那麼把這個畫素也納為邊界內

 

邊緣跟蹤

現在我們就有一個閉合的邊緣了,那麼我們怎麼樣對邊緣上的點進行排序呢,下圖演示了MOORE邊界跟蹤演算法的步驟

當我們得到上圖所示的順序以後我們就能用鏈式碼對其進行表示,為了能夠將不同角度同一形狀的影象匹配起來,我們可以編碼進行兩步操作:1.重排編碼順序使得編碼總是從最小值開始 2.只對前後方向的差值進行編碼(要注意的是我們需要對差值進行模8操作,即如果前後差為-2,則我們需要對其編碼為6)。我們在matlab中可以用bwtraceboundary函式來對邊緣進行追蹤

 

多邊形擬合

當我們有了邊緣點後如何將他們擬合成一個多邊形呢?多邊形擬合(polygonal fitting)演算法如下

以上演算法可以對圖中的直線進行擬合,但是如果圖中不只有一條直線,而是存在很多條直線呢(很多畫素不只屬於同一條直線)?這種情況下我們有Hough變換來解決這個問題。對於一條直線,我們可以把它的方程寫為法線式

那麼對於過某一點的直線,我們可以得到一個所有可能直線的集合,我們可以把這個集合中直線對應的角度θ和距原點距離ρ畫出來,那麼我們可以知道一條直線上的畫素的曲線都會過同一個點,這個點對應的p和θ,就是這條直線的p和θ。我們如果把影象中所有畫素的曲線畫出來,找到對應通過曲線數最多的部分點,那麼我們可以認為這部分店對應的直線是存在於影象中的。

一下是具體的演算法步驟,在matlab中我們可以用houghlines函式來實現這個功能

舉一個例子如下

最後提的一點就是如果我們想只提取圖中大紋理的直線,我們也可以實現對影象進行平滑處理,再經過hough檢測