Как удалить связанные объекты в двоичном изображении, используя ConnectedComponents - PullRequest
0 голосов
/ 08 сентября 2018

Я использую 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 и более, количество частиц, которые мое приложение переходит в режим прерывания

...