2013-03-20 143 views
0

我試圖獲得圖像中所有檢測到的斑點的中心,所以我試圖用兩種不同的方式做到這一點,並且我得到了兩個不同的結果!
第一個是如下:計算中心使用aforge和manualy的許多blob

 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") 

意味着該像素不是黑色的(即,它是從一些blob)。
但我不明白爲什麼我得到不同的結果! 有人可以幫我,告訴我爲什麼嗎?

回答

0

不準確地查找您使用的AForge方法的確切效果,我認爲問題在於平均值的平均值不等於它們的部分的平均值

E.g.我可以利用這些數字:

總之,它們的平均爲(1 + 3 + 5 + 7 + 9 )/ 5 = 5。 但是,如果我將列表分成{5,3}(平均值4)和{1,7,9}(平均值5.66 ...),則取平均值{4,5.66 ...},I我會得到一些接近,但不等於5.

在這種情況下,AForge的CenterOfGravity方法很可能返回對象的平均位置,然後進行平均,而您自己的方法正在取一個平均值每個物體的每個部分。

無關:查看Bitmap.LockBits以獲得更高效的圖像操作。

+0

我想這是問題,我認爲更多的分裂意味着更多的結果之間的差異!對? – Ruba 2013-03-21 18:22:45