Получить количество строк в изображении с помощью AForge или OpenCV

Я пытаюсь определить, проходит ли линия через изображение или не использует обнаружение линии преобразования С# и AForge. В том же контексте я думаю о лучшем решении, которое определяет, является ли изображение четким (без линий), а затем возвращает ложное значение и наоборот. У меня есть следующее изображение, и я хочу проверить, проходит ли через него линия, я верну true, иначе верну false:

http://s10.postimg.org/3sn8wari1/image.png

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

        AForge.Imaging.Image.FormatImage(ref SEChild);
        // lock the source image
        BitmapData sourceData = SEChild.LockBits(
            new System.Drawing.Rectangle(0, 0, SEChild.Width, SEChild.Height),
            ImageLockMode.ReadOnly, SEChild.PixelFormat);
        // binarize the image
        UnmanagedImage binarySource = filter.Apply(new UnmanagedImage(sourceData));

        HoughLineTransformation lineTransform = new HoughLineTransformation();
        lineTransform. = 10;
        // apply Hough line transofrm
        lineTransform.ProcessImage(binarySource);
        HoughLine[] lines = lineTransform.GetLinesByRelativeIntensity(0.5);
        if (lines.Count() > 0)
        {
            Result += "NW: Yes!\n";
        }
        else
        {
            Result += "NW: No!\n";
        }

person SSMZ    schedule 17.05.2014    source источник


Ответы (1)


Я применил мощное решение для всех кривых, кроме прямых линий.

Я использовал библиотеку AForge.net и выполнил следующие шаги, как показано в коде:

  1. Примените евклидову цветовую фильтрацию к изображению
  2. Примените Blob Counter к полученному изображению и получите количество прямоугольников (Blobs), которые были найдены на изображении.

Код:

  private bool CheckLines(Bitmap image, Color filterColor)
    {
        EuclideanColorFiltering ColorFilter = new EuclideanColorFiltering();
        // set center colour and radius
        AForge.Imaging.RGB color = new RGB(filterColor.R, filterColor.G, filterColor.B, filterColor.A);
        ColorFilter.CenterColor = color;
        ColorFilter.Radius = 100;
        // Apply the filter
        ColorFilter.ApplyInPlace(image);

        // Define the Blob counter and use it!
        BlobCounter blobCounter = new BlobCounter();
        blobCounter.MinWidth = 5;
        blobCounter.MinHeight = 5;
        blobCounter.FilterBlobs = true;
        //blobCounter.ObjectsOrder = ObjectsOrder.Size;
        blobCounter.ProcessImage(image);
        System.Drawing.Rectangle[] rects = blobCounter.GetObjectsRectangles();
        if (rects.Length > 0)
        {
            return true;
        }
        return false;
    }
person SSMZ    schedule 14.06.2014