有一张图像,平摊一把花生仁,(花生仁没有重叠,都是平摊),现在要取出花生仁的个数,该怎么办?

解决方案 »

  1.   

    图像:一个矩形图形
    属性:


    方法:
    Main()
    {
      ClearPicture(picture);
      List<花生仁> my花生仁;
      put(my花生仁):
      int totalNumber = GetNumber(picture);
      MessageBox.Show(totalNumber);
    }
    Clear()清除所有像素颜色为白色
    Put(List<花生仁> my花生仁):放置花生仁
    Color GetPotColor(Point p)
    SetAdjecentRegion(Point p)设置所有的邻接黑色区域为已读
    GetNumber(Picture)
    {
    int num = 0;
    for(int row = 0; row < 图形的像素高度;row++)
    {
      for(int column = 0; column < 图形像素宽度; column++)
      {
        if(GetColor(图形像素点[row,column]) == Color.Black && !图形像素点[row,column].已读)
        {
           num++;
           SetAdjecentRegion(图形像素点[row,column]);
        }
      }
    }
    花生仁:花生的仁(废话),形状不固定的图形,为黑色的像素点
    每个花生仁放置之后,它的区域的颜色都是黑色的
    两个花生仁放置,他们的区域不会重合,也不会接触,即一个黑点和他所邻接的黑点构成一个花生仁。
      

  2.   

    不知道你的工作丢了没有!但是一看到技术问题就想谈谈自己的看法!、
    前提:任意两个花生仁不会接触。仅仅是花生仁,没有花生皮什么的。花生仁的边缘不会是一直线。
    想法:
         设图上每个像素点的结构为:
            struct point{
               int  number;/* 第几个花生仁的成员 初始为0 */
               int  scan_flg; /* 是否被扫描过,扫描过置1,否则为0 */
            }
         从第一个像素点开始扫描,遇到一个黑点,且其scan_flg=0;则说明发现一个新的花生仁,然后查看其周围的8个点有黑点则设置其point属性。迭代执行直到一个花生仁的全部的黑点被查找完毕。花生仁数目+1.
        然后继续扫描。遇到被扫描过的黑点就跳过。遇到没有扫描过的黑点则执行上面一段的操作。直到全图被扫描完毕。
         所有的花生仁被找出来了!
      

  3.   

    记得Photoshop有一个“魔术棒”功能,能够识别出图像中物体的边缘,另外AutoCAD也有这样类似的功能,可以考虑调用他们的接口来做。还有一招,你把图像缩小,这样花生仁就有可能缩量到一个点了,扫描图像上这样的点的数量即可,这些点可以通过颜色识别。