主页 > 人工智能  > 

C#-Opencv应用(2)之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

C#-Opencv应用(2)之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

矩阵创建图像显示与保存像素读取与赋值新建sample02项目,配置opencv4相关包,新建.cs进行测试 1.矩阵创建 //创建空白矩阵 var dst = new Mat() //创建并赋值 var src = new Mat(new Size(128, 128), MatType.CV_8U, Scalar.All(125)); //图像拷贝 Mat dst = src.Clone();

2.图像显示与保存 private static void test_0() { //全黑 var mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(0, 0, 0)); Cv2.NamedWindow("black", 0); Cv2.ImShow("black", mat); // 全白 mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(255, 255, 255)); Cv2.NamedWindow("white", 0); Cv2.ImShow("white", mat); Cv2.ImWrite("white.jpg", mat); }

3.像素读取与赋值 两种常用的图像遍历方式 private void GetSet() { using var mat = new Mat(ImagePath.Lenna, ImreadModes.Color); for (int y = 0; y < mat.Height; y++) { for (int x = 0; x < mat.Width; x++) { Vec3b color = mat.Get<Vec3b>(y, x); Vec3b newColor = new Vec3b(color.Item2, color.Item1, color.Item0); mat.Set<Vec3b>(y, x, newColor); } } Cv2.ImShow("Slow", mat); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); } /// <summary> /// Reasonably fast /// </summary> private void GenericIndexer() { using var mat = new Mat(ImagePath.Lenna, ImreadModes.Color); var indexer = mat.GetGenericIndexer<Vec3b>(); for (int y = 0; y < mat.Height; y++) { for (int x = 0; x < mat.Width; x++) { Vec3b color = indexer[y, x]; Vec3b newColor = new Vec3b(color.Item2, color.Item1, color.Item0); indexer[y, x] = newColor; } } Cv2.ImShow("GenericIndexer", mat); Cv2.WaitKey(0); Cv2.DestroyAllWindows(); } 灰度图操作 private static void test_1() { var img = new Mat(new Size(128, 128), MatType.CV_8U, 1); var pixel = img.GetGenericIndexer<int>(); for (var y = 0; y < img.Height; y++) { for (var x = 0; x < img.Width; x++) { pixel[y, x] = x + y; } } Cv2.NamedWindow("单通道",0); Cv2.ImShow("单通道", img); Cv2.WaitKey(0); }

三通道图操作 private static void test_2() { //三通道 using (var src = new Mat(new Size(128, 128), MatType.CV_8UC3, new Scalar(20, 129, 250))) using (var dst = new Mat()) { for (var y = 0; y < src.Height; y++) { for (var x = 0; x < src.Width; x++) { var color = src.Get<Vec3b>(y, x); var temp = color.Item0; color.Item0 = color.Item2; // B <- R color.Item2 = temp; // R <- B src.Set(y, x, color); } } src.CopyTo(dst); Mat dat = dst.Clone(); Cv2.NamedWindow("dst", 0); Cv2.ImShow("dst", dst); Cv2.WaitKey(0); } }

完整代码 using OpenCvSharp; namespace OpenCVSharpSample01 { class Program { static void Main(string[] args) { test_0(); test_1(); test_2(); } private static void test_0() { var mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(0, 0, 0)); Cv2.NamedWindow("black", 0); Cv2.ImShow("black", mat); // 全白 mat = new Mat(new Size(600, 600), MatType.CV_8UC3, new Scalar(255, 255, 255)); Cv2.NamedWindow("white", 0); Cv2.ImShow("white", mat); Cv2.ImWrite("white.jpg", mat); } private static void test_1() { var img = new Mat(new Size(128, 128), MatType.CV_8U, 1); var pixel = img.GetGenericIndexer<int>(); for (var y = 0; y < img.Height; y++) { for (var x = 0; x < img.Width; x++) { pixel[y, x] = x + y; } } Cv2.NamedWindow("单通道",0); Cv2.ImShow("单通道", img); Cv2.WaitKey(0); } private static void test_2() { //三通道 using (var src = new Mat(new Size(128, 128), MatType.CV_8U, Scalar.All(125))) using (var dst = new Mat()) { for (var y = 0; y < src.Height; y++) { for (var x = 0; x < src.Width; x++) { var color = src.Get<Vec3b>(y, x); var temp = color.Item0; color.Item0 = color.Item2; // B <- R color.Item2 = temp; // R <- B src.Set(y, x, color); } } src.CopyTo(dst); Mat dat = dst.Clone(); Cv2.NamedWindow("dst", 0); Cv2.ImShow("dst", dst); Cv2.WaitKey(0); } } } }
标签:

C#-Opencv应用(2)之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C#-Opencv应用(2)之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]