Emgucv将黑色背景透明

时间:2018-10-01 11:34:27

标签: c# background emgucv transparent

我是Emgucv的新手,所以需要一些帮助吗?

以下代码主要来自Google的不同地方。这将需要一个jpg文件(背景为绿色),并允许以单独的形式更改h1h2设置的值,以创建(显示)蒙版。 现在,我想用这个面具做的就是将它变成透明的。

此刻,它只会在一个人周围显示黑色背景(例如),然后保存到文件中。

如果这是正确的处理方法,我需要知道如何将黑色背景变透明?

谢谢。

到目前为止,我所掌握的是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 :(得分:0)

我不确定我是否真的了解您要做什么。但是掩码是二进制对象。面具通常是黑色的,代表您不想要的东西,白色面具。据我所知,没有透明的面具,对我来说这是没有意义的。遮罩用于通过遮罩其余部分来提取图像的一部分。

也许您可以详细说明您想做什么?

道格

答案 1 :(得分:0)

我想我可能已经找到了想要的解决方案。我在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,以在混合时创建一种,在其中将两个图像分层,而不是锐利的剪裁。