0

在一個離散的基於網格的平面限定倉(認爲:圖像的像素),我有可以表示爲任一封閉的輪廓:算法來計算設置利用離散輪廓

  • 一組2D的點(x1,y1);(x2,y2);(x3,y3);...
  • 或4-連接Freeman code,具有起點:(x1,y1) + 00001112...

我知道如何從一個切換到另一個這些表示。這將是輸入數據。

我想要得到一組網格座標有界等高線。 考慮下面這個例子,其中紅的座標輪廓,和一個灰色的起點:

Sample contour

如果灰色座標是,比方說,在(0,0),那麼我想的載體持有: (1,1),(2,1),(3,1),(3,2)

順序不重要,輸出矢量也可以保持輪廓本身。選擇

語言是C++,但我開到任何現有的代碼,算法,圖書館,指針,無論...

不過,我覺得,也許CGAL將有這樣的事情,但我不熟悉它並不能通過手冊找到我的方式,所以我甚至不確定。 我也看着Opencv,但我認爲它不提供這種算法(但我可能是錯的?)。

我正在考慮尋找邊界矩形,然後檢查矩形中的每個點,看它們是否爲inside/outside,但這看起來不是最理想的。任何想法 ?

+3

您只需在邊界內找到單個點,然後進行填充。這是一個簡單的遞歸算法。 –

+1

你應該檢查「找到邊界矩形」是否真的很慢。如果你的輪廓不是很大,那麼繪製一個二維數組然後按照j_random_hacker的建議進行填充填充可能是最快的。否則,你很難找出哪個網格位置屬於輪廓。 – DrV

+0

@j_random_hacker謝謝,我沒有想到那個,但它似乎是個好主意。雖然可能不是遞歸實現,但恐怕它可能不是最快的。我會調查。 – kebs

回答

1

解決這個問題的方法之一是drawContours,你有輪廓點與你。

  1. 創建空白墊並繪製厚度= 1(邊界)的輪廓。
  2. 創建另一個空白墊並繪製厚度= CV_FILLED(包括邊界在內的整個區域)的輪廓。
  3. 現在bitwise_and之間的兩個(你有填充區域不包括邊界)。
  4. 最後檢查非零像素。
+0

感謝您的回答。這種方法的問題是第4點:這意味着將所有像素1乘以1。如果我有一個大的網格和輪廓只有一個小區域,它是次優的。但最大的問題是我有**幾個**輪廓,並且用這種方法我不知道哪個像素屬於什麼輪廓。 – kebs