Dear God, can you hear me?!

Sunday, May 20, 2007

毕设Log 2007-05-20

看了ArrayList的一些文档,决定不用ArrayList了,原因有两点:1.改起来太麻烦;2.
ArrayList的效率不比我自己写排序和检索快。

12:51 2007-5-18

昨天调试程序发现一个严重问题:因为原图是24位的,所以Bitmap对象也是24位的,所
以对Bitmap对象的所谓alpha通道做的所有操作都无效。以前之所以没有这个问题是因
为从picBox的的Image属性构建一个新的Bitmap对象的位数是32位的,以前的程序操作
Bitmap对象的时候Bitmap对象是从picBox的Image属性构造的。于是我用Bitmap.Clone
的方法重新构建了一个Bitmap对象,传入参数PixelFormat.Format32bppArgb,从而构
造了一个32位的Bitmap对象。

在修改程序的时候我看到了PixelFormat.Format64bppArgb这个参数!乐得我不行了
都,于是我直接构建64位Bitmap对象,以前那些为了保留精度又兼顾温度范围所做的操
作统统废掉,温度直接可以保存到16位的alpha通道中!我兴冲冲删啊改啊,最后调
试,结果报错,一查,数据溢出,color对象的A属性为byte类型,不能存储超过255的
值。奇怪了,都是64位的图像了,alpha通道怎么还是byte呢?应该是word啊,我MSDN
了一下,结果发现一段备注:

"PixelFormat48bppRGB、PixelFormat64bppARGB 和 PixelFormat64bppPARGB 使用 16
位/颜色分量(通道)的像素格式。GDI+ 1.0 和 1.1 版本都能读取 16 位/通道格式的
图像,但是这种图像需要转换为 8 位/通道格式,以便处理、显示和保存。每个 16 位
颜色通道能够保存一个范围在 0 到 2^13 的值。"

郁闷~!GDI+既然不能处理 16 位/通道格式的图像干嘛允许我构造64位图像啊!!!
怒!

白高兴了,程序也白改了,无奈,只好老老实实将程序改回去……

昨天一个白天就这么折腾掉了。

晚上继续调试程序,结果发现了一个更为严重的问题,以前认识上有个疏漏:我们将温
度值转换之后存入图像每个像素的alpha分量,但是打开一幅存有转换温度值的图像,
程序没办法知道每个转换温度值对应的温度真值是多少,每张图的转换关系都是不一样
的,一张图一个对应表。

这个之前没有考虑到的严重问题让我想了好久。

今天上午问了Dr.Liu之后暂时决定在图像的头的调色板部分存储这样一个表。另外,和
Dr.Liu的讨论的时候我表示了对所做工作的实际意义的担忧,Dr.Liu的观点和我差不多,
也认为意义不是很大,让我问一下Dr.Fu的意思。我去8楼找Dr.Fu,讨论了半天,最后
Dr.Fu拷了一页IR-Fusion技术介绍给我,也许有点用处,不仅可以思考一下它的软件的
融合方式,而且也可以在以后的论文中做对比。

15:09 2007-5-20

___
Sent with SnapperMail on Treo650

Thursday, May 17, 2007

增加

1.用Arraylist对象重写排序的程序
2.整理变量和对象(如bitmap),将一些局部变量放到外面,使变成全局变量,并补全注释。
3.转换温度后加上判断,和256比较;补充大于256的情况取整的程序
4.将一些用过两次以上的方法写成函数包括在类中,使用的地方调用即可。
5.自适应图片大小
6.异常处理(如文本文件内容不对或者维数不对应)
7.加上快捷键及其标注和鼠标动作(如打开图像可以将图像拖入到form上)
___
Sent with SnapperMail on Treo650

毕设Log 21:27 2007-5-17

昨晚用冒泡算法写完排序处理之后,需要定义一个不定长数组,于是我google,我
csdn,得到的结论是否定的 ,C#里没法定义不定长的一维数组,一个数组在被定义的
时候就必须给他赋予一定的维数,我于是只好自定义 一个维数给那个用来存储非重复
温度信息的已排序的数组c1。但是我在csdn上又找到了另外一个信息让我很受 打
击――C#里有个内置的对象Arraylist,类似数组的结构,不仅维数可以不定长,而且
自身就有sort()方法, 这个方法不干别的,正是用来排序!我吐血!我辛辛苦苦写的
排序算法啊……相见恨晚!

颓废了半天,决定先不改写我的程序,先把功能实现再说。不过现在好多地方没有完
善,我想暂时先记录下来 ,一面以后忘记了:

1.用Arraylist对象重写排序的程序
2.整理变量和对象(如bitmap),将一些局部变量放到外面,使变成全局变量,并补全注
释。
3.转换温度后加上判断,和256比较;补充大于256的情况取整的程序
4.将一些用过两次以上的方法写成函数包括在类中,使用的地方调用即可。

