C#本身自带有一定的图像处理能力,即使在不依赖Emgu CV的情况下,也是有很大的潜质的。

不过,最近在处理大量图片时,发现图片数量较少时,处理本身所带来的延时不会让人敏感,但是数量较大时,程序花费大量时间在预处理图片上,导致程序很容易误报线程时延过大,导致误判程序异常。对于这个问题苦恼很久,毕竟不是CS专业出身,对于图像处理以及一些算法和库的运用上感到毕竟吃力。

今天在阅读了一些数字图像处理的书之后感到收益很大,现在来做点试验对照一下之前自己的错误在哪里。

之前看MS的C#API时候发现有一个Graphics挺适合我现在使用,于是便二话不说开干,今天才发现越来封装的太好,反而会带来许多拖累,不如操起指针畅快的运行。

不多说,试验对比的是Graphics、操作内存、操作指针三者在性能上差距。

试验内容:对同一张照片进行灰度处理,直接看三者之间延时有多大

1.试验基本场景,比较丑陋,就凑合看着。。。

2.提取像素Button中,调用Graphics灰度化处理

private void button2_Click(object sender, EventArgs e){if (curBitMap1 != null){Color curColor;int ret;//个人运行时间判断类GetRunTime getRunTime = new GetRunTime();//stopWatch启动getRunTime.Start();//Graphics//灰度化for (int i = (int)(0); i < (int)(curBitMap1.Width ); i++){for (int j = 0; j < curBitMap1.Height; j++){//获取像素curColor = curBitMap1.GetPixel(i, j);//获取RGBret = (int)(curColor.R * 0.299 + curColor.G * 0.587 + curColor.B * 0.114);//设置像素curBitMap1.SetPixel(i, j, Color.FromArgb(ret, ret, ret));}}Invalidate();labelGetPixel.Text = "提取像素花费时间:" + getRunTime.getRunTime() + "ms";}}

  

3.内存法Button中,直接复制数据到内存,直接操作

private void button5_Click(object sender, EventArgs e){if (curBitMap2 != null){GetRunTime getRunTime = new GetRunTime();getRunTime.Start();Rectangle rect = new Rectangle(0, 0, curBitMap2.Width, curBitMap2.Height);//以读写方式锁定位图System.Drawing.Imaging.BitmapData bmpData =curBitMap2.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, curBitMap2.PixelFormat);//首地址IntPtr ptr = bmpData.Scan0;//24位bmp的总字节数int bytes = curBitMap2.Width * curBitMap2.Height * 3;byte[] rgbValues = new byte[bytes];//复制被锁定的图像到rgbValuesSystem.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);double colorTemp = 0;//灰度化for (int i = 0; i < bmpData.Height; i++){for (int j = 0; j < bmpData.Width * 3; j+=3){//跳过空白块colorTemp = rgbValues[i * bmpData.Stride + j + 2] * 0.299 + rgbValues[i * bmpData.Stride + j + 1] * 0.587 + rgbValues[i * bmpData.Stride + j] * 0.114;rgbValues[i * bmpData.Stride + j + 2] = rgbValues[i * bmpData.Stride + j + 1] = rgbValues[i * bmpData.Stride + j] = (byte)colorTemp;}}//复制回位图System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);curBitMap2.UnlockBits(bmpData);Invalidate();labelCaChe.Text = "提取像素内存法花费时间:" + getRunTime.getRunTime() + "ms";}}

  

4.指针法Button中,直接复制数据到内存,指针操作 

private void button6_Click(object sender, EventArgs e){GetRunTime getRunTime = new GetRunTime();getRunTime.Start();Rectangle rect = new Rectangle(0, 0, curBitMap3.Width, curBitMap3.Height);//以读写方式锁定位图System.Drawing.Imaging.BitmapData bmpData =curBitMap3.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, curBitMap3.PixelFormat);byte temp = 0;unsafe{//首地址byte* ptr = (byte*)(bmpData.Scan0);//灰度化for (int i = 0; i < bmpData.Height; i++){for (int j = 0; j < bmpData.Width;j++ ){temp = (byte)(0.299 * ptr[2] + 0.587 * ptr[1] + 0.114 * ptr[0]);ptr[0] = ptr[1] = ptr[2] = temp;ptr += 3;}//跳过空白块ptr += bmpData.Stride - bmpData.Width * 3;}}//解锁位图curBitMap3.UnlockBits(bmpData);Invalidate();labelPoint.Text = "提取像素内存法花费时间:" + getRunTime.getRunTime() + "ms";}

5,简单完善一下就开始打开图片看看运行时间之间的对比吧

总结:虽然电脑烂,但还是看得出三者之间的差距吧。复制进内存直接操作和用指针操作都是极大的提高效率,如果处理一张图片节约60ms,那处理大量的图片时候将会节约多少时间?所以今后处理图像的时候,如果不用Emgu,尽量也别用Graphics,还是自己动手操作内存。(肯定会有人说,你为毛不去用C++,好吧,我其实就是在黑Graphics,你咬我呀~)

转载于:https://www.cnblogs.com/zhaolion/p/4410200.html

C# 处理图像三种方法对比相关推荐

  1. OpenCV-图像像素遍历操作的三种方法对比(程序提速)

    作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 使用OpenCV,避免不了的就是对图像像素进行操作,遍历操作更是家常便饭,当图像数据不多时, ...

  2. stcisp一直检测单片机_三种方法对比:STC51单片机实现免冷启动

    具体实现方法实践可用的无外乎三种: 1)使用CH340的DTR和RTS控制单片机断电再上电.点上位机下载按钮的时候,DTR和RTS引脚电平变化. 2)再使用一个单片机,检测串口下载命令流. 3)在程序 ...

  3. Sql 列转行 三种方法对比

    合并列值   --******************************************************************************************* ...

  4. 利用opencv实现图像马赛克处理的三种方法

    前言:本文就图像的马赛克处理,基于opencv提出了三种解决方案,并详细地介绍了三种方法的原理.示例.问题及问题的解决方案. 方法一 原理介绍:利用resize()将图片先缩小,再放大 代码示例: i ...

  5. php遍历数组哪个效率高,PHP遍历数组的三种方法及效率对比分析

    PHP遍历数组的三种方法及效率对比分析 发布于 2015-03-04 21:55:27 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

  6. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

  7. 图像灰度化的三种方法(matlab、C++、Python实现)

    灰度化处理就是将一幅色彩图像转化为灰度图像的过程.彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程.灰度值大的像素点比较亮(像素值最大为255,为 ...

  8. java-pdf合并三种方法实现以及简单效率对比

    在之前项目有个功能中需要做多个PDF合并,而且可能pdf数量会很多,所以在实现了三种方式后做了一下简单的时间对比 第一种方法 用的spire.doc.free依赖 <dependency> ...

  9. mybatis批量更新数据三种方法效率对比

    探讨批量更新数据三种写法的效率问题. 实现方式有三种, 1> 用for循环通过循环传过来的参数集合,循环出N条sql,需要在db链接url后面带一个参数  &allowMultiQuer ...

  10. HTML5系列代码:使用三种方法插入图像

    drawImage() 方法在画布上绘制图像.画布或视频. drawImage() 方法也能够绘制图像的某些部分,以及/或者增加或减少图像的尺寸. <!DOCTYPE HTML> < ...

最新文章

  1. 在Digital Ocean上的MongoDB
  2. 【转载】插件自动升级
  3. python二维数组初始化
  4. 开发相关手册、STM32各种库文件、相关软件、工具连接等(不断更新)
  5. ExtJS学习:MVC模式案例(一)
  6. IBASE deletion timestamp verification
  7. base cap 分布式_高并发架构系列:详解分布式一致性ACID、CAP、BASE,以及区别
  8. 计算机图形图像电影论文,计算机图形图像绘制技术地现状分析及应用发展.doc...
  9. readdirectorychangesw 链接错误 undeclared identifier 解决方法
  10. PICT实现组合测试用例
  11. python函数:基础函数调用整理
  12. 阿里巴巴代码平台架构的演进之路
  13. 没想到,我都来阿里5年了!
  14. 这67款APP被下架了
  15. neo4j 删 delete
  16. 创建简单的maven archetype
  17. OFFICE拼写语法检查:全部忽略、全部更正的功能
  18. ActivityGroup 例子
  19. window驱动备份与安装
  20. P1137 旅行计划

热门文章

  1. 比特币 POW 白皮书 区块篡改成功的概率计算详解
  2. python判断是否为素数的函数 是返回字符串yes_编写函数,判断一个数字是否为素数,是则返回字符串 YES ,否则返回字符串 NO 。_学小易找答案...
  3. mysql 字符串搜_Mysql搜索字符串
  4. 阿里云mysql远程连接_阿里云从0安装mysql到远程连接
  5. gtx1050ti最稳定的驱动_最便宜图灵吃鸡卡 华硕GTX 1650评测
  6. mac 安装 mongo 及基本命令
  7. k8s(Kubernetes) 上部署 Redis 集群(3主3从)
  8. Centos7 Kubernetes(K8s) k8s 开发 单服务器部署 rocketmq
  9. Mariadb 10.0.12 服务器my.cf配置
  10. LayaAir destroy 销毁与 removeChild 移除节点