Emgu C#OpenCV:使颜色黑色透明
我目前正在尝试用OpenCV实现一个函数,它可以使图像的黑色透明。我以此为指导。 目前它不起作用,我不确定这是因为我转到C#还是另一个错误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
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>();
}