文档章节

VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:38
字数 1075
阅读 13
收藏 0

  早期的时候我使用的开发工具是VB6,VB6做图像处理的速度在我的软件Imageshop中有所体现,还是算可以的。目前,我已经改用C#来研究图像算法,C#中有指针,做图像处理起来效率确实要高不少。VB.NET当初也用过不到半年的时间,在http://blog.csdn.net/laviewpbt/article/details/752003一文中我曾经对VB.NET图像处理做了简单的总结。今天就我掌握的情况,在对VB.NET的图像处理做一个简单的描述。

      首先,还是谈谈图像像素时数据获取方面吧,.net中的图像相关类基本上都是基于GDI+的,因此,图像数据的获取其实也是调用GDI+的一些函数。这个函数就是LockBits,在vb.net中彩色图像数据的快速获取 一文中,我们是调用了Marshal.Copy把LockBits锁定的内存数据拷贝到数据中,然后对数组中的值进行处理。这样做主要的原因是VB.NET不好直接访问内存(Marshal.ReadByte之类的函数不适合用于大型的循环中)。那么,这就造成了2个不好的事情,第一:在同一时间需要2倍于图像数据量的内存,第二:内存数据拷贝到数据,以及处理后再把数组的数据拷贝会内存中都是会减低速度的。作为一种改进,我们应该充分利用LockBits的功能。LockBits中的LockMode中有一种模式为ImageLockMode.UserInputBuffer,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:

Dim BmpData As New BitmapData
  Stride = ((Bmp.Width * 3 + 3) And &HFFFFFFFC)
  Dim PixleValue(Stride * Bmp.Height) As Byte
  Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)
  BmpData.Scan0 = Hanlde.AddrOfPinnedObject()                                 '取得字节数组的的第一个元素在内存中的地址,VB.NET没有了VB6.0的VarPtr函数了
  BmpData.Stride = Stride                                                     'Stide这一个字段也必须实现填充,这个需要按照像素格式来计算大小,必须为4的倍数
  Bmp.LockBits(New Rectangle(0, 0, Bmp.Width, Bmp.Height), ImageLockMode.ReadWrite Or ImageLockMode.UserInputBuffer, PixelFormat.Format24bppRgb, BmpData)
  Hanlde.Free()

  这种调用模式下,BitmapData对象的Scan0和Stride必须由用户自行计算,其中Scan0为保存解码后的数据内存的地址。在VB.NET中获取数组内存地址的代码似乎比VB6复杂一些,这一点我也不是特别在行。

      调用上述代码后,PixleValue就已经保存了图像的数据了。

      之后就是对图像数据进行各种各样的处理了。比如我们那前一段日子共享的色调均化的代码为例:

For Y = 0 To Height - 1
            Speed = Y * Stride                          ' 定位到每个扫描行的第一个像素,以避免溶于数据的影响
            For X = 0 To Width - 1
                HistGram(PixleValue(Speed)) += 1        ' Blue
                HistGram(PixleValue(Speed + 1)) += 1    ' Green
                HistGram(PixleValue(Speed + 2)) += 1    ' Red     
                Speed += 3                              ' 移向下一个像素
            Next
        Next

        Num = 0
        For Y = 0 To 255
            Num = Num + HistGram(Y)         ' 计算映射表
            Lut(Y) = CByte(Math.Truncate(CSng(Num) / (Width * Height * 3) * 255))
        Next
        For Y = 0 To Height - 1
            Speed = Y * Stride
            For X = 0 To Width - 1
                PixleValue(Speed) = Lut(PixleValue(Speed))
                PixleValue(Speed + 1) = Lut(PixleValue(Speed + 1))
                PixleValue(Speed + 2) = Lut(PixleValue(Speed + 2))
                Speed += 3
            Next
        Next

  执行速度比较:针对上述算法,我们只比较算法的执行部分的耗时。

      测试语言            测试图像(512*384)耗时      测试图像(1024*768)耗时    测试图像(4000*3000)耗时  

       VB.NET                7ms              25ms              178ms

        c# 指针        4ms                                  16ms              100ms

        c# 数组                     5ms                                  24ms              139ms

     上表中可以明显看出指针在速度上还是有明显的优势的,唯一值得注意的是,VB.NET的数组版要比C#的数组版的速度要慢,由于VB.NET中我不知道怎么样查看其对应的反汇编码,所以我还不清楚这是为什么。 

     上述三种方案的代码下载:http://files.cnblogs.com/Imageshop/HistgramEqualize%28VB.NETandCsharp%29.rar

     看来VB.NET确实不是图像处理方案的首选工具啊。

 

 ***************************作者: laviewpbt   时间: 2013.4.07    联系QQ:  33184777  转载请保留本行信息*************************

 

 

本文转载自:http://www.cnblogs.com/Imageshop/p/3162753.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
私信 提问
vb.net 教程 5-16 图像处理例子 2 半透明的图片水印

图片水印有两种方法,一是读取水印的所有像素颜色,颜色上加上设置的alpha值,然后将每个像素绘制到指定的位置;二是使用颜色矩阵(如果忘记了如何使用颜色矩阵的朋友,可以参看《vb.net 教程...

uruseibest
2018/03/03
0
0
DotImage 动态调整Text Annotation的字体大小

在WinForms项目中,当调整TextAnnotation时,.Net图像处理控件DotImage会自动换行TextAnnotation中的文本。如果你想动态改变字体大小本身,你可以在 AnnotateViewer的AnnotationResized事件中...

panda456
2014/05/15
112
0
vb.net 教程 目录

最新更新:vb.net 教程 3-8 窗体编程 容器 3 SplitContainer(2017-12-27 20:30) 顺便说一下,似乎csdn有时候会对文章进行审核,如果看不到这篇文章,表示正在审核中。 如何支持博主完成教程...

uruseibest
2017/04/07
0
0
非空/QrF.FaceRecognition

QrF.FaceRecognition .net C# 图像处理以及人脸识别 QrF.Core.FaceRecognition.API 基于.net core 的图像处理项目 使用ImageSharp来处理图片 QrF.FaceRecognition.API 基于.net framework 的......

非空
2018/08/06
0
0
C#运动物体识别库--Aforge

AForge.NET 是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域。这个框架由一系列 的类库和例子组成。 其中...

匿名
2010/04/26
26.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Table API及SQL Programs

序 本文主要研究一下flink的Table API及SQL Programs 实例 // for batch programs use ExecutionEnvironment instead of StreamExecutionEnvironmentStreamExecutionEnvironment env = Stre......

go4it
17分钟前
0
0
mysqldump应用

备份单个库/表数据或库/表结构 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 备份文件名 1、导出数据库为dbname的表结构(其中用戶名為root,密码为dbpasswd,生成的...

阿dai
25分钟前
0
0
shell脚本与Python的交互

1、Python针对shell获取传入,输出参数 传入:"$num" 例如: $0表示文件名,$1表示shell获取的第一个参数 输出:通过打印shell结果的方式,输出参数给Python。 例如: echo "{$iplist}",Python调...

一口今心
27分钟前
0
0
Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造

阿里妹导读:千呼万唤始出来!阿里妈妈正式公布重磅开源项目——图深度学习框架Euler。这是国内首个在核心业务大规模应用后开源的图深度学习框架。此次开源,Euler内置了大量的算法供用户直接...

阿里云官方博客
35分钟前
0
0
TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部