目前想到的就这些,以后再补充。

现在程序第二步改进已经完成,可以不损失温度值的精度,保留一位小数信息。

treo750V

14号tonchee取到了他的treo750,刚想起来留个影 :) 顺便把实验室也拍下来
___
Sent with SnapperMail on Treo650

毕设log

5月9号开始抛弃C++,尝试用C#,参考资料是《Visual C#图像处理程序设计实例》。

9号到11号一直在摸索,不仅在摸索程序,还在摸索思路。11号上午还在和Dr.Fu的研究
生讨论我课题的具体实现方法,结果最后还是自己摸索出来了一种方法。先不考虑配
准,可见光图像的像素包含R,G,B,A四个数据,希望能够再添加一个数据T,将温度值赋
过去,但对图像的显示不造成仍和影响,只是多存储了这样一个信息。结果想到这样太
困难,且修改了图像的数据结构所以说现在的查看图像的工具肯定都不能打开,要不改
变图像的显示却又存储了其他信息进去不太可能,所以,我打算找改变图像视觉效果最
小的一个因素――Alpha(透明度),用Alpha来存储温度。

下面是我从12号开始的文本log――

下午解决了n多错误,实现了将温度读到alpha通道里保存,可是问题又出现了:alpha
通道是8位二进制数,可是却已int32来存以byte来取,这样不仅所要保存温度的范围有
限制,而且不能有小数。然而我所需要的红外热像的温度值全是精确到小数点后一位。
这个问题很让我困扰。我想将温度值以8位浮点数的形式保存到alpha通道中,调用
color对象的A属性虽然是按无符号数(byte类型)去读,但是肯定可以用程序转换成真
值再显示出来。现在,关键的是:怎样自定义8位浮点数的格式?!
15:55 2007-5-12

自定义一个函数。该函数实现一种算法:将温度值(精度为小数点后一位)转换为一个
0到255之间的整数。且该算法必需可逆。
16:05 2007-5-12

我之前的想法太幼稚了,完全错误 !alpha维仅有8位,那么只能存储2^8=256种信息,
但温度值精确到小数点后一位,就算温度范围为0.0到50.0那也有501种信息,所以8位
的alpha完全不能够胜任存储该范围温度信息的职责。
17:58 2007-5-12

暂时先不管温度范围的事情,继续坚持用alpha通道存储温度的思路,除了保存没有
写,其他的功能大体上都写完了。
1.温度先暂时取整存储,略掉了小数部分;
2.为了方便查看图像,在软件里面打开的图像都显示为不透明,不管原图像是不是含有
透明度(为此我想了一会,最后另建立一个picturebox控件picbox2和原来的重合但z坐
标在其上面,这样才能实现。所有对图像处理的操作全部用picbox1才引用,因为
picbox被picbox2所覆盖,所以看上去图像还是picbox2里的图像,只要保证该图像的不
透明即可;
明天完成保存,关闭,退出,帮助;考虑操作时序逻辑。
21:48 2007-5-13

帮助暂时不写,其他的都搞定了。测试保存的时候发现了一个问题,在打开图像的事件
中必需要声明两个Bitmap对象。一会多加一些注释。
10:53 2007-5-14

傍晚的时候和Dr.付冬梅谈论了一下我的课题,讲了一下我目前所做的工作,说明了缺
点以及困惑的地方,最后互相讨论了半天,改变了一些最初假想的东西,新生出一些东
西(1.大跨度温度非集中分布的转换算法;2.图像自动配准改为图像手动配准;3.加上
对图片新格式的展望),最终得出了论文整体的框架(问题启发式:-))。并且告诉我
如果能做出来很不错,难度值也很高,是个很好的论文^_^。
21:19 2007-5-14

马上想到大跨度温度非集中分布的转化其实还不如直接历遍温度文本文件,将所有像素
的温度值按从小到大排序,只要总的温度数小于256,那么就可以建立对应关系来存取
温度信息到alpha通道中。因为如果要用算法来解决大跨度温度非集中分布的问题,那
么肯定要找到一些相距很远的温度区间,所以其实还是要对温度文本进行历遍。所以,
还不如直接历遍温度文本文件,对所有温度值排序,建立映射关系即可。
21:28 2007-5-14

