Conner's profile☆ Conner Wang ☆PhotosBlogListsMore ![]() | Help |
|
January 31 又到了写年终总结的时候了转眼又是一年,又到了写年终总结的时候了。 这次我都不知该从何开始写起了。总之在过去的一年中,收获挺多的。朋友又多了,知识也长了,更重要的是自己的心理素质提高了许多。自己能够得心地应付一些事情了,在压力面前也显得从容不迫了。另外,对自己的前途也有了一个较为明确的定位。 明年是值得期待的,因为我有所企盼。期待再见到那些小家伙们,期待能够找到一份理想的工作,期待能够发生一段美丽而动人的故事。 祝我的朋友们明年心想事成,祝自己明年能有更大的进步! 庆祝通过软件设计师考试软考成绩也不知道什么时候出来的,我这几天几乎天天去省人事考试中心网站上查看,连个通知也没有。今天中午无意中百度了一下,竟然把查询网页给搜出来了,心里那个恨啊。 准考证我从一个月以前就随身携带了,就盼着哪天能查个成绩。我赶紧输入考号,查了成绩。结果考得还不错: 这个成绩我还是比较满意的,至少国庆节那个假期没有白过。 January 28 生活还是规律点好如果每天都很忙碌,很充实,就没有时间去想烦恼的事,过得会很好。最怕的就是忙碌之后无尽的放纵,那样之后心就很难再收回来了。 这两天本来没有什么要紧的事,逛了两回街,看了三部电影,打了一次扑克。按说也没有堕落到底吧,怎么今天情绪就突然有些低落。这心情一不好,就什么事都不想干,满脑子里又想起好多烦人的事情,真是莫名其妙。 周围的人都一个一个的回家了,校园里冷清了不少,餐厅里的饭菜也越来越没味道了。 今天晚上睡个早觉,明天再好好干吧! January 20 我看编程语言的学习有些时候觉得自己可能太过于盲目了,其实有很多东西在真正使用它之前是不需深入了解的。毕竟现在还在学生阶段,还没有进入职业生涯,当然也就还没有把某项技能当作生存的依赖。比如说编程语言吧,我认为现在只要把C/C++深入掌握就行了。至于其它语言,比如说Java、C#、Ruby等等,只要把基础的语法级别的东西了解下就行了。这些语言所包含的高级特性和思想,不是一时半刻就能参悟得了的,而是要等有了实践经验之后才能体会到的,更何况工作以后可能根本就用不到。而且有些新兴的东西,还没有经过时间的考验和锤炼,学了可能也白学。 我一向认为C/C++是最折磨人的语言,因而也是最能锻炼人的语言。从面向过程到面向对象,从继承到范型,从底层操作到高层抽象,C/C++都能让你如愿以偿。甚至于如果你愿意,你可以自己实现任意级别的封装与抽象。你一旦经过C/C++的洗礼,再转向其它编程语言就会很简单了。 现在可以把网撒得很大,尽量开阔自己的视野,但不可强求样样精通。因为一个人的精力是有限的,我可不想把睁着眼睛的时间都用来研究新技术。 下一步,我不想再在编程语言上花费太大功夫了,想学一学Linux C和网络编程的东西。我知道这个课题还是很大,只有一步一步来了。 January 19 成功在虚拟机上安装JeOS很久以前就装过Linux,包括Redhat、Bluepoint、Redflag等等。但那时只是出于好奇,装上玩玩而已,并没有去深入研究过它。所以到现在为止,我也还没能学会Linux的哪怕是最基本的操作和使用。这次我是来真的了,打算好好研究一下Linux。我的计划是,先找一个主流的Linux发行版,最小化安装(不安装图形界面),练习练习Linux下的基本命令,等对它有了一个了解了以后,再学习Linux环境下的编程,如果最后觉得确实对Linux感兴趣的话,就再看一些关于内核方面的东西。 说到不如做到,昨天下了一个Ubuntu JeOS 7.10 (Gutsy Gibbon)的安装镜像。今天上午成功地在VMware Workstation 6.0.2上把它安装上了。我知道我要开始Linux之旅了。 何谓Jeos,我为什么要选这个版本呢?Ubuntu想必大家都很熟悉了吧?Ubuntu是一个很年轻的Linux发行版,但现在却是在桌面Linux中受关注度最高的。根据http://DesktopLinux.com和http://distrowatch.com的最新排名,Ubuntu遥居榜首。那到底什么是Ubuntu JeOS呢? Ubuntu JeOS (Just enough Operation System, pronounced "Juice") is an efficient variant of the Ubuntu Server operating system, configured specifically for virtual appliances. Currently available as a CD-ROM ISO for download, JeOS is a specialized installation of Ubuntu Server Edition with a tuned kernel that only contains the base elements needed to run within a virtualized environment. Ubuntu JeOS has been tuned to take advantage of key performance technologies in the latest virtualization products from VMware. This combination of reduced size and optimized performance ensures that Ubuntu JeOS Edition delivers a highly efficient use of server resources in large virtual deployments. Without unnecessary drivers, and only the minimal required packages, ISVs can configure their supporting OS exactly as they require. They have the peace of mind that updates, whether for security or enhancement reasons, will be limited to the bare minimum of what is required in their specific environment. In turn, users deploying virtual appliances built on top of JeOS will have to go through fewer updates and therefore less maintenance than they would have had to with a standard full installation of a server. January 17 我看《对象揭密:Java、Eiffel和C++》[读书笔记] 花了两天时间看完了这本书。 该书作者无疑是面向对象领域的专家,但不知道是对C/C++有愁恨还是怎么着,这本书自始至终都在批判C/C++。该书从各个角度,把C/C++批判的狗血淋头、体无完肤。我相信很多C/C++程序员看这本书会看得咬牙切齿,但想一想却又觉得作者说得不无道理。确实,C/C++的功能是最强大的,它能让你从各个层次让程序员知道自己的程序是如何工作的。程序员在用C/C++编程的时候,会从最底层知道自己都干了些什么,而且对于优秀的C/C++程序员,必须要知道自己在干什么。C/C++这样的语言是对程序员极度信任的语言,从而也把更多的责任推卸给了程序员。而语言本身又有许多陷阱,所以开发C/C++程序往往很低效,并且普通程序员是很难开发出高质量的程序的。而其它一些相对年轻的语言如Java、Eiffel,往往是让编译器和运行环境来做更多的工作,从而提高了程序开发的效率的质量。 虽然书中重点比较了Java、Eiffel和C++这三种语言(其中Eiffel语言是我所没接触过的),但作者的讨论并没有仅限于这三种语言。书中提到了好多其它的语言,及其发展和特点,并作了一定的论述,使我从一个更广阔的视野和角度来理解编程语言本身。无论你使用的是哪一种语言,看此书都会对提高你的编程水平有所帮助。 最近正好在学C#语言,C#语言是一种相对较新的语言,它结合了其它许多编程语言的优点。在学C#的过程中,我发现C#语言本身的特性都和该书中所讲的内容不谋而合。本书成书于1999年,至今也已经八年了,可见作者当时对编程语言的发展趋势的把握还是很到位的。 我自己平时都是用C/C++来写程序。由于我写的程序一般都是用于科学计算的,对程序的执行速度有严格要求的,唯有C/C++才能满足我的要求。我相信系统级的编程和驱动级的编程也将永远离不开C/C++这类的语言。当然现在编程的主流是基于网络服务的应用程序,像Java、C#之类的语言更胜任这一工作。但是,不是主流的应用并不代表不再需要,底层程序必须也得有人写,底层的语言也必将永远存在。正像现在好多电子设备都是数字化的,数学技术和器件的应用无所不在。但是模拟技术和器件却将永远也不会消失,因为它们是基础。无论是一个什么样的电子设备,能支撑它运行的最最底层的物理量仍然是模拟量。 语言之争一直在持续,正如书中所说:语言的进化史上将不会有一个最终的胜利者,新的语言会被不断地发明出来,编程语言的世界不会在哪一天稳定下来不再前进,所以我们要将所有的语言都看作过客,不应该对它们长久效忠。我觉得这一句话是很有道理的,但是这一句话应该是只适用于那些面向高层应用的语言,如Java、C#、Php、Perl、Python、Ruby等。而C/C++程序员一定要劳记,我们的定位是与它们有别的。我忘了是谁说的了,也许哪一天你就会被当作稀有动物给保护起来。 January 14 使用C#进行图像处理的几种方法本文讨论了C#图像处理中Bitmap类、BitmapData类和unsafe代码的使用以及字节对齐问题。 Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。 利用C#类进行图像处理,最方便的是使用Bitmap类,使用该类的GetPixel()与SetPixel()来访问图像的每个像素点。下面是MSDN中的示例代码:
可见,Bitmap类使用一种优雅的方式来操作图像,但是带来的性能的降低却是不可忽略的。比如对一个800*600的彩色图像灰度化,其耗费的时间都要以秒为单位来计算。在实际项目中进行图像处理,这种速度是决对不可忍受的。
BitmapData类 命名空间:System.Drawing.Imaging 指定位图图像的属性。BitmapData 类由 Bitmap 类的 LockBits 和 UnlockBits 方法使用。不可继承。 好在我们还有BitmapData类,通过BitmapData BitmapData LockBits ( )可将 Bitmap 锁定到系统内存中。该类的公共属性有:
下面的MSDN中的示例代码演示了如何使用 PixelFormat、Height、Width 和 Scan0 属性;LockBits 和 UnlockBits 方法;以及 ImageLockMode 枚举。
上面的代码演示了如何用数组的方式来访问一幅图像,而不在使用低效的GetPixel()和SetPixel()。
unsafe代码 而在实际中上面的做法仍然不能满足我们的要求,图像处理是一种运算量比较大的操作,不同于我们写的一般的应用程序。我们需要的是一种性能可以同C++程序相媲美的图像处理程序。C++是怎么提高效率的呢,答曰:指针。幸运的是.Net也允许我们使用指针,只能在非安全代码块中使用指针。何谓非安全代码? 为了保持类型安全,默认情况下,C# 不支持指针运算。不过,通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文。在公共语言运行库 (CLR) 中,不安全代码是指无法验证的代码。C# 中的不安全代码不一定是危险的,只是其安全性无法由 CLR 进行验证的代码。因此,CLR 只对在完全受信任的程序集中的不安全代码执行操作。如果使用不安全代码,由您负责确保您的代码不会引起安全风险或指针错误。不安全代码具有下列属性:
正如《C#语言规范》中所说无论从开发人员还是从用户角度来看,不安全代码事实上都是一种“安全”功能。不安全代码必须用修饰符 unsafe 明确地标记,这样开发人员就不会误用不安全功能,而执行引擎将确保不会在不受信任的环境中执行不安全代码。 以下代码演示如何借助BitmapData类采用指针的方式来遍历一幅图像,这里的unsafe代码块中的代码就是非安全代码。
毫无疑问,采用这种方式是最快的,所以在实际工程中都是采用指针的方式来访问图像像素的。
字节对齐问题 假设有一张图片宽度为6,假设是Format24bppRgb格式的(每像素3字节,在以下的讨论中,除非特别说明,否则Bitmap都被认为是24位RGB)。显然,每一行需要6*3=18个字节存储。对于Bitmap就是如此。但对于BitmapData,虽然data.Width还是等于image.Width,但大概是出于显示性能的考虑,每行的实际的字节数将变成大于等于它的那个离它最近的4的整倍数,此时的实际字节数就是Stride。就此例而言,18不是4的整倍数,而比18大的离18最近的4的倍数是20,所以这个data.Stride = 20。显然,当宽度本身就是4的倍数时,data.Stride = image.Width * 3。 画个图可能更好理解。R、G、B 分别代表3个原色分量字节,BGR就表示一个像素。为了看起来方便我在们每个像素之间插了个空格,实际上是没有的。X表示补足4的倍数而自动插入的字节。为了符合人类的阅读习惯我分行了,其实在计算机内存中应该看成连续的一大段。 |-------Stride-----------| 首先用data.Scan0找到第0个像素的第0个分量的地址,这个地址指向的是个byte类型,所以当时定义为byte* ptr。行扫描时,在当前指针位置(不妨看成当前像素的第0个颜色分量)连续取出三个值(3个原色分量。注意,0 1 2代表的次序是B G R。在取指针指向的值时,貌似p[n]和p += n再取p[0]是等价的),然后下移3个位置(ptr += 3,看成指到下一个像素的第0个颜色分量)。做过Bitmap.Width次操作后,就到达了Bitmap.Width * 3的位置,应该要跳过图中标记为X的字节了(共有Stride - Width * 3个字节),代码中就是 ptr += dataIn.Stride - dataIn.Width * 3。 通过阅读本文,相信你已经对使用C#进行图像处理可能用到的几种方法有了一个了解。至于采用哪种方式,取决于你的性能要求。其中第一种方式最优雅;第三种方式最快,但不是安全代码;第二种方式取了个折中,保证是安全代码的同时又提高了效率。熟悉C/C++编程的人可能会比较偏向于第三种方式,我个人也比较喜欢第三种方式。 参考: 1. MSDN2005 2. C#语言规范 3. Basic Image Processing support in C# 作者:http://conner-wang.spaces.live.com转载请注明出处! January 11 喜欢下雪天昨天开始下午下雪了。今早起来,到处都是白的,看着心里都舒服。 一年四季,相对来说,只有冬天是比较枯燥的,只有下雪天是我最喜欢的。真想不出冬天里除了雪,还有什么是我所期盼的。 January 09 庆祝项目成功交付昨天小燕和元元去上海交付项目,我和鑫则在家等消息。刚才小燕发短信说项目已经成功交付,心里悬着的一块石头终于落了地。虽说没有大声喊出来,但是内心的激动是按奈不住的。四个人辛苦了半年多,终于有了一个结果。 因为事先我们都已准备得很充分了,所以成功交付是意料之中的事。 前天晚上还和小燕通宵调程序和写文档,今天下午竟突然如此的轻松,还有点不适应呢。 接下来要集中精力接手耿师兄的东西了,仍要努力! January 04 项目马上就要俊工啦项目1月8号就要验收了,这两天忙着整文档,录实验视频。马上就要解放了,一想到这心里就高兴!等顺利交了差一定要好好庆祝一下。不过还要辛苦这最后几天。 明天晚上要吃彭彰师兄的喜酒,哈哈~ January 03 OpenCV/paintlib/CImg/FreeImage/CxImage/SILLY/Corona[转载]
引用 OpenCV/paintlib/CImg/FreeImage/CxImage/SILLY/Corona January 02 sin函数做图像拉伸今天用到的一个算法上用到了数值的拉伸变换,给定一系列0~1之间的浮点数样本,使处于中间部分的样本得到拉伸,而值较低的部分和较高的部分得到压缩。我首先想到了图像处理中的灰度拉伸算法,于是赶紧查找相关书籍。 大部分图像处理书上都介绍了三种灰度变换,一种是基于分段线性函数的,一种是基于log变换的,一种是基于幂函数的。显然第一种方法能完成我的功能,但由于是分段函数,所能操作较麻烦点,而且处理结果不平滑;第二种和第三种方法只能同时拉伸(或压缩)较暗的样本(或较亮)的样本。 于是我就请教阿登,给他画了一个曲线,问他有没有这样的数学函数。他看了一会说这像正弦和余弦函数。我晃然大悟,感紧用Matlab仿真了一下。 通过变换,我最终确定使用归一化了的这个正弦函数 f(x) = 0.5*(sin(pi*x-pi/2)+1) 0<x<=1,其函数曲线如下: 可以看出这个函数是一个比较完美的拉伸函数,能过归一化你还能把任意范围的样本进行拉伸变换;缺点是拉伸程度不能调整。 所以,实际中并不一定要用到很多高深的东西,关键在于思路的开阔和活学活用。 |
|
|