LSD算法是一個直線提取算法,在opencv 中也有封裝,它的主要思想是通過求導得到灰度的梯度,因為灰度梯度的方向的垂直方向就是線條的方向,將有相同方向的向量用矩形圈起來,再將舉行精細化,最后就可以得到的一條線段了。
關於它的文章和算法和demo基本上可以在這里找到。
這篇文章里引入了很多名詞,切聽我一一道來。首先,我們看下圖,這里的圖片首先根據梯度的垂線構造了一個level-line field,它把和梯度的垂直方向的線叫做level-line,所以這個field就是由這樣的線組成的場。有了這個場,因為有直線的區域我們總能夠找到,很多方向相同的level-line,這樣我們就能得到右邊這些顏色區域了,也就是所謂的line support region。
如果把這個區域用舉行圈起來的話就得到了如下圖所示的矩形,注意這個舉行我們是區分方向的。
至於,是根據什么規則生成的矩形,就像之前說的,在直線的區域,自然地level-line(梯度方向的垂線)自然就會比較接近,因此,我們就給定一個閾值\(/tau\),如果這些向量的夾角小於\(/tau\)且在這個區域內滿足條件的向量足夠多,我們就認為這個區域可能是直線,比如下圖中,就只有8個符合條件的level-line,感覺是不足夠多的,因此它可能不被看作是一個直線。具體地,這里使用了區域生長算法,即從某個點開始,找其領域內符合條件的點。
但是慢着,你可能會問,怎樣才叫足夠多?改天再說吧...