从图像入手学习MATLAB-1
从图像入手学习MATLAB
alexqxp原创
前言
MATLAB由于其易用性,扩充性,众多实用的工具箱以及广泛的使用者而成为研究者和学生的必会工具,成为专业交流语言。笔者根据自己的学习经验,觉得从图像入手学习MATLAB是一条较好的路径。MATLAB本身由于众多专业人员的参与,变得博大精深,笔者只是从图像知识入手谈一谈MATLAB,很多概念只是从感性认识来说,不具备概念性的精确。另外,本人并不是MATLAB的高手,我写这篇文章的动机只是想生手入门的时候少走点弯路,涉及专业的地方还请诸位高人指正。
1、视觉图像和MATLAB的联系
视觉是人获取知识到主要途径,视觉的分析判断能力本身也很高。如果用MATLAB的功能来对视觉功能做一下仿真,还是很有意思的。
图像的采集。眼睛是通过视网膜来得到图像信号的,网膜,可以想象视觉细胞按照矩阵的形式规则分布,那么每个矩阵里面的每个元素都会得到一个光感电压值,通过视神经传导,将2D的信号变成1D传输,然后在大脑中对应当区间又转换为2D,这一点想象网络的传输应该不难想象。可以想象大脑中的记忆细胞有一块矩阵空间通过加电得到了一副完整的图像。大脑使用神经网络功能对其进行识别运算,得到了图像中自己关注的目标体。
到了MATLAB这里,情况是非常类似的,摄像头的CCD本身就是矩形的,得到的图像也是用矩阵来描述的。不过在没有使用白平衡基准对其处理前,得到的矩阵还只是原始的RAW文件,还不能得到所需的图像。还记得黑客帝国里面不断往下掉的O和1吗,可以想象由于计算速度跟不上,原始数据还没有计算成还原图像所需的数据,但是如果你看熟了的话,你还是可以想象到你看到了什么。比如你看到(255,0,0)就会想到红色。对了,在二进制中应该是11111111,0,0。到了MATLAB里面,图像具有图像模式,不同的模式下图像存在的数据矩阵是不同的。比如用RGB模式,用一个3维矩阵就可以描述了,一个矩阵里面是R值,象素的下标位置就是矩阵元素的下标位置,可以看到使用矩阵的优势了吧,不用单独描述X,Y值,下标就可以描述X,Y值了,这样省了多少事情啊。要不然对一个图像象素的描述是X=1,Y=0,R=255;X=1,Y=0,G=0;X=1,Y=0,B=0。很麻烦吧。
在这里可以看到CCD里面得到的是电压值,但是通过标定可以把电压值转换为图像。那么,各种传感器得到的数据自然也可以通过一定的人为标定变成图像了,进一步的,只要是数字就可以变成图像了。这就是MATLAB里面的伪彩色的意义了,从物理意义上来说,某个数据可能没有颜色,比如0.01是什么颜色呢,但是使用标定法,比如所有的数据X100,那么0.01X100=1,如果用灰度图像来描述这个数据的话,它的颜色就是1级灰度了。如果用索引色来描述这个数据的话,在颜色表里面,1对应当颜色可能是红色。如果得到的数据是1.2呢,那么还是将其颜色描述为1级灰度,这里可以看到,颜色是有精度问题的。颜色范围越大精度越高。所以医院里面,X光片的数字化显示遇到了困难,因为使用电脑显示的图像灰度可能只有256级灰度,但是冲洗处来的X胶片的灰度等级可能几百上千,比256级高得多,一些事关人命的细节图像可能就会显示出来供医生识别。当然,人眼对于灰度级别的识别能力有限,如果要想方便识别的话,还是变成彩色容易识别。灰度变成彩色简单的算法就是将灰度等级数变成索引号,这样灰色就变彩色了。
这里看到只要是数据都可以变成视觉图像,而数据又可以以矩阵的形式存在,数据的运算可以变成矩阵的运算,矩阵运算的结果可以用图像表示。MATLAB就是这样一个矩阵数据运算的可视化工具。它的最大特点就是运算结果的可视化。当然,现在的仿真软件一般都有可视化功能,通常可以称为后处理工具,可视化工具包。
**********************************
本节相关基础知识
1)电荷-耦合装置 电荷-耦合装置(charge-coupled devices, CCD)被用作图像传感器。固态传感器常做成光敏硅元件的阵列,每一硅元件产生一个电脉冲,其幅度与硅元件上入射光强度有关。固态阵列可以做成线传感器或面传感器。前者对景物每次扫描一行,后者通过平行扫描获得图像。
2)分辨力 在图像处理中一个最重要的问题是选择正确的分辨力或采样密度。因为一幅图像实质上是二维空间中的信号,故适用于信号处理的法则同样适用于图像处理。为了真实地表现一个景物,图像必须以景物最高相关空间频率的2倍进行采样。中等分辨力传感器产生的图像含256像素×256像素(pixels)。在放射学中常常需要高分辨力,要求图像至少达到2048像素×2048像素。
3)计算机把图形显示为一组二维的点,这些点叫象素,象素(Pixel)曾经是“pictiure element”的缩写,之后,它依靠自身的作用而成为一个独立的词纳入了词典。
-----------------
我入门的时候只有比较生硬的几本书,基本上是翻译的英文帮助文件,对于高度集成化的命令不甚理解,只会照敲命令,比较茫然。当然,熟能生巧是万古不变的学习法门。有几步路是省不了的,照着例题敲,看看别人的程序,看看涉及到的专业知识(很多都忘了)。有没有编程的基础都不是很大的问题。当然有的话理解界面菜单编辑,理解WINDOWS程序的命令促发模式会容易一些。网上学习MATLAB的去处还是比较多的,比如MATLAB大观园什么的。
2、图像在MATLAB中的处理
作为图像处理来说,首选当然是PHOTOSHOP(以下简称PS)。你如果要对照片进行处理,当然最好用的工具是PS。但是如果说到工程图像分析的话,PS就显得不够方便了,缺少明确的数字化显示与控制。这主要是因为PS的目标人群主要是一般用户。如果你了解PS的历史的话,就会发现早期PS的菜单思路和MATLAB有相似的地方。如在PS3.0中,很多菜单的名称还没有脱离矩阵计算的色彩。PS制作者还没有把各种图像矩阵运算披上美丽的外衣。其实可以把MATLAB的图像处理部分看作是PS的计算内核。PS的矩阵运算本质暴露得最为清楚的是它的自定义滤镜功能,这里你需要自己设计一个运算矩阵来对图像进行处理。MATLAB进行图像处理的时候,使用的是命令短语,不象PS是菜单命令,因而直观性没有PS强,但是MATLAB的图像处理控制参数更容易精确控制,不象用PS的时候,你非要很熟才能知道参数背后的意义。如果你对PS的本质有比较清楚的认识到话,就会知道通道是256级灰度矩阵。蒙板也是灰度矩阵,选区也是矩阵。乱花渐预迷人眼,了解到图像处理的本质是矩阵运算后,操作PS或者MATLAB就会有了清楚的目标。
图像运算的首要准备工作是确定要用到的图像模式。所以在MATLAB里面有很多图像模式转换的命令,比如RGB2GRAY。这里2的意思是“to”。因为two的发音和to的发音相同,所以程序员们把2来代替“to”。很有意思吧,所以不精通编程的朋友不要有畏难情绪,MATLAB里面的命令语言基本上都是口语似的,是所实现功能的英语短语而已。MATLAB的程序语言非常简单,只要掌握基本的命令语言,简单的循环和判断就可以应付大部分的工作。图像模式对于初学者来说,可能比较难以理解,图像不就是RGB三原色混合就可以了吗?为什么还要什么别的图像模式。那么用坐标系来说吧。RGB图像模式就像是直角坐标系,LAB图像模式就像是柱坐标系,还是空间的那个点,但是为了描述问题的方便性,不同的时候要选择不同的坐标系。比如在软件建模的时候,如果模型是个正方体,那么用直角坐标系会很方便,但是如果模型是个圆柱体的话,使用柱体坐标就很方便了。大家最为熟悉的是直角坐标系,就像RGB图像模式最容易叫人理解一样。
要想进行图像计算,先得把图像输入到MATLAB里面,变成MATLAB里面的矩阵变量。图像的输入工作本来还有点麻烦,但是现在的高版本MATLAB中,图像,文本数据都可以直接导入到MATLAB里面,所以一般问题不大,就不多说了。图像导入到MATLAB后,其变量名就是图像的文件名。当然,如果你要对大量图像进行处理的话,就需要使用程序来读入图像了。比如研究CT断层扫描图像的,一次处理的图像可能有上百张,就需要设置一个循环来读入这么多图像,依次对图像进行处理了。
关于图像的处理由于大家有了一般照片的处理经验,应该还是比较容易理解的。比如图像平滑运算,大家用得比较感兴趣的可能就是如何对PLMM的脸部进行去斑美容了。这是一个非常好的学习的方法,就是用MATLAB实现一般我们用PS或者别的图像实现的照片处理,特别是人脸的处理。因为人对于脸部的细微变化非常敏感,这样对于图像处理的效果就会有比较敏感的评价。知道为什么各个国家的钞票都用人物面部来防伪吗,就是因为人眼对于面部的细微变化最为敏感,这样如果假钞上的人物面部和真的上面有差别的话,就容易识别出假钞了。
讲到这个地方,可能有人会说,为什么不讲讲基本的程序语句了,你讲的东西很多和MATLAB没有关系阿?我的想法是,首先你要了解图像的一些基本知识,要引起你对图像的兴趣。如果你很着急解决某个具体问题的话,我一向的方法是这样的。因为MATLAB只需要你给出输入,给出适当的操作命令,就会得到结果。你可以先使用GOOGLE或者别的搜索引擎搜索一下,找到类似的别人做过的程序,或者文章,不要担心,肯定会找得到的。我们现在正在研究的东西,国内肯定已经有人做过类似的了,如果没有的话,找英文的,国外肯定已经有人做过类似的了。如果还没有的话,我姑且认为你很有眼光,已经研究到某个问题的国际前沿部分了,那么你遇到的问题就不是MATLAB这个使用工具的熟练问题了,而是你的专业方向上的问题,
对于初学者来说,花尽量少的时间熟悉MATLAB的相关命令还是必要的,我建议你至少手头有一本关于MATLAB的书,肯定有一些基本命令的介绍的。这是目前MATLAB的书籍的特点,翻译一下HELP,讲一点基本命令,举几个小例子,大多大同小异。
MATLAB最为困难的地方是它涉及到专业知识的地方,就这一点来说,用到MATLAB里面非自己专业的工具箱的时候,每个人都是初学者,不同是有的人已经很熟悉怎样最快的速度来熟悉和掌握相关内容来解决问题,现学现卖。站在MATLAB这个巨人的肩膀上,才能看得远。
--------------------------------
我本来是想着把一些程序放在上面的,但是现在书也有,网上资料也有,关于具体的操作命令可以很容易得到,倒是背景资料不好收集,不好理解。软件工具是解决一定的需求的,你有什么需求,肯定会有相关的功能存在来解决你的问题。有些时候,提出一个功能选项比实现这个功能选项还要难。要不然怎么会有软件需求分析呢。
有些时候很奇怪,某个概念定义有了,计算公式有了,说明文字有了,还是不理解。我想是缺乏生动的背景材料,没有感性认识的原因。毕竟我们很多时候学习的间接的经验,一个概念,一个公式来到我们面前的时候,已经经过了好多人多少年的勤奋工作,它们诞生的最初需要,背景已经不知道了,或者被省略掉了。只有靠想象来理解这些概念。图像的感性认识是否使你对于比较枯燥单调的概念有一些比较感性的认识呢?答案是肯定的,要不然我们干吗从图像入手学MATLAB。
3、MATLAB中的三维数据场处理
MATLAB的绘图功能十分强大,以至于有些推荐词上说本软件是功能最强大的图像处理软件。对于3D绘图来说,可是说的东西非常多。现主要谈一谈一般的三位数据场的制作,因为三位数据场的应用非常广泛。
搞过GIS的人知道DEM模型。简单点说,就是把地面从XY方向上划分为规则网格,然后测量得到每个网格的高度,这样得到一个高度矩阵,就可以描述一块地面的高度分布。在很多情况下,这个模型可以套用到很多地方。比如我们用AFM等三维表面轮廓仪,得到的表面,也可以想象成地表。我们对某个物理量在XY方向上的分布进行测量,得到的数据场也可以想象成地表。温度场,声场,应力场,磁场,在2D方向上分布的时候,都可以想象成地表。物理量的大小可以用Z来表示。
但是如果要对物体进行3D体式分析的话,这种模型就不好用了,因为Z被用来描述物体的高度位置。3D图像的3维全部被用完了。除非进入多维空间,才能增加物理量。在MATLAB里面,有个四维空间,这个空间是(X,Y,Z,COLOR)。在这里COLOR与温度,应力等物理量通过颜色表或者颜色标尺对应起来,简单点说就是用颜色来代表温度的高低,比如红色表示高温,蓝色表示低温。其它的物理量与此类似。在MATLAB里面,这种对应关系通过PCOLOR来实现。当然,在2D的情况下,也可以用(X,Y,COLOR)表示3D,不同是这个时候Z被COLOR取代。
如果对于地表测量的时候网格划分十分精密的话,那么得到的数据量就非常大,数据的起伏变化也会比较频繁。这样的地表如果被引入游戏,会因为计算量太大而引起丢帧,或者游戏运行缓慢。那么就需要对这些数据进行滤波,重新取样,减少数据量。滤波的时候,要尽量保持原来数据测量的精确性。因此要考虑合适当滤波方法。
滤波的方法可以分为空间域和频率域法。可以试一试MATLAB里面的中值滤波,傅立叶滤波等。滤波以后,地表的梯度会发生变化,变得平缓。梯度一般可以用微分,差分来表示,一般可以和一阶微分方程联系起来。比如温度梯度。那么这种滤波导致的梯度变化实际也可以反映温度的扩散。经过多次滤波以后,梯度变得平缓,就象温度经过经过传导扩散后,温度分布变得均匀。
如果需要在不同的尺度下对地表进行研究,那么就需要使用多尺寸显微镜,小波分析了。通过小波的多尺度分解,灰度-高度图被分解为细节不同的灰度图。这样3D高度的分析通过MATLAB的图像功能变成了2D的灰度图像。对于高度的处理变成了对于灰度的处理。对于物理量的处理变成了对于颜色的处理。
因此,在MATLAB中解决问题的时候,通过增加图像颜色处理功能,可以把3维的问题降为2D来处理,降低了处理问题的难度。在MATLAB里面,数据文本和图像通过伪彩色功能联系到了一起,使它们变成了一回事。数就是色,色就是数。
MATLAB三维绘图命令已经被集成到菜单里面来,可以很方便地绘制三维图像。具体的绘图命令我就不反复说了,对于MATLAB来说,由于命令的高度集成话,实现具体的功能可以查书查HELP,但是理解这些命令后面的内容就相对较难。
相关知识
小波是在傅立叶变换的基础上进化来的。如果形象点说的话,傅立叶变换就象是用不同大小的球去模拟地表,大的起伏模拟得很好,但是对于地表的突变及其微小变化模拟得不好。就像用粗毛笔去画大写意,线条细节部分很难掌握。而小波就像是用尖树枝去模拟地面,大树枝小树枝分别模拟大的地形变化和小的地形变化。就象拿不同尺寸的记号笔去画图,线条粗细都有。
关于点云
1 空间插值的概念和理论
空间插值常用于将离散的测量数据转换为连续的数据曲面,以便与其它空间现象的分布模式进行比较,它包括了空间内插和外推两种算法。空间内插算法是一种通过已知点的数据推求同一区域其它未知数据的计算方法;空间外推算法则是通过已知区域的数据,推求其它区域数据的方法。在以下几种情况下必须作空间插值:
1) 现有的离散曲面的分辨率,象元大小或方向与所要求的不符,需要重新插值。例如将一个扫描影像(航空像片、遥感影像)从一种分辨率或方向转换到另一种分辨率或方向的影像。
2) 现有的连续曲面的数据模型与所需的数据模型不符,需要重新插值。如将一个连续的曲面从一种空间切分方式变为另一种空间切分方式,从TIN到栅格、栅格到TIN或矢量多边形到栅格。
3) 现有的数据不能完全覆盖所要求的区域范围,需要插值。如将离散的采样点数据内插为连续的数据表面。
采样点的空间位置对空间插值的结果影响很大,理想的情况是在研究区内均匀分点。然而当区域景观大量存在有规律的空间分布模式时,如有规律间隔的数或沟渠,用完全规则的采样网络显然会得到片面的结果,正是这个原因,统计学家希望通过一些随机的采样来计算无偏的均值和方差。但是完全随机的采样同样存在缺陷,首先随机的采样点的分布外置是不相关的,而规则采样点的分布则只需要一个起点位置,方向和固定的大小的间隔。其次完全随机采样,会导致采样点的分布不均,一些点的数据密集,另一些点的数据缺少。
2 空间插值方法
空间插值方法可以分为整体插值和局部插值方法两类。整体插值方法用研究区所有采样点的数据进行全区特征拟合;局部插值方法是仅仅用邻近的数据点来估计未知点的值。整体插值方法通常不直接用于空间插值,而是用来检测不同于总趋势的最大偏离部分,在去除了宏观地物特征后,可用剩余残差来进行局部插值。由于整体插值方法将短尺度的、局部的变化看作随机的和非结构的噪声,从而丢失了这一部分信息。局部插值方法恰好能弥补整体插值方法的缺陷,可用于局部异常值,而且不受插值表面其它点的内插值影响。
阅读(4791) | 评论(0) | 转发(0) |