2017-05-05 111 views
0

我想從一個位圖拆分不同的形狀成sepperate位圖。
我有一個工作系統,可以分類顏色。
所以我有一種顏色的各種形狀的位圖列表。
我有一個要求:我不想使用任何形狀檢測自由。
目前我只有一個簡單的循環,循環中的位圖低谷的所有像素,並檢查是否有顏色的結論是,像素可以是舊的或新的形狀的一部分。
C#抽象形狀檢測

變量列表
layeredColorSystem =位圖
這是顏色分選系統的結果。

foreach (Color colorLayer in layeredColorSystem.Keys) 
      { 
       Bitmap layer = layeredColorSystem[colorLayer]; 
       Bitmap shape = new Bitmap(input.Width, input.Height); 
       for (int x = 0; x < layer.Width; x++) 
       { 
        for (int y = 0; y < layer.Height; y++) 
        { 
         Color currentPixel = layer.GetPixel(x, y); 
         if (!currentPixel.Equals(colorLayer)) 
         { 
          //no color here maybe a new shape can come up 
         } else 
         { 
          //color here maybe a part of an old shape maby a new shape. 

         } 
        } 
       } 
      } 


所以我的問題是:我如何寫一個簡單的代碼,檢測的形狀和將每個sepperate形狀的位圖的原始位圖的大小相同?
提前致謝!

+0

有沒有問題! –

+0

@JeremyThompson這個問題很明顯:如何將所有形狀從一個位圖放入sepperate位圖。 –

+0

的2密切票表明它不清楚你在問什麼......在任何情況下,這可能會幫助您:http://stackoverflow.com/questions/7782338/search-for-shapes-in-bmp-image-file –

回答

2

實現一個flood-fill算法尋找顏色的特定補丁中所有的像素。然後,將該信息複製到其他位圖中。一旦將像素「移動」到其他位圖中,請記錄已移動的像素,以便不重新處理相同的像素。

如果你想確定實際的形狀(例如它是一個三角形?圓形等),你需要提出規則,但基本上,你需要從圖像中提取每個「對象」,以便能夠處理它。

其他機制可包括邊緣檢測,但它似乎使用的是顏色上的變化作爲你的「邊緣」,這是做這件事的方式。

+0

我確實使用顏色的變化。只有它不僅會將邊緣粘貼到顏色排序的位圖中,還會粘貼到形狀的內部。 –

+0

使用洪水填充算法將複製整個形狀(包括「內部」像素)。如果您只想獲取邊緣,請針對由填充填充產生的最終形狀運行邊緣檢測算法,然後您只需邊緣。這兩種方法都不包括包含在邊界框中的像素,但不包含在形狀中。 – AndrewP

+0

謝謝你的回覆,這肯定會有效! :) –