c# + Emgu.CV学习(一):基本图像处理


一、图形处理

1、创建图像

 Mat image = new Mat();

2、图像的读取、保存、展示

1.1、图像读取(路径)

 string path=@"E:\\0.jpg";  //图片路径
 Mat imageRead = CvInvoke.Imread(Path);  //读取图片

1.2、图像读取(图片)

 Mat imageRead = CvInvoke.Imread("0.jpg");  //读取图片

需将图片放置与项目起始位置
在这里插入图片描述
2、图像保存

//path:要保存的文件路径
//image:要保存的图片
 CvInvoke.Imwrite(Path, image); //保存图片

3、图片展示

//Image:展示窗体的名称
//image:要展示的图片
CvInvoke.Imshow("Image", image);  //展示图片 
//表示无限等待,直到有按键按下结束(如果不加这句,执行时窗口可能一闪而过;)
CvInvoke.WaitKey();    
//CvInvoke.waitKey(5000),表示5000毫秒即5秒后自动关闭窗口。                      

3、绘制文本和绘制图形

1、绘制线

 //参数: 输入图片,起始点,结束点,颜色,线条粗细
 CvInvoke.Line(image,new Point(100,100),new Point(130,130),new MCvScalar(0,255,255),15);

2、绘制矩形

//矩形 参数:x,y,长,宽
Rectangle rectangle = new Rectangle(200,10,50,50);
//绘制矩形 参数:输入图片,矩形,颜色,线条粗细
CvInvoke.Rectangle(image,rectangle,new MCvScalar(0,255,255),5);

3、绘制圆

//参数:输入图片,圆心坐标,半径,颜色,线条粗细(为-1时则填充)
CvInvoke.Circle(image,new Point(140,140),10,new MCvScalar(255,255,255),5);

4、绘制多边形

//多边形的各个点坐标
Point[] points = new Point[] {new Point(100,200),new Point(150,200),new Point(200,150),new Point(125,100),new Point(50,150)};
//绘制多边形 参数:输入图片,各个点坐标,是否封闭,颜色,线条粗细
CvInvoke.Polylines(image,points,true,new MCvScalar(0,255,255),3);

5、绘制文本

//图片 参数: 长,宽,颜色类型,通道数
Mat image = new Mat(200,500,DepthType.Cv8U,3);
image.SetTo(new Bgr(255,0,0).MCvScalar); //颜色
//绘制文本 参数:输入图片,文本,左下角坐标,字体类型,字体比例,颜色,粗细
CvInvoke.PutText(image, "hello world", new Point(10, 80),FontFace.HersheyComplex,2,new Bgr(0,255,255).MCvScalar,4);

3、颜色提取

        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            Bgr color = img[e.Y, e.X]; //获取该坐标的颜色
            label1.Text = color.ToString(); //将该坐标颜色输出给label
            //设置图片的长、宽、颜色
            Image<Bgr, Byte> image = new Image<Bgr, byte>(pictureBox2.Width,pictureBox2.Height,color); 
            //将图片转化为pictureBox控件的图片
            pictureBox2.Image = image.ToBitmap();
            
       int num = 10;   //差值
            ScalarArray max = new ScalarArray(new MCvScalar(color.Blue + num, color.Green + num, color.Red + num));
            ScalarArray min = new ScalarArray(new MCvScalar(color.Blue - num, color.Green - num, color.Red - num));
            Mat mat = new Mat();
            //在max到min范围的全为白,其他部分全为黑
            CvInvoke.InRange(img,min,max,mat);
            imageBox1.Image = mat;
        }

在这里插入图片描述

4、灰度图片

Mat grayImage = new Mat(); //创建图片
//参数 :输入图片、输出图片、灰度格式
CvInvoke.CvtColor(imageRead, grayImage, ColorConversion.Rgb2Gray);  //转化为灰度图像

5、二值化(先将图片转化为灰度图像)

Mat image = new Mat();  //创建图片
//参数:输入图像,输出图像,阈值,灰度的最大值,阈值类型
CvInvoke.Threshold(grayImage, image, 70, 255, ThresholdType.BinaryInv);

6、图像差

 Image<Bgr, Byte> result = image1.AbsDiff(image2);  //image1像素减去image2像素

7、图像合成

