2014-12-03 35 views
1

我想弄清楚實現圖像擴張和侵蝕二進制圖像的有效方法。據我所知,用簡單的方式將是:執行圖像擴張和侵蝕

  • 循環通過圖像
  • 如果像素是1
  • 循環通過鄰里基於所述結構元素的 高度和寬度
  • (擴張)將圖像中的每個像素用 中相應位置的值替換(腐蝕)檢查是否所有的鄰域都等於SE,如果全部保留 像素,則刪除中心

所以這意味着對於每個像素我必須遍歷SE以及使之成爲一個O(N 中號 W * H)。

有沒有更好的方法來做到這一點?

+0

如果您的圖片背景較大,我認爲我的做法是從非重疊鄰域開始,因爲只有在存在「0」像素的情況下才會發生擴張,然後只有在檢測到「0」像素時才移動到重疊鄰域在附近。實際上,侵蝕/擴張過濾器比大多數其他圖像處理過濾器快得多,因爲它們不需要任何數學運算(例如模糊處理)。 – eigenchris 2014-12-03 19:48:11

+0

可以做。我也讀過有關轉移和使用邏輯運算的知識,但我從未發現任何詳細的內容。我的理解是,擴大可以通過複製和移動圖像的方向基於SE和執行AND與所有圖像 – tigeradol 2014-12-04 13:05:25

+0

我剛剛注意到在這裏類似的問題:http://stackoverflow.com/questions/21854594/有效實施侵蝕擴張。 一個簡單的方法是執行一維垂直擴張,然後是一維水平擴張,但一個答案描述了一個更有效的解決方案。 – eigenchris 2014-12-04 15:11:55

回答

0

是的,有!

首先,您想要將結構元素分解爲段(一個由垂直和水平段組成的正方形)。然後你只對分段進行侵蝕/擴大,這已經降低了複雜性。

現在的侵蝕/擴張部分,你有不同的解決方案:

  • 如果在8位圖像只工作,不C/C++,你爲了跟蹤使用具有直方圖的實現的最小值/最大值。看到這個了不起的工作here。他甚至增加了「地標」以減少操作次數。
  • 如果您使用C/C++並使用不同類型的圖像編碼,則可以使用快速比較(SSE2,SSE4和自動矢量化),如SMIL library中的情況。在這種情況下,您將行與行進行比較,而不是逐個像素地使用材料加速度。它似乎是有史以來速度最快的圖書館。
  • 對於所有類型的編碼,最後一種方法是使用Lemmonier算法。它由fulguro library執行。

對於結構化磁盤類型的元素,沒有什麼「快速」,你必須使用基本算法。對於六角形結構元素,可以逐行工作,但不能並行化。