0

我正在尝试获取图像中所有检测到的斑点的中心,因此我尝试以两种不同的方式进行操作,得到了两种不同的结果!
第一个如下:

        BlobCounter blobCounter = new BlobCounter();
        blobCounter.ObjectsOrder = ObjectsOrder.Area;
        blobCounter.ProcessImage(image);
        Blob[] blobs = blobCounter.GetObjectsInformation();
        AForge.Point Center = new AForge.Point();

        if (blobs.Length > 0)
        {
                Center.X = blobs.Average(c => c.CenterOfGravity.X);
                Center.Y = blobs.Average(c => c.CenterOfGravity.Y);
        }

第二种方法如下:

        System.Drawing.Point Center = new System.Drawing.Point();
        int count = 0;
        int sumX = 0;
        int sumY = 0;
        for(int i = 0 ;i<image.Width;i++)
            for (int j = 0; j < image.Height; j++)
            {
                var p = image.GetPixel(i,j);
                if (!p.Name.ToLower().Equals("ff000000"))
                {
                    sumX += i;
                    sumY += j;
                    count++;
                }
            }
        if (count > 0)
        {
            Center.X = sumX / count;
            Center.Y = sumY / count;
        }
        return Center;

在哪里

!p.Name.ToLower().Equals("ff000000")

意味着像素不是黑色的(即它来自一些斑点)。
但是我不明白为什么我会得到不同的结果!有人可以帮助我并告诉我为什么吗?

4

1 回答 1

0

如果不确切查找您使用的 AForge 方法的作用,我认为问题在于The average of averages does not equal the average of their parts

例如,我可以取这些数字:

  • 1
  • 3
  • 5
  • 7
  • 9

加起来,它们的平均值为 (1+3+5+7+9)/5=5。但是,如果我将列表分成 {5,3}(平均 4)和 {1,7,9}(平均 5.66...),然后取 {4, 5.66...} 的平均值,我会得到接近但不等于 5 的东西。

在这种情况下,AForge 的 CenterOfGravity 方法很可能会返回您正在平均的对象的平均位置,而您自己的方法是对每个对象的每个部分进行单一平均。

无关:查看Bitmap.LockBits以获得更有效的图像操作。

于 2013-03-21T02:55:06.403 回答