//像素加起来255,所以大部分是白色
//合成图片  参数:输入图片1,输入图片2,输出图片
CvInvoke.Add(readImage1, readImage2, image1);
//合成图片  参数:输入图片1,权重,输入图片2,权重,伽马值(光的测量值),输出图片
CvInvoke.AddWeighted(readImage1, 0.1, readImage2, 0.5, 0, image1);

8、把图像通过直方图显示

            Image<Bgr, byte> image = new Image<Bgr, byte>(fileName);
            
            //1、通过UI的HistogramBox直接显示处理
            //直方图
            //删除所有控制
            histogramBox1.ClearHistogram();
            //获取直方图   参数:输入图片,箱子数量(灰度0-255)
            histogramBox1.GenerateHistograms(image,256);
            histogramBox1.Refresh();
            histogramBox1.Show();


            //2、直方图计算
            Image<Bgr, byte> image1 = new Image<Bgr, byte>(300, 300, new Bgr(0, 0, 0));
            Image<Gray, byte> grayImage = image.Convert<Gray, byte>();
            //一种均匀的多维密集直方图    参数:箱子数量(多少不同像素值就有多少个箱子,例如灰度图像就是256个),像素范围值
            DenseHistogram dense = new DenseHistogram(256,new RangeF(0,255));
            //将图像投影到直方图箱 参数:需要计算的图像的数组,true(则直方图在开始时不会清除。此功能允许用户从多个图像中计算单个直方图,或在线更新直方图),有无掩模
            dense.Calculate(new Image<Gray, byte>[] { grayImage }, true, null);
            //获得数据。 返回 float[] 数组。
            float[] data = dense.GetBinValues();
            //获取最大值
            float max = data[0];
            for (int i =1;i<data.Length; i++)
            {
                if (data[i] > max)
                {
                    max = data[i];
                }
            }
            //计算
            for (int i=0;i<data.Length;i++)
            {
                data[i] = data[i] * 256 / max;
                image1.Draw(new LineSegment2DF(new PointF(i+20,255),new PointF(i+21,255-data[i])),new Bgr(255,255,255),2);
            }
            imageBox2.Image = image1;  //通过ImageBox显示

在这里插入图片描述

9、把单通道图像提取处来

1、BGR提取

            VectorOfMat channels = new VectorOfMat();//创建vectorOfmat类型存储分离后的图像(向量)
            //将多通道阵列划分为单独的单通道阵列   参数:输入图像,输出图像
            CvInvoke.Split(readImage, channels);
            InputOutputArray channel = channels.GetInputOutputArray();  //获得数组

            Mat B_channel = channel.GetMat(0);   //获得第一通道
            Mat G_channel = channel.GetMat(1);   //获得第二通道
            Mat R_channel = channel.GetMat(2);   //获得第三通道

            imageBox2.Image = B_channel;  //显示
            imageBox3.Image = G_channel;
            imageBox4.Image = R_channel;

2、HSV转换:色相(Hue)、饱和度(Saturation)、明度(Value)

            //加载图像
            Image<Bgr, byte> readImage = new Image<Bgr, byte>(Application.StartupPath+"\\image\\5.jpg");
            Image<Hsv, byte> hsvImage = readImage.Convert<Hsv, byte>();  

            VectorOfMat channels = new VectorOfMat(); //创建vectorOfmat类型存储分离后的图像
            CvInvoke.Split(hsvImage, channels); //通道分离
            InputOutputArray mix_channel = channels.GetInputOutputArray(); //获得数组

            Mat H_channel = mix_channel.GetMat(0); //获得第一通道
            Mat S_channel = mix_channel.GetMat(1); //获得第二通道
            Mat V_channel = mix_channel.GetMat(2);//获得第一通道

            imageBox2.Image = H_channel; //显示第一通道
            imageBox3.Image = S_channel; //显示第二通道
            imageBox4.Image = V_channel; //显示第三通道

二、加载图像


            //打开加载图像
            OpenFileDialog open = new OpenFileDialog();
            if (open.ShowDialog() == DialogResult.OK)  
            {
                filename = open.FileName;
                pictureBox1.Load(filename); 
                img= new Image<Bgr, byte>(open.FileName);  
            }

展示
在这里插入图片描述

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值