2016-11-09 493 views
2

我想使用Python中的OpenCV提取圖像中曲線的座標。然而,我需要這些座標排列在列表中,使得列表中的第一個元素是曲線的一個末端,第二個元素是該末端旁邊的點等,直到最後一個元素是另一個末端。使用OpenCV(Python)查找曲線座標

說我有字母「C」,用的OpenCV導入爲以下numpy的陣列的圖像:

arr= 
[0,0,0,0,0,0,0 
    0,0,1,1,1,0,0 
    0,0,1,0,0,0,0  
    0,0,1,0,0,0,0 
    0,0,1,1,1,0,0 
    0,0,0,0,0,0,0] 

然後我想列表返回像素的座標按以下順序:

arr= 
[0,0,0,0,0,0,0 
    0,0,3,2,1,0,0 
    0,0,4,0,0,0,0  
    0,0,5,0,0,0,0 
    0,0,6,7,8,0,0 
    0,0,0,0,0,0,0] 

即列表(數組中像素「1」的座標,像素「2」的座標等)。

這種「連續性」的思想在findContours()中存在一些,但對於找到這樣一個1像素寬的物體的輪廓來說效果不佳。許多像素拿出兩倍生成的輪廓(不是一個太大的問題),但它也可能不是一個末端開始,在訂單如

arr= 
[0,0,0,0,0,0,0 
    0,0,1,7,8,0,0 
    0,0,2,0,0,0,0  
    0,0,3,0,0,0,0 
    0,0,4,5,6,0,0 
    0,0,0,0,0,0,0] 

屈服點座標這是因爲算法基本上從1到6比回到1,進入8並返回到1以產生「輪廓」。 我也嘗試過簡單的閾值+ numpy.nonzero,這當然是我想不命令他們,就在

arr= 
[0,0,0,0,0,0,0 
    0,0,1,2,3,0,0 
    0,0,4,0,0,0,0  
    0,0,5,0,0,0,0 
    0,0,6,7,8,0,0 
    0,0,0,0,0,0,0] 

我缺少的東西到大的順序產生?我對Python或圖像處理並不陌生,但我剛開始使用OpenCV。

回答

2

我不知道一個很好的opencv實現,但您可以使用Moore-Neighbor Tracing並修改它,以便我們將您在boudary中找到的點的值設置爲增量值。

+0

'Moore-Neighbour Tracing'看起來很有前途,我得試試它 –