2013-04-15 64 views
0

所以我下面的圖片:在二進制圖像中識別獨立形狀的最簡單方法是什麼?

Binary Image - Shapes

現在我希望能夠找到每一個人斷開形狀的中心點。如果可能的話,我也想找到寬度和高度。

我正在使用Java和java.awt.image包,但即使只是這個問題的一般解決方案將有所幫助。

我自己的想法是:

  • 通過迭代,找到第一個白色像素。
  • 從該像素執行BFS,標記其找到的數字1爲白色的像素。
  • 一旦完成,繼續在第一個白色像素處停止迭代並且沒有分配/標記的數字。
  • 一旦找到它,執行BFS並標記找到的所有像素數爲2.
  • 泡沫,漂洗並重復。我的意思是...繼續這樣做直到圖像結束。
  • 您要達到的數量是不同形狀的數量。

但是,這似乎有點密集,我將不得不找到中心,寬度和高度。有一種更簡單的方法嗎?有任何想法嗎?

+3

你的意思是連成分標籤?維基百科上有一篇很好的文章,包括一個僞代碼算法:http://en.wikipedia.org/wiki/Connected-component_labeling – Niki

+1

啊,好吧,幾乎。除非你知道怎麼稱呼它們,否則很難找到這些東西。雖然不是完全有助於找到中心或大小,但是到達那裏。 –

+1

您可以通過查找其質心(http://en.wikipedia.org/wiki/Image_moment)找到組件的中心。對於它的大小,您可以計算組件中白色像素的數量,或者如果您更喜歡邊界框,請找到最頂部,最左側,最底部和最右側的白色像素,並用此構造一個矩形信息。 – Zaphod

回答

0

我不知道這是否是一個好主意,但也許這將幫助你:

我會從邊緣發送randomWalks和將圖像分成更小的盒子,並繼續將來自小盒子randomWalks直到某一點(我不知道什麼會是這一點,但你會知道這裏有是有超過1元沒有小箱)

- 如果一個randomWalk再降randomWalk沒有看到任何whitecolor,那麼,有一個新的弓。舉例來說,在我的形象,讓說1st randomWalk(rw1)開始從(0,200)(100,0)rw2開始和他們(100,200)打不接觸任何whitecolor,那麼你有一個盒子(0 ,0,100,200)。將此添加到您的陣列列表myBoxes

現在我想起來,你可以這樣做:如果像素的顏色總和等於零(或小於一個小數字),那麼沒有圖像框。所以你可以將它添加到另一個列表中,我們可以稱它爲myEmptyBoxes

- 下的東西,當你確信只有一個在每個箱子元素,那麼每個箱子的和顏色,如果兩個盒子相等或非常接近,那麼他們可能是相同的圖像。如果不是自動的,他們不是相同的圖像,不需要在這兩個圖像/盒子上工作。

- 我想不到下一步,這一切都出現在我的腦海裏。

- 同樣,我給你用的OpenCV它是那樣的問題

希望一個好的圖書館,這將有助於

image

相關問題