3.OpenCvSharp的图像基本运算:加、减、乘、除、与、或、异或——c#OpenCvSharp学习笔记

OpenCvSharp的图像基本运算:加、减、乘、除、与、或、异或

0.项目概述

项目实现了将两张图片基于OpenCvSharp进行基本的逻辑运算,并在picturebox上显示结果,最后将图片保存到本地磁盘。
项目源码及试验图片:https://download.csdn.net/download/sunsoldeir1/86400079
在这里插入图片描述

1基础步骤

1.1文件->新建->项目
在这里插入图片描述
1.2选择Windows窗体应用(.NET Framework),再点“下一步”。
在这里插入图片描述
1.3.自行设置“项目名称”和“位置”后,再点“创建”。
在这里插入图片描述
1.4在Form中点击右键,选择“查看代码”,之后安装OpenCvSharp
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.5下载并引用using OpenCvSharp;
在这里插入图片描述
1.6下载并引用using OpenCvSharp.Extensions;
在这里插入图片描述
在这里插入图片描述

2界面设计

2.1在左侧工具箱中,分别搜索Picturebox、Label、Button、ComBobox等控件并拖入。
在这里插入图片描述
2.2将Picturebox、Label、Button、ComBobox等控件进行布局、改名、调整形状和字体,形成如下界面:
在这里插入图片描述

3功能实现

3.1初始化变量

    Mat Img1;//用 Mat类定义图片1
    Mat Img2;//用 Mat类定义图片2
    Mat Img3;//用 Mat类定义图片3
    Bitmap bitmap;//Bitmap类定义picturebox3要显示的图片

3.2打开图片
分别双击:两个Button控件
在这里插入图片描述
在button1_Click的中部署以下代码,实现点击“打开图片1”后在Picturebox1中显示图片1:

  private void button1_Click(object sender, EventArgs e)
        {
    
    
            OpenFileDialog file = new OpenFileDialog();//OpenFileDialog是一个类,实例化此类可以设置弹出一个文件对话框
            file.Filter = "JPG(*.JPG;*.JPEG);PNG文件(*.PNG);bmp文件(*.BMP);gif文件(*.GIF)|*.jpg;*.jpeg;*.png;*.bmp;*.gif";//文件类型过滤,只可选择图片的类型
            file.ShowDialog();//显示通用对话框
            string pathname;//定义图片打开路径
            if (file.FileName != string.Empty)
            {
    
    
                try
                {
    
    
                    pathname = file.FileName;
                    Img1 = Cv2.ImRead(pathname);//读取路径下的图片
                    pictureBox1.Load(pathname); //pictureBox1直接加载 
                }
                catch (Exception ex)
                {
    
    
                    MessageBox.Show(ex.Message);
                }
            }
        }

在button2的中输入以下代码,实现点击“打开图片2”后在Picturebox2中显示图片2:

 private void button2_Click(object sender, EventArgs e)
        {
    
    
            OpenFileDialog file = new OpenFileDialog();//OpenFileDialog是一个类,实例化此类可以设置弹出一个文件对话框
            file.Filter = "JPG(*.JPG;*.JPEG);PNG文件(*.PNG);bmp文件(*.BMP);gif文件(*.GIF)|*.jpg;*.jpeg;*.png;*.bmp;*.gif";//文件类型过滤,只可选择图片的类型
            file.ShowDialog();//显示通用对话框
            string pathname;//定义图片打开路径
            if (file.FileName != string.Empty)
            {
    
    
                try
                {
    
    
                    pathname = file.FileName;
                    Img2 = Cv2.ImRead(pathname);//读取路径下的图片
                    pictureBox2.Load(pathname); //pictureBox1直接加载 
                }
                catch (Exception ex)
                {
    
    
                    MessageBox.Show(ex.Message);
                }
            }
        }

3.3选择运算符
左键点击combobox1控件,在“数据”的“Items”中点击省略号的按钮,打开字符串集合编辑器,换行输入:加、减、乘、除、与、或、异或,然后点击“确认”。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4运算

双击“运算”的button,首先要判断“图片1”、“图片2”是否加载图片,以及“运算符”是否进行选择,如果不存在则返回,并进行信息提示。

  if (pictureBox1.Image == null || pictureBox2.Image == null || comboBox1.Text=="")//判断图片或下拉栏目是否为空
            {
    
    
                MessageBox.Show("没有打开图片1或打开图片2或选择运算符");
                return;
            }

