2012-03-20 122 views
5

我正在嘗試使用AForge.NET來檢測圖像上的粗白線。AForge.NET白色斑點檢測

這就像我得到的管道,並且是應用閾值過濾器後所需的結果。

我知道如何檢測形狀,而且我已經這樣做了,但是由於它沒有邊並且不是圓形,所以在任何形狀下都不匹配。

我有檢測等邊形的示例代碼,但我不知道這是否相關。

public void DetectQuadrilateralType(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 
     blobCounter.ProcessImage(bitmap); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 
     //Graphics object to draw 
     Pen pen; 
     Graphics g = Graphics.FromImage(bitmap); 
     SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); 

     for (int i = 0; i < blobs.Length; i++) 
     { 
      List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]); 
      List<IntPoint> corners; 

      if (i < edgePoints.ToArray().Length && i > -1) 
      { 
       try 
       { 
        if (shapeChecker.IsConvexPolygon(edgePoints, out corners)) 
        { 
         PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners); 

         pen = new Pen(colors[subType], 2); 
         g.DrawPolygon(pen, ToPointsArray(corners)); 
         pen.Dispose(); 
        } 
       } 
       catch (Exception e) { } 
      } 
     } 
     g.Dispose(); 
    } 

這裏的圖像我試圖檢測

http://i206.photobucket.com/albums/bb29/cheater1034/pipe.png

如果任何人有任何想法我怎麼能檢測到白色斑點與AForge或以其它方式使用C#/。NET我」我真的很感激它:O

上面的代碼只檢測邊緣,所以它只會檢測形狀,如果它有一個尖銳的邊緣,很少會是這種情況。

編輯

我有點有它下面的方法工作

public void DetectBigBlobs(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 
     blobCounter.ProcessImage(bitmap); 
     Rectangle[] rects = blobCounter.GetObjectsRectangles(); 
     //Graphics object to draw 
     Pen pen = new Pen(Color.Red, 2); 
     Graphics g = Graphics.FromImage(bitmap); 

     foreach (Rectangle rect in rects) 
     { 
      if (rect.Width > 200 && rect.Height > 150) 
      { 
       g.DrawRectangle(pen, rect); 
      } 
     } 

     pen.Dispose(); 
     g.Dispose(); 
    } 

必須有比使用固定寬度(因爲他們可以有很大不同)

回答

0

如果一個更好的辦法你想得到一個明顯的斑點,你可以使用此代碼

public void DetectBigBlobs(Bitmap bitmap) 
    { 
     BlobCounter blobCounter = new BlobCounter(); 

     Graphics g = Graphics.FromImage(bitmap); 

     //filtering the blobs before searching for blobs 
     blobCounter.FilterBlobs = true; 
     blobCounter.MinHeight = bitmap.Height/3; 
     blobCounter.MinWidth = bitmap.Width/3; 

     blobCounter.ProcessImage(bitmap); 
     Blob[] blobs = blobCounter.GetObjectsInformation(); 

     foreach (Blob b in blobs) 
     { 
      //getting the found blob edgepoints 
      List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(b); 
      //if you want to mark every edge point RED 
      foreach (IntPoint point in edgePoints) 
       bitmap.SetPixel(point.X, point.Y, Color.Red); 
      //if you want to draw a rectangle around the blob 
      g.DrawRectangle(Pens.Blue,b.Rectangle); 

     } 

     g.Dispose(); 
    } 

問我,如果你想要不同的東西,我將盡我所能幫助:)