Обнаружение белого пятна - PullRequest
8 голосов
/ 21 марта 2012

Я пытаюсь использовать AForge.NET для обнаружения толстой белой линии на изображении.

Это похоже на трубу, которую я получаю, и это мой желаемый результат после применения фильтра Threshold.

Я знаю, как определять фигуры, и я уже делаю это, но это не подходит ни для одной фигуры, так как не имеет ребер и не является кругом.

У меня есть пример кода для обнаружения равносторонних форм, но я не знаю, уместно ли это.

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();
}

Вот изображение, которое я пытаюсь обнаружить:

enter image description here

Если кто-нибудь знает, как я могу обнаружить этот белый шарик с помощью AForge или иным образом с помощью C # / .NET, я был бы очень признателен.

Приведенный выше код обнаруживает только ребра, поэтому он будет обнаруживать фигуру только в том случае, если у нее есть острый край, что будет редко.

EDIT

У меня вроде как работает следующий метод

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();
}

Должен быть лучший способ, чем использование фиксированной ширины (поскольку они могут сильно различаться)

1 Ответ

0 голосов
/ 15 мая 2016

если вы хотите получить помеченный BLOB-объект, вы можете использовать этот код

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();
    }

спросите меня, если вы хотите что-то другое, я помогу, насколько смогу :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...