如何从位图 Mat 将黑色更改为透明?
How to change black color to transparent from a bitmap Mat?
mat或umat中间可以有空值吗?我需要它表现得像 .png 格式。如果没有,我怎样才能达到这个目的? Mat 和 Umat 对我来说就像一个矩形图像。
我试过矩形复制法,抓取法,但是none的方法都可以。
我开始的代码如下:
Bitmap bmpUImage = new Bitmap(plotBox.Image);
Image<Bgr, Byte> uimage = new Image<Bgr, byte>(bmpUImage);
UMat input = uimage.ToUMat();
垫子或 umat 就像 .png,在图像的中间部分有一些 cutout/null 值。
///////////////// add black as transparency /////////////////
Bitmap bmpUImage = new Bitmap(plotBox_Method.Image);
Mat output = new Mat();
Mat Shading_Image = new Image<Bgr, byte>(bmpUImage).Mat;
// puting a black rectangle for transparent area later
Shading_Image.CopyTo(output);
CvInvoke.Rectangle(output, mask_rect, new MCvScalar(0,0,0), -1);
Mat imageMat = output;
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, 0, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.Imshow("alpha", alpha);
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);
imgPlot.Image = finalMat.ToImage<Bgra, Byte>().ToBitmap();
///////////////// end of add black as transparency /////////////////
mat或umat中间可以有空值吗?我需要它表现得像 .png 格式。如果没有,我怎样才能达到这个目的? Mat 和 Umat 对我来说就像一个矩形图像。
我试过矩形复制法,抓取法,但是none的方法都可以。
我开始的代码如下:
Bitmap bmpUImage = new Bitmap(plotBox.Image);
Image<Bgr, Byte> uimage = new Image<Bgr, byte>(bmpUImage);
UMat input = uimage.ToUMat();
垫子或 umat 就像 .png,在图像的中间部分有一些 cutout/null 值。
///////////////// add black as transparency /////////////////
Bitmap bmpUImage = new Bitmap(plotBox_Method.Image);
Mat output = new Mat();
Mat Shading_Image = new Image<Bgr, byte>(bmpUImage).Mat;
// puting a black rectangle for transparent area later
Shading_Image.CopyTo(output);
CvInvoke.Rectangle(output, mask_rect, new MCvScalar(0,0,0), -1);
Mat imageMat = output;
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, 0, 255, Emgu.CV.CvEnum.ThresholdType.Binary);
CvInvoke.Imshow("alpha", alpha);
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);
imgPlot.Image = finalMat.ToImage<Bgra, Byte>().ToBitmap();
///////////////// end of add black as transparency /////////////////