晚上考虑了温度变换的问题,需要历遍温度矩阵中的所有温度。只要总的不同的温度的
数量小于256,就可以存储到alpha通道中。具体来说就是对矩阵元素从小到大排序,将
最大的温度值对应255,第二大的温度值对应254,依次对应下去。再据此将矩阵中的每
个温度值都变换成新的无符号整数值即可。开始以为程序算法很好实现 ,最后琢磨半
天,暂时想到一种(但运算量超级大-_-!肯定得改):
1.读取(1,1)的值;
2.读取(1,2)的值;
3.比较(1,1)和(1,2)的值;
4.将较大值对应的坐标保存到变量 Max中,将较小值对应的坐标保存到变量Min中;
5.读取(1,3)的值
和变量Max比较:
如果(1,3)的值较大,那么将坐标(1,3)存储到变量Max中
如果(1,3)的值较小,变量Max的值不变
和变量Min比较:
如果(1,3)的值较小,那么将坐标(1,3)存储到变量Min中
如果(1,3)的值较大,变量Min的值不变;
6.读取(1,4)的值,同上,分别和变量Max、变量Min比较,按上一步的方案操作;
7.如此历遍所有的值之后,变量Max里面存储的就是数组中的最大值的坐标,变量Min里
面存储的就是数组中的最小值的坐标。因此,对剩下的数再做同样的算法历遍,找到次
大值和次小值的对应坐标,从而排序所有的温度值。
(打完字发现这个算法n多问题,且想到了新的方法,一会再说)
正准备将这个算法动手实现的时候,看到了我之前写的读取温度文本存储到alpha通道
的程序,突然觉得似乎那步将温度文本读到一个矩阵中的操作是多余的,完全可以省去
这一步,直接用一维数组两层嵌套循环赋值给每个像素的alpha维。于是马上动手改,
结果成功,o(∩_∩)o...哈哈,这下省去了至少一半的运算量和文件操作,速度快了好
多!
22:32 2007-5-15

刚刚写的那个排序算法是实在是bug一堆:首先没考虑等值问题; 其次,需要定义的变
量太多;最重大的问题是运算量太大了!所以肯定不行,Kill it!先回宿舍睡觉去,
躺在床上想想。:-)
23:10 2007-5-15

决定用冒泡算法解决问题,其实我自己的想法就是冒泡算法,虽然运算量很大,但是简
单!先实现再说^_^
10:00 2007-5-16

Wednesday, May 16, 2007

这些日子……

从五一之后就没有静下来也没有时间允许我静下来记录一些事情,好些日子了,发生了好多事,有些使劲想都不一定记得起来了,我感觉快要把自己丢失了,不禁害怕起来,立刻动手,一定要把自己找到,把时间留下。

五一七天的时间,我记得我排了好多事情,可是现在居然除了去见我表哥这事我记得其它我都想不起来了!似乎我的几天生命就这样消失了。就好比抓起一把沙子,手中却几乎什么都留不住。我慌张的去查我的短信记录,挣扎着去找痕迹。我还是找回了一些时间的碎片,我知道我一号的时候由于宿舍网络故障去机电楼上网,在606实验室下载了孙鑫的VC++视频。二号三号四号我在王涛那跑过车,看过张子璐的那本和我下的孙鑫VC++flash教学视频一样的书,看Dr.Fu的研究生做的图像处理程序,好像那本新CET6的书也是那几天买的。五号我去表哥那了,六号和七号根据和tonchee的msn记录来看我开始尝试用C++做我的课题,不过尝试失败,现在在用C#写。基本上五一七天假我干了些什么大概就这些了,如果还有,那也就只能那段生命消失了。

8号开始去公司,无意中翻了翻Visual C#图像处理编程实例的pdg,觉得我可以用C#来做我的毕设程序,于是凭着我其他语言的基础和一部分图像理论,照着实例边学边做,构思方法,遇到问题,解决障碍,这样一路坎坷居然一直做到现在。自己想来都不容易。

另外还有一件事我得记下,5月11号的时候我被Dr.Fu直接一个电话从公司叫回来了,电话里Dr.Fu很生气,很大声的训斥我。原因是我没有提前请假。那天刚好是毕设见面的日子,可是前一天晚上想到要请假时都11点多了,所以没给Dr.Fu电话,第二天才给她发短信请假,本来之前和她说下周为了教学评估留在学校实验室公司那边需要证明的事就让她不高兴了,所以这纯属火上浇油。

最近我把毕设的日志都记在我的小黑里了,没有时间blog,五一之前两门考试也是让我没有时间blog,下个帖先把我的毕设log添上。
___
Sent with SnapperMail on Treo650

再发几张 :)


___
Sent with SnapperMail on Treo650

那些花儿

从学二吃完饭回来,天气非常nice,连花儿都这么灿烂 :)
___
Sent with SnapperMail on Treo650

Tuesday, May 15, 2007

昨天拿treo拍的:)

突然发现我们学院的楼旁边停了一辆超帅的车子!
___
Sent with SnapperMail on Treo650

Thursday, May 10, 2007

现在居然能看google快照了,难道解封了?!

刚才用google查东西,打开链接后显示的不是要查的内容了,习惯性的点击了一下"网
页快照",刚点开就想起来这不是百度,然而结果实在是让我吃惊――居然打开了!
我靠!这可是我第一次看到google的网页快照长什么样子o(∩_∩)o...哈哈!