Обнаружение белых пятен

Я пытаюсь использовать 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 edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);
        List 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, я был бы очень признателен.

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

РЕДАКТИРОВАТЬ

Я как бы работаю со следующим методом

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

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

8
задан Uwe Keim 24 November 2018 в 17:11
поделиться