C# - Opencv应用(3) 之矩阵Mat使用[图像截取粘贴、ROI操作、位运算、数学计算]

C# - Opencv应用(3) 之矩阵Mat使用[图像截取粘贴、ROI操作、位运算、数学计算]

  • 图像读取,大小、截取、位运算
  • 图像ROI操作:粘贴+赋值、滤波
  • 图像数学计算
  • 部分结果如下:

1.图像读取,大小、截取、位运算

csharp 复制代码
        //图像显示
        private static void showImg(string w_name,Mat img,int flg=0)
        {
            Cv2.NamedWindow(w_name, 0);
            Cv2.ImShow(w_name, img);
            Cv2.WaitKey(flg);
        }

        private static void SubMat()
        {
            var src = Cv2.ImRead("./images/Lenna.png");
            if(src.Empty())
            {
                Console.WriteLine("请检查图像输入!\n");
            }
            else
            {
                Console.WriteLine("读取图像大小:[" + src.Rows + "," + src.Cols + "]");
            }
            showImg("src", src);

            // Assign small image to mat
            var small = new Mat();
            Cv2.Resize(src, small, new Size(100, 100));
            src[10, 110, 10, 110] = small;
            showImg("src1", src);
            src[370, 470, 400, 500] = small.T();
            showImg("src2", src);
            // ↑ This is same as the following:
            //small.T().CopyTo(src[370, 470, 400, 500]);

            // Get partial mat (similar to cvSetImageROI)
            Mat part = src[200, 400, 200, 360];
            // Invert partial pixel values
            Cv2.BitwiseNot(part, part);

            // Fill the region (50..100, 100..150) with color (128, 0, 0)
            part = src.SubMat(50, 100, 400, 450);
            part.SetTo(128);

            using (new Window("SubMat", src))
            {
                Cv2.WaitKey();
            }

            part.Dispose();
        }

2. 图像ROI操作:粘贴+赋值、滤波

  • 针对不同范围的区域即ROI进行不同的操作,根本上是像素/灰度值的改变
csharp 复制代码
        //图像行列中的某些范围做操作
        private void RowColRangeOperation()
        {
            using var src = Cv2.ImRead(ImagePath.Lenna);

            Cv2.GaussianBlur(
                src.RowRange(100, 200),
                src.RowRange(200, 300),
                new Size(7, 7), 20);

            Cv2.GaussianBlur(
                src.ColRange(200, 300),
                src.ColRange(100, 200),
                new Size(7, 7), 20);

            using (new Window("RowColRangeOperation", src))
            {
                Cv2.WaitKey();
            }
        }

        /// <summary>
        /// Submatrix expression operations
        /// </summary>
        private void RowColOperation()
        {
            using var src = Cv2.ImRead(ImagePath.Lenna);

            var rand = new Random();
            for (int i = 0; i < 200; i++)
            {
                int c1 = rand.Next(100, 400);
                int c2 = rand.Next(100, 400);
                using Mat temp = src.Row(c1).Clone();
                src.Row(c2).CopyTo(src.Row(c1));
                temp.CopyTo(src.Row(c2));
            }

            ((Mat)~src.ColRange(450, 500)).CopyTo(src.ColRange(0, 50));

            src.RowRange(450, 460).SetTo(new Scalar(0, 0, 255));

            using (new Window("RowColOperation", src))
            {
                Cv2.WaitKey();
            }
        }

3.图像数学计算

  • 通过矩阵进行普通与归一化矩阵计算
csharp 复制代码
//数学计算
        /// <summary>
        /// Solve equation AX = Y
        /// </summary>
        private static void ByMat()
        {
            // x + y = 10
            // 2x + 3y = 26
            // (x=4, y=6)

            double[,] av = {{1, 1},
                          {2, 3}};
            double[] yv = { 10, 26 };

            var a = new Mat(2, 2, MatType.CV_64FC1, av);
            var y = new Mat(2, 1, MatType.CV_64FC1, yv);
            var x = new Mat();

            Cv2.Solve(a, y, x, DecompTypes.LU);

            Console.WriteLine("ByMat:");
            Console.WriteLine("X1 = {0}, X2 = {1}", x.At<double>(0), x.At<double>(1));
        }

        /// <summary>
        /// Solve equation AX = Y
        /// </summary>
        private static void ByNormalArray()
        {
            // x + y = 10
            // 2x + 3y = 26
            // (x=4, y=6)

            double[,] a = {{1, 1},
                          {2, 3}};

            double[] y = { 10, 26 };

            var x = new System.Collections.Generic.List<double>();

            Cv2.Solve(
                InputArray.Create(a), InputArray.Create(y),
                OutputArray.Create(x),
                DecompTypes.LU);

            Console.WriteLine("ByNormalArray:");
            Console.WriteLine("X1 = {0}, X2 = {1}", x[0], x[1]);
        }

完整代码

  • 主要代码结构如下:
csharp 复制代码
using System;
using OpenCvSharp;

namespace SamplesCore
{
    /// <summary>
    /// 
    /// </summary>
    class MatOperations
    {
        static void Main(string[] args)
        {
            ByMat();
            ByNormalArray();

            SubMat();
            RowColRangeOperation();
            RowColOperation();

            return;
        }
        
        //函数定义。。。。。。
    }
}
相关推荐
Hcoco_me3 分钟前
大模型面试题61:Flash Attention中online softmax(在线softmax)的实现方式
人工智能·深度学习·自然语言处理·transformer·vllm
阿部多瑞 ABU6 分钟前
`chenmo` —— 可编程元叙事引擎 V2.3+
linux·人工智能·python·ai写作
阿蒙Amon12 分钟前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
极海拾贝1 小时前
GeoScene解决方案中心正式上线!
大数据·人工智能·深度学习·arcgis·信息可视化·语言模型·解决方案
知乎的哥廷根数学学派1 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
小和尚同志1 小时前
又来学习提示词啦~13.9k star 的系统提示词集合
人工智能·aigc
昨夜见军贴06161 小时前
IACheck × AI审核重构检测方式:破解工业检测报告频繁返工的根本难题
人工智能·重构
知乎的哥廷根数学学派2 小时前
基于自适应多尺度小波核编码与注意力增强的脉冲神经网络机械故障诊断(Pytorch)
人工智能·pytorch·python·深度学习·神经网络·机器学习
好奇龙猫2 小时前
【AI学习-comfyUI学习-三十二节-FLXU原生态反推+controlnet depth(UNion)工作流-各个部分学习】
人工智能·学习