Как конвертировать Matrix в тип Mat? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую EmguCV для простой обработки изображений. Я хочу удалить небольшие контуры из своего порогового изображения, поэтому я использовал connectedcomponentswithstats . Ниже приведен мой код, где я преобразую любой пиксель, меньший, чем минимальный размер, в черный - по сути, удаляя его Причина, по которой я хочу это сделать, заключается в возможности использовать его в последней части, поскольку он не совместим с другими типами.

public Mat Filtered(Mat in_img, string currentDir)
{
    Mat gray_res = new Mat();
    Mat labels = new Mat();
    Mat stats = new Mat();
    Mat centroids = new Mat();

    CvInvoke.CvtColor(in_img, gray_res, ColorConversion.Bgr2Gray);

    var nlabels = CvInvoke.ConnectedComponentsWithStats(gray_res, labels, stats, centroids, LineType.EightConnected);

    int min_size = 250;

    int[] sizes = new int[nlabels];

    for (int s = 1; s < nlabels; s++)
    {
        sizes[s] = BitConverter.ToInt32(stats.GetData(s, (int)ConnectedComponentsTypes.Area), 0);
    }

    Matrix<double> fltr_img = new Matrix<double>(labels.Rows, labels.Cols);
    fltr_img.SetValue(0);

    for (int i = 1; i < nlabels; i++)
    {
        int j = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Left), 0); //left most
        int w = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Width), 0); //run width
        int k = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Top), 0); //top most
        int h = BitConverter.ToInt32(stats.GetData(i, (int)ConnectedComponentsTypes.Height), 0); //run height

        if (sizes[i] < min_size)
        {
            for (int a = k; a < k + h; a++)
            {
                for (int b = j; b < j + w; b++)
                {
                    fltr_img.Data[a, b] = 255;
                }
            }
        }
    }

    //Covnert 2D Matrix to Image
    CvInvoke.Imwrite(currentDir + "filter.jpg", fltr_img);

    Mat subtrahend = CvInvoke.Imread(currentDir + "filter.jpg");

    Mat fnl_img = new Mat();

    CvInvoke.Subtract(in_img, subtrahend, fnl_img);

    return fnl_img;
}

В конце я сделал небольшой подвох, чтобы преобразовать маску в совместимый тип Мат , который является исходным изображением. С этим кодом я получаю свой результат, но он все еще беспокоит меня.

1 Ответ

0 голосов
/ 21 ноября 2018

Вы можете преобразовать тип Matrix, используя его свойство Mat. Я не знаю, какой тип вам нужен, поэтому я использовал DepthType.Cv8U в моем примере.

Mat converted = new Mat();
fltr_img.Mat.ConvertTo(converted, DepthType.Cv8U);
Mat fnl_img = new Mat();
CvInvoke.Subtract(in_img, converted, fnl_img);

В качестве альтернативы, вы также можете использовать Mat и / или Matrix вместе с методом substract. Оба реализуют интерфейс IInpurArray.

CvInvoke.Subtract(in_img,  fltr_img, fnl_img); //Tested with EmguCv 3.4.1
...