2017-05-05 139 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

谢谢你的回复,这肯定会有效! :) –