RickShao

第一次用Matlab做东西

May 19, 2014

今年大三,曾有过参加数学建模的想法,自学过一会儿的Matlab,但都不了了之。遇上Python,这位伶俐的小萝莉让我相信所有的科学计算都能通过她来实现,而我也确实是爱上了她。于是Matlab这一强大的矩阵实验室被抛在了脑后,不再被我想起。

不过最近室友接了个项目,赚点外快吧。这个Project不难,就是对射电望远镜拍下的宇宙图像进行些处理,要求使用matlab。于是去图书馆借了本厚厚的Matlab书,稍微花了点时间浏览了一下,事实证明完全没有那个必要(书中错误百出),真正做的时候都是靠着搜索引擎的。

不多展开,来谈谈技术问题。

第一题是读入十张相同位置的图片,输入一个阈值,计算每张图片中超过这个阈值的像素点的个数,没啥说的。

第二题开始遇到了一点小问题,有关数据类型的,smooth pixel,就是个求像素点周围像素灰度值的平均值的问题。这种问题碰到次数不多,但每次都比较棘手。从文件读入的矩阵类型是uint8,也就是无符号的8位整型,范围是0到255,这256个数字表示像素点的灰度值。题目中需要计算像素点所在的3x3矩阵的所有像素点的灰度平均值,可以先求1/9的值再求和,也可以先求和再平均。前一种方法没什么问题,但是后一种就会遇到溢出了,由于uint8的最大值为255,所以9个像素点灰度的数值和最大只有255,一平均最大也就只有28了,丢掉了很多值。一开始摸不着头脑,后来想到了数据类型的问题,输入whos查看了当前变量的类型和大小,果不其然,存储图像信息的矩阵是uint8类型,显然会发生溢出,于是用int16()方法进行了类型转换,OK,没问题了。

第三题要求使用 getframemovie2avi 方法生成 10 smoothed pics的avi文件,什么都不懂,网上研究了好一会儿才做出来的,中间有个笑话:因为懒,在没删除之前的代码的基础上,使用clear清空的内存中的变量,然后存储了十张图片的Image矩阵总是被当成Function,哈哈,真是让人苦笑不得。

核心代码如下:

Img2 = int8(Img)    % 因为之前Img是int16的,得进行类型转换
M = moviein(10);    % 分配内存
axis off            % 关闭坐标轴
for i=1:10   
    imshow(Img2(:,:,i))     % 这是一个将矩阵转化为图片的方法
    M(i) = getframe;        % 获得帧
end 

movie2avi(M,'D:/out.avi','FPS',1)   %生成avi文件,可在D盘找到

另外加上今天的收获,dos命令行下 - 修改文件名用 rm 原文件名 新文件名, - 打开文本文件 type filename or start filename - github clone 命令:cd 进入需要clone到的文件夹,git clone reposity_name.git