3.4.1加运算
使用Add()函数。
在这里插入图片描述
3.4.2减运算
使用Subtract()函数。
在这里插入图片描述
3.4.3乘运算
使用Multiply()函数。
在这里插入图片描述
3.4.4除运算
使用Divide()函数。
在这里插入图片描述
3.4.5与运算
使用BitwiseAnd()函数。
在这里插入图片描述
3.4.6与运算
使用BitwiseOr()函数。
在这里插入图片描述

3.4.7异或运算
使用BitwiseXor()函数。
在这里插入图片描述
3.4.8总结
上述两幅图片的长宽和深度需要相等,所以事先进行判断。

 if (Img1.Cols == Img2.Cols && Img1.Rows == Img2.Rows && Img1.Depth() == Img2.Depth())
                {
    
    
                    switch (comboBox1.Text)
                    {
    
    
                        case "加":
                             Cv2.Add(Img1, Img2, Img3);
                            break;
                        case "减":                            
                            Cv2.Subtract(Img1, Img2, Img3); 
                            break;
                        case "乘":
                             Cv2.Multiply(Img1, Img2, Img3);  
                            break;
                        case "除":
                             Cv2.Divide(Img1, Img2, Img3);                          
                            break;
                        case "与":
                             Cv2.BitwiseAnd(Img1, Img2, Img3); 
                            break;
                        case "或":
                            Cv2.BitwiseOr(Img1, Img2, Img3);
                            break;
                        case "异或":
                            Cv2.BitwiseXor(Img1, Img2, Img3);
                            break;
                        default:
                            break;
                    }
                }
                else
                {
    
    
                    MessageBox.Show("图片1和图片2要有相同的长宽以及位深度");
                    return;
                }
                    bitmap = BitmapConverter.ToBitmap(Img3); //把Mat格式的图片转换成Bitmap
                pictureBox3.Image = bitmap;
            }

3.5图片保存
使用SaveFileDialog类实现。
在这里插入图片描述

 private void button3_Click(object sender, EventArgs e)
        {
    
    
            SaveFileDialog saveImageDialog = new SaveFileDialog();
            saveImageDialog.Title = "图片保存";
            saveImageDialog.Filter = "jpg图片|*.JPG|gif图片|*.GIF|png图片|*.PNG|jpeg图片|*.JPEG|BMP图片|*.BMP";//文件类型过滤,只可选择图片的类型
            saveImageDialog.FilterIndex = 1;//设置默认文件类型显示顺序 
            saveImageDialog.FileName = "图片保存"; //设置默认文件名,可为空
            saveImageDialog.RestoreDirectory = true; //OpenFileDialog与SaveFileDialog都有RestoreDirectory属性,这个属性默认是false,打开一个文件后,那么系统默认目录就会指向刚才打开的文件。如果设为true就会使用系统默认目录
            if (saveImageDialog.ShowDialog() == DialogResult.OK)
            {
    
    
                string fileName = saveImageDialog.FileName.ToString();
                if (fileName != "" && fileName != null)
                {
    
    
                    string fileExtName = fileName.Substring(fileName.LastIndexOf(".") + 1).ToString();
                    System.Drawing.Imaging.ImageFormat imgformat = null;
                    if (fileExtName != "")
                    {
    
    
                        switch (fileExtName)
                        {
    
    
                            case "jpg":
                                imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                break;
                            case "png":
                                imgformat = System.Drawing.Imaging.ImageFormat.Png;
                                break;
                            case "gif":
                                imgformat = System.Drawing.Imaging.ImageFormat.Gif;
                                break;
                            case "bmp":
                                imgformat = System.Drawing.Imaging.ImageFormat.Bmp;
                                break;
                            default:
                                imgformat = System.Drawing.Imaging.ImageFormat.Jpeg;
                                break;
                        }
                        try
                        {
    
    
                            MessageBox.Show("保存路径:" + fileName, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            pictureBox3.Image.Save(fileName, imgformat);
                        }
                        catch
                        {
    
    
                            MessageBox.Show("图片保存失败!");
                        }
                    }
                }
            }
        }

猜你喜欢

转载自blog.csdn.net/sunsoldeir1/article/details/126327557
今日推荐