Emgucv превратить черный фон прозрачным - PullRequest
0 голосов
/ 01 октября 2018

Я очень новичок в Emgucv, поэтому нужна небольшая помощь?

Код ниже в основном взят из разных мест от Google.Он возьмет файл jpg (с зеленым фоном) и позволит из отдельной формы изменить значения параметров h1 и h2, чтобы создать (открыть) маску.Теперь я хочу сделать эту маску прозрачной.

В данный момент она просто отображает черный фон вокруг человека (например), а затем сохраняет в файл.

Мне нужно знать, как сделать черный фон прозрачным, если это правильный способ подойти к этому?

Заранее спасибо.

Что у меня пока есть в C #:

imgInput = new Image<Bgr, byte>(FileName);

Image<Hsv, Byte> hsvimg = imgInput.Convert<Hsv, Byte>();

//extract the hue and value channels
Image<Gray, Byte>[] channels = hsvimg.Split();      // split into components
Image<Gray, Byte> imghue = channels[0];             // hsv, so channels[0] is hue.
Image<Gray, Byte> imgval = channels[2];             // hsv, so channels[2] is value.

//filter out all but "the color you want"...seems to be 0 to 128 (64, 72) ?
Image<Gray, Byte> huefilter = imghue.InRange(new Gray(h1), new Gray(h2));

// TURN IT TRANSPARENT somewhere around here?

pictureBox2.Image = imgInput.Copy(mask).Bitmap;

imgInput.Copy(mask).Save("changedImage.png"); 

Ответы [ 2 ]

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

Думаю, у меня есть решение, которое я искал.Я нашел некоторый код в stackoverflow, который немного подправил:

public Image<Bgra, Byte> MakeTransparent(Image<Bgr, Byte> image, double r1, double r2)
{
    Mat imageMat = image.Mat;                      

    Mat finalMat = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 4);
    Mat tmp      = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 1);
    Mat alpha    = new Mat(imageMat.Rows, imageMat.Cols, DepthType.Cv8U, 1);

    CvInvoke.CvtColor(imageMat, tmp, ColorConversion.Bgr2Gray);

    CvInvoke.Threshold(tmp, alpha, (int)r1, (int)r2, ThresholdType.Binary);

    VectorOfMat rgb = new VectorOfMat(3);

    CvInvoke.Split(imageMat, rgb);

    Mat[] rgba = { rgb[0], rgb[1], rgb[2], alpha };

    VectorOfMat vector = new VectorOfMat(rgba);

    CvInvoke.Merge(vector, finalMat);

    return finalMat.ToImage<Bgra, Byte>();
}

Сейчас я смотрю на добавление SmoothGaussian к маске, чтобы создать вид на смеси, где два изображения наслоены, а нерезкий вырез.

0 голосов
/ 31 октября 2018

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

Может быть, вы могли бы уточнить, что вы хотите сделать?

Даг

...