(1)单通道图像创建

Mat img1 = new Mat(240, 320, DepthType.Cv8U,1);img1.SetTo(new MCvScalar(100));CvInvoke.Imshow("Image", img1);

(2)三通道图像创建

img1.Create(240, 240, DepthType.Cv8U, 3);img1.SetTo(new MCvScalar(0, 0, 255));CvInvoke.Imshow("Image", img1);

(3)mask的使用,简单来说,就是制作一个和原图像相同大小的Mat数据,数值为0,1。1表示可见,0表示隐藏

private void button14_Click(object sender, EventArgs e)
{if (chapter1OFD.ShowDialog() == DialogResult.OK)chapter1Image = CvInvoke.Imread(chapter1OFD.FileName, LoadImageType.AnyColor | LoadImageType.AnyDepth);if (chapter1Image.IsEmpty)return;imageBox2.Image = chapter1Image;
}
private void button15_Click(object sender, EventArgs e)
{if (chapter1OFD.ShowDialog() == DialogResult.OK)chapter1Mask = CvInvoke.Imread(chapter1OFD.FileName, LoadImageType.AnyColor | LoadImageType.AnyDepth);if (!chapter1Mask.IsEmpty)imageBox3.Image = chapter1Mask;
}
private void button16_Click(object sender, EventArgs e)
{if (chapter1Mask.IsEmpty)return;chapter1GrayMask = new Mat(chapter1Mask.Size, chapter1Mask.Depth, 1);CvInvoke.CvtColor(chapter1Mask, chapter1GrayMask, ColorConversion.Bgr2Gray, 1);if (!chapter1GrayMask.IsEmpty)imageBox4.Image = chapter1GrayMask;
}
private void button17_Click(object sender, EventArgs e)
{if (chapter1GrayMask.IsEmpty | chapter1Image.IsEmpty)return; Mat mask = new Mat(chapter1Image.Size, DepthType.Cv8U, 1);Mat roi = new Mat(mask, new Rectangle(chapter1Image.Cols - chapter1GrayMask.Cols, chapter1Image.Rows - chapter1GrayMask.Rows, chapter1GrayMask.Cols, chapter1GrayMask.Rows));roi.SetTo(new MCvScalar(255));imageBox4.Image = mask;Mat result = new Mat();chapter1Image.CopyTo(result, mask);imageBox5.Image = result;
}

(4)修改图像像素值(以在图像中添加椒盐噪声为例)

Mat chapter2Img = new Mat();
Image<Bgr, byte> chapter2ImgBGR;
Image<Gray, byte> chapter2ImgGray;
private bool chapter2SaultNoise(Mat inImg,int n)
{int i, j;Random rd = new Random();IntPtr ip = inImg.Ptr;for(int k=0;k< n;++k){i = rd.Next(0, inImg.Rows);j = rd.Next(0, inImg.Cols);if(inImg.NumberOfChannels==1){chapter2ImgGray[i, j] = new Gray(0);}else if(inImg.NumberOfChannels==3){chapter2ImgBGR[i, j] = new Bgr(0, 0, 0);}else{return false;}}if (inImg.NumberOfChannels == 1){chapter2ImgGray.Mat.CopyTo(inImg);}else if (inImg.NumberOfChannels == 3){chapter2ImgBGR.Mat.CopyTo(inImg);}return true;
}
private void button18_Click(object sender, EventArgs e)
{if (chapter1OFD.ShowDialog() == DialogResult.OK)chapter2Img = CvInvoke.Imread(chapter1OFD.FileName, LoadImageType.AnyColor | LoadImageType.AnyDepth);elsereturn;imageBox6.Image = chapter2Img;if(chapter2Img.NumberOfChannels==1){chapter2ImgGray = chapter2Img.ToImage<Gray,byte>();}else if(chapter2Img.NumberOfChannels==3){chapter2ImgBGR = chapter2Img.ToImage<Bgr, byte>();}
}
private void button19_Click(object sender, EventArgs e)
{if (chapter2Img.IsEmpty)return;if (!chapter2SaultNoise(chapter2Img, 2000))return;imageBox6.Image = chapter2Img;
}

(5)图像减色,以下有两种方式;一是将mat转换为image后进行像素操作,二是将mat转换为MIplImage后进行指针操作

