Emgu C#OpenCV:使颜色黑色透明

Emgu C#OpenCV:使颜色黑色透明,c#,opencv,emgucv,alpha,C#,Opencv,Emgucv,Alpha,我目前正在尝试用OpenCV实现一个函数,它可以使图像的黑色透明。我以此为指导。 目前它不起作用,我不确定这是因为我转到C#还是另一个错误 public Image<Bgr, Byte> BlackTransparent(Image<Bgr, Byte> image) { Mat imageMat = image.Mat; Mat finalMat = new Mat(imageMat.Rows, image

我目前正在尝试用OpenCV实现一个函数,它可以使图像的黑色透明。我以此为指导。 目前它不起作用,我不确定这是因为我转到C#还是另一个错误

public Image<Bgr, Byte> BlackTransparent(Image<Bgr, Byte> image)
        {
            Mat imageMat = image.Mat;
            Mat finalMat = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 4);
            Mat tmp = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);
            Mat alpha = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);

            CvInvoke.CvtColor(imageMat, tmp, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
            CvInvoke.Threshold(tmp, alpha, 100, 255, Emgu.CV.CvEnum.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<Bgr, Byte>();
        }
公共图像黑色透明(图像)
{
Mat imageMat=image.Mat;
Mat finalMat=新Mat(imageMat.Rows,imageMat.Cols,Emgu.CV.CvEnum.DepthType.Cv8U,4);
Mat tmp=新的Mat(imageMat.Rows、imageMat.Cols、Emgu.CvEnum.DepthType.Cv8U,1);
Mat alpha=新的Mat(imageMat.Rows,imageMat.Cols,Emgu.CvEnum.DepthType.Cv8U,1);
CvInvoke.CvtColor(imageMat、tmp、Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
阈值(tmp,alpha,100255,Emgu.CV.CvEnum.ThresholdType.Binary);
MAT rgb矢量=MAT(3)的新矢量;
CvInvoke.Split(imageMat,rgb);
Mat[]rgba={rgb[0],rgb[1],rgb[2],alpha};
VectorOfMat vector=新的VectorOfMat(rgba);
CvInvoke.Merge(vector,finalMat);
返回finalMat.ToImage();
}
如果有人有什么想法或建议,我将不胜感激

布鲁诺

公共图像黑色透明(图像)
{
Mat imageMat=image.Mat;
Mat finalMat=新Mat(imageMat.Rows,imageMat.Cols,Emgu.CV.CvEnum.DepthType.Cv8U,4);
Mat tmp=新的Mat(imageMat.Rows、imageMat.Cols、Emgu.CvEnum.DepthType.Cv8U,1);
Mat alpha=新的Mat(imageMat.Rows,imageMat.Cols,Emgu.CvEnum.DepthType.Cv8U,1);
CvInvoke.CvtColor(imageMat、tmp、Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
阈值(tmp,alpha,100255,Emgu.CV.CvEnum.ThresholdType.Binary);
MAT rgb矢量=MAT(3)的新矢量;
CvInvoke.Split(imageMat,rgb);
Mat[]rgba={rgb[0],rgb[1],rgb[2],alpha};
VectorOfMat vector=新的VectorOfMat(rgba);
CvInvoke.Merge(vector,finalMat);
返回finalMat.ToImage();
}
函数的返回类型错误。。。它应该是bgra颜色空间,而不是bgr颜色空间 { Mat imageMat=image.Mat; Mat finalMat=新Mat(imageMat.Rows,imageMat.Cols,Emgu.CV.CvEnum.DepthType.Cv8U,4); Mat tmp=新的Mat(imageMat.Rows、imageMat.Cols、Emgu.CvEnum.DepthType.Cv8U,1); Mat alpha=新的Mat(imageMat.Rows,imageMat.Cols,Emgu.CvEnum.DepthType.Cv8U,1); CvInvoke.CvtColor(imageMat、tmp、Emgu.CV.CvEnum.ColorConversion.Bgr2Gray); 阈值(tmp,alpha,100255,Emgu.CV.CvEnum.ThresholdType.Binary); MAT rgb矢量=MAT(3)的新矢量; CvInvoke.Split(imageMat,rgb); Mat[]rgba={rgb[0],rgb[1],rgb[2],alpha}; VectorOfMat vector=新的VectorOfMat(rgba); CvInvoke.Merge(vector,finalMat); 返回finalMat.ToImage(); }
函数的返回类型错误。。。与其说是bgr颜色空间,不如说是bgra颜色空间

定义“不工作”两个相当明显的错误是
tmp
alpha
被创建为4个通道,而
tmp
用于保存转换为灰度的结果(仅1个通道),而
alpha
意味着具有透明通道(同样仅1个通道)。这可能不会引起问题,但无论如何,这是误导和浪费的。函数返回它作为参数接收的相同图像。但是谢谢你的tipp频道。。。我会改变的啊,只是注意到了另一件事:既然你在添加透明度,返回类型不应该是像
Image
(BGRA而不是BGR colorspace)这样的吗?这就是问题所在。。。非常感谢。定义“不工作”两个相当明显的错误是
tmp
alpha
被创建为4个通道,而
tmp
用于保存转换为灰度的结果(仅1个通道),而
alpha
意味着具有透明通道(同样仅1个通道)。这可能不会引起问题,但无论如何,这是误导和浪费的。函数返回它作为参数接收的相同图像。但是谢谢你的tipp频道。。。我会改变的啊,只是注意到了另一件事:既然你在添加透明度,返回类型不应该是像
Image
(BGRA而不是BGR colorspace)这样的吗?这就是问题所在。。。非常感谢。如何将非完全透明的透明度设置为某个级别,半透明如何将非完全透明的透明度设置为某个级别,半透明
public Image<Bgra, Byte> BlackTransparent(Image<Bgr, Byte> image)
        {
            Mat imageMat = image.Mat;
            Mat finalMat = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 4);
            Mat tmp = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);
            Mat alpha = new Mat(imageMat.Rows, imageMat.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);

            CvInvoke.CvtColor(imageMat, tmp, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);
            CvInvoke.Threshold(tmp, alpha, 100, 255, Emgu.CV.CvEnum.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>();
        }