You are here: Start » FIL.NET » FabImage Library .NET Usage » Blob Analysis Example

Blob Analysis Example

Following example thresholds a loaded image into the region with ThresholdToRegion function and then splits it into blobs with SplitRegionIntoBlobs function. Blobs, that don't met specific area condition, are bounded with red circle. Circles, determined with RegionBoundingCircle function are drawn with DrawCircle function. The region area is calculated using RegionArea function.

To have the example work, a single form with PictureBox control and a mounts.jpg file located in the application directory are needed.

//...
using Fil;
using Fil.Utils;
    //...

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Inspect();
        }

        private void Inspect()
        {
            using Disposables disposables = new();

            Image mountsImage = new();
            Region mountsRegion = new();
            List<Region> mounts = [];
            DrawingStyle style = new()
            {
                Thickness = 2.0f,
                DrawingMode = DrawingMode.HighQuality,
                Opacity = 1.0f
            };

            mountsImage.DisposeWith(disposables);
            mountsRegion.DisposeWith(disposables);
            mounts.DisposeWith(disposables);
            style.DisposeWith(disposables);

            Fil.Invoke.LoadImage("mounts.jpg", false, mountsImage);
            Fil.Invoke.ThresholdToRegion(mountsImage, null, null, 128.0f, 0.0f, mountsRegion);
            Fil.Invoke.SplitRegionIntoBlobs(
                inRegion: mountsRegion,
                inConnectivity: RegionConnectivity.FourDirections,
                inMinBlobArea: 1,
                inMaxBlobArea: null,
                inRemoveBoundaryBlobs: false,
                outBlobs: mounts);

            //display invalid mounts
            foreach (Region mount in mounts)
            {
                Fil.Invoke.RegionArea(mount, out int area);
                if (area < 2000)
                {
                    Fil.Invoke.RegionBoundingCircle(mount, out Circle2D circle);
                    Fil.Invoke.DrawCircle(
                        ioImage: mountsImage,
                        inCircle: circle,
                        inCircleAlignment: null,
                        inColor: Pixel.Red,
                        inDrawingStyle: style);
                }
            }

            pictureBox1.Image?.Dispose();
            pictureBox1.Image = mountsImage.ToBitmap();
        }
        //...
    }
Previous: Basic Template Matching Next: FIL.NET Designers example