话说好不容易算是学会使用指针间接进行mat像素的操作了,哈哈···

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();//定时器
private void button19_Click(object sender, EventArgs e)
{if (chapter2Img.IsEmpty)return;if (!chapter2SaultNoise(chapter2Img, chapter2Img.Cols* chapter2Img.Rows/10))return;imageBox6.Image = chapter2Img;
}
/// <summary>
/// 将图像位数减小,系数为div
/// 此处假设图像为8位RGB图像,减少代码量
/// </summary>
/// <param name="inImg"></param>
/// <param name="div"></param>
/// <returns></returns>
private bool chapter2ColorReduce(Mat inImg,int div=64)
{int nc = inImg.Cols;int nr = inImg.Rows;if (inImg.IsEmpty)return false;Image<Bgr, byte> tempImg = inImg.ToImage<Bgr, byte>();for(int i=0;i<nr;++i)for(int j=0;j<nc;++j){tempImg.Data[i, j, 0] = (byte)(tempImg.Data[i, j, 0] / div * div + div / 2);tempImg.Data[i, j, 1] = (byte)(tempImg.Data[i, j, 1] / div * div + div / 2);tempImg.Data[i, j, 2] = (byte)(tempImg.Data[i, j, 2] / div * div + div / 2);}tempImg.Mat.CopyTo(inImg);return true;
}
private void button21_Click(object sender, EventArgs e)
{if (chapter1OFD.ShowDialog() == DialogResult.OK)chapter2Img = CvInvoke.Imread(chapter1OFD.FileName, LoadImageType.AnyColor | LoadImageType.AnyDepth);if (chapter2Img.IsEmpty)return;imageBox7.Image = chapter2Img;}private void button20_Click(object sender, EventArgs e)
{sw.Start();var tempImg = chapter2Img.Clone();if (!chapter2ColorReduce(tempImg,(int)numericUpDown1.Value))return;imageBox7.Image = tempImg;sw.Stop();textBox2.Text += "\n" + sw.ElapsedMilliseconds.ToString();
}private void button22_Click(object sender, EventArgs e)
{sw.Start();if (chapter2Img.IsEmpty)return;var tempImg = chapter2Img.ToImage<Bgr, byte>();unsafe{int nr = tempImg.Rows;int ncol = tempImg.Cols;int nc = tempImg.NumberOfChannels;int stride = tempImg.MIplImage.WidthStep;byte* data = (byte*)tempImg.MIplImage.ImageData;int div = (int)numericUpDown1.Value;for (int i=0;i<nr;++i){for(int j=0;j< stride; ++j){data[j] = (byte)(data[j] / div * div + div / 2);}data += stride;}sw.Stop();}imageBox7.Image = tempImg;sw.Stop();textBox2.Text += "\n          " + sw.ElapsedMilliseconds.ToString();
}

另外,这两种方式我进行了运行效率的对比(从按下按钮开始到图像显示),image方式处理的耗时为242ms,指针方式耗时251ms。具体对比的程序段可能没设置好,不过从这个结果来看,好像两者差不多。

EmguCV学习(一)相关推荐

  1. 【计算机视觉】EmguCV学习笔记(4)分离颜色通道以及多通道图像混合

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  2. 【计算机视觉】EmguCV学习笔记(3)ROI区域图像叠加以及初级图像混合

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  3. 【计算机视觉】EmguCV学习笔记(2)图像的载入、显示和输出

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  4. 【计算机视觉】EmguCV学习笔记(1)Hello World

    如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习. If you like the content here, you can give me the greates ...

  5. EmguCV学习遇到的问题记录

    调试C# EmguCV时遇到错误,初始化Image错误,如下: The type initializer for 'Emgu.CV.CvInvoke' threw an exception 可能的解决 ...

  6. EmguCV学习(三)

    (1)直方图伸展以及直方图均衡化 观察某些图像的释放图可以很容易看到,整个可用的强度值范围并没有被完全利用,特别是图像中比较亮的强度值.这里,通过伸展直方图来生成一个对比度更高的图像. 然后,利用EM ...

  7. EmguCV学习(二)

    (1)图像锐化处理 //此部分代码功能是锐化图像,本质上是 扫描图像并访问相邻像素 //sharpened_pixel=5*current-left-right-up-down byte satura ...

  8. 35-运动物体检测1(EmguCV学习)

    运动物体检测 Record Code 效果 1. 图片背景差法: 2. 视频背景差法检测运动物体: 3. 图片帧差法检测运动物体: 4. 视频帧差法检测运动物体 Record 1.运动物体检测常用的方 ...

  9. Emgu CV3+C#图像处理(一):Emgu CV学习目录+EmguCV安装配置与使用

    EmguCV学习目录: Emgu CV3+C#图像处理(一):Emgu CV学习目录+EmguCV安装配置与使用 Emgu CV3+C#图像处理(二):EmguCV主要模块简介 Emgu CV3+C# ...

最新文章

  1. P3201 [HNOI2009]梦幻布丁 [启发式合并][set]
  2. 为什么单击用户账户没有反应_为什么您的网站没有流量?是因为用户搜不到你!...
  3. 钉钉扫码登录的实现 与OAUTH2.0
  4. java android 数组_Android开发基础之Java 数组
  5. 关于推送系统设计的一些总结与思考(三)
  6. 过去几年接触了很多小公司小品牌
  7. mssql 存储过程 group by 集合并逗号要开某字段
  8. 移植Andorid4.0.4 - 步骤及问题汇总
  9. Windows Vista SP2 和 Windows Server 2008 SP2 已经发布
  10. JS显示当前时间(包含农历时间)
  11. Windows电脑上搭建Radius 服务器并实现802.1X认证
  12. 【复】从0到1的 selenium 爬虫经历
  13. Android applink 踩坑指南
  14. 利用selenium实现淘宝双十一抢购商品
  15. SpringCloud之Eureka实战和架构设计解析
  16. CAN通讯协议层--秉火STM32学习笔记
  17. 命令行工具(Command line tools)
  18. springboot基于web的在线问答社区系统设计与实现毕业设计源码061628
  19. 2017 计蒜之道 初赛 第一场 A、B题
  20. 浅析ReentLock的使用

热门文章

  1. 【北大青鸟天府校区的Java专业怎么样?】
  2. html使表格位于页面的右下方,在 HTML 页面中,要显示如下图所示的表格,应在下方 HTML 代码的下划线处填写()。 table border=”1” trtd =”2” 性别 /...
  3. Fedora最新下载地址
  4. 十年前的AlexNet,今天的NeurIPS 2022时间检验奖
  5. 怎么远程控制别人电脑
  6. 计算机缺少opencl.dll,opencl.dll损坏,如何修复
  7. 刷题刷题(个人记录)
  8. HDU 4685. Prince and Princess
  9. win7mysql5.7.25安装教程_win7下MySql 5.7安装配置方法图文教程
  10. keepalive+nginx搭建主从负载服务器