首页 > 解决方案 > 如何使用 ConnectedComponents 删除二进制图像中的连接对象

问题描述

我正在使用 EmguCV 和 C#。我想使用 ConnectedComponentsWithStats 从我的图像中删除小的连接对象

我有以下二进制图像作为输入

我能够为指定区域绘制一个矩形。现在我想从二进制图像中删除对象

这是我的代码

Image<Gray, byte> imgry = image.Convert<Gray, byte>();
    var mask = imgry.InRange(new Gray(50), new Gray(255));

    var label = new Mat();
    var stats = new Mat();
    var centroids = new Mat();
    int labels = CvInvoke.ConnectedComponentsWithStats(mask, label, stats,
                                                       centroids,
                                                       LineType.EightConnected,
                                                       DepthType.Cv32S);

    var img = stats.ToImage<Gray, int>();

    Image<Gray, byte> imgout1 = new Image<Gray, byte>(image.Width, image.Height);

    for (var i = 1; i < labels; i++)
    {
        var area = img[i, (int)ConnectecComponentsTypes.Area].Intensity;
        var width = img[i, (int)ConnectecComponentsTypes.Width].Intensity;
        var height = img[i, (int)ConnectecComponentsTypes.Height].Intensity;    
        var top = img[i, (int)ConnectecComponentsTypes.Top].Intensity;
        var left = img[i, (int)ConnectecComponentsTypes.Left].Intensity;

        var roi = new Rectangle((int)left, (int)top, (int)width, (int)height);

        if (area > 1000)
        {
            CvInvoke.Rectangle(imgout1, roi, new MCvScalar(255), 1);

        }
    }

为指定区域绘制矩形

如何删除指定大小的对象

我的输出图像应该是这样的

我通过使用轮廓实现了一种方法,它适用于小图像,当我有大图像 10240*10240 和更多数量的粒子时,我的应用程序进入中断模式

标签: c#opencvimage-processingemgucv

解决方案


推荐阅读