加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Matlab中的细节问题及技巧(持续更新)

(2012-04-14 10:31:40)
标签:

matlab

类型

变量

数字图像处理

分类: Matlab图像处理
    接触Matlab是从大二开始的,但那时对数字信号处理不怎么感兴趣,因此一学期下来,连编写一个最基本的function都不会……
    大三开始学习数字图像处理,无奈,只好重拾Matlab。虽然Matlab的交互界面做的很好,Manual尤其强大,但由于基础不好,在写程序时还是不时地被细节问题困扰,因此决定用此文来记录那些让我不胜其烦的细节问题,同时也分享给大家
     1. 在进行图像处理时常常会用到图像的长宽像素信息,一般语句为
        [M N]=size('figurename'); 这里M是图像二维矩阵的行数,N是二维图像的列数。比如下面的图像,是一个5*8大小。学过framebuffer的同学应该知道,对于显示屏,一般的坐标是从左向右是x坐标,从上到下是y坐标,因此对于图像来说N表示的是x方向上的大小,M表示y方向的大小。如果不注意,在进行图像几何变换时要注意。否则常常会把因为习惯问题把M误以为是x方向的,而N是y方向的。
      2.关于Matlab中变量的类型问题。在Matlab中,我们处理的是整数坐标,但Matlab中像素值本身并不是整数,在Matlab和IPT为表示像素值所支持的数据类型有以下10种:
     ①double   8byte/pix
     ②uint8    1byte/pix   平时我们用imread读出图像时一般都是这个类型的
     ③uint16   2byte/pix
     ④uint32   4byte/pix
     ⑤int8     1byte/pix
     ⑥int16    2byte/pix
     ⑦int32    4byte/pix
     ⑧single   4byte/pix
     ⑨char     2byte/pix
     第十种只有在二值图像中才会用到,即logical类的。logical型虽然只用1bit就可以表示,但在Matlab中却需要占用1byte。为嘛?其实我也不清楚,可能Matlab不能像C一样进行位操作吧。
    我们知道,Matlab内部是以double类型进行计算的,因此在初始化一个变量时,如果不指定你要给变量赋什么类型的值,它就默认是double型的。如:
    a=1; 则a将占8byte,假如你想把a初始化为一个logical类型的,这这样写:a=logical(1);

用一个变量对另一个变量进行初始化,如果不进行类型转换,则被初始化的变量将和用于初始化的变量的类型一致,看下面的例子:
    >> a=uint8([255 255])
     a =
        255  255
    >> b=a(1)+a(2)
     b =
        255
显然,b得到的不是我们想要的答案,因为a向量中的元素为uint8类型的,如果直接相加并赋给b,Matlab是不会因为溢出而把类型进行扩展的,因此在预测到会溢出时应事先进行类型转换,否则就得不到正确数据。例如我在对图像进行二维傅里叶变换时没注意到这个问题,导致每次变换后图像几乎是一片黑,我郁闷了半天。http://www/uc/myshow/blog/misc/gif/E___6706EN00SIGG.gif后来发现原来是因为直流分量本来很大,但由于没有进行类型转换,导致直流被活生生地截掉了。
类型转换格式如下:
    B=data_class_name(A)  
    data_class_name可以使以上类型中的任意一种。转换的原则可参照下面的例子
>> a=[256 3 500 -1]
a =
        256.00          3.00        500.00         -1.00
>> b=uint8(a);
>> b
b =
  255    3  255    0

a是double型的,要转换成uint8型时,大于uint8类型最大值255的就变成255,小于uint8型最小值0的,就变为0,其他不变。

函数islogical用来判断数据是否是logical型的,用法是
   islogical(a);
若a为logical的,则返回1,否为为0


图像类和类型间的转换函数主要有: 
名称:              输出类型:                    输入类型
im2uint8            uint8                         logical,uint8,uint16,double
im2uint16           uint16                        logical,uint8,uint16,double
mat2gray            double(在0到1之间)          double
im2double           double                        logical,uint8,uint16,double
im2bw               logical                       uint8,uint16,double

用法直接查看Manual就好。

 3. 对数组的索引
直接上例子>> a=[1 2;4 3]
a =
          1.00          2.00
          4.00          3.00
>> a(1:end)
ans =
          1.00          4.00          2.00          3.00
>> a(:)
ans =
          1.00
          4.00
          2.00
          3.00
没错:a(1:end)产生行向量,a(:)产生列向量
其实a(:)有一个很重要的用法,就是对一个数组进行重新变为a的形状。前提是两者元素数量相等。
例子:
a =
             0             0             0
             0             0             0
>> b=[1 2 3 4 5 6]
b =
          1.00          2.00          3.00          4.00          5.00          6.00
>> a(:)=b
a =
          1.00          3.00          5.00
          2.00          4.00          6.00
b不限于向量,也可以是3*2的数组。


4.Matlab中句柄的使用
    句柄是什么?没学过Windows编程,因此对句柄的理解也停留在字面上。百度百科上这样解释:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的。相反,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
  在《WINDOWS编程短平快》(南京大学出版社)一书中是这么说的:句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
  从上面的2个定义中我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的。它就像我们的车牌号一样,每一辆注册过的车都会有一个确定的号码,不同的车号码各不相同,但是也可能会在不同的时期出现两辆号码相同的车,只不过它们不会同时处于使用之中罢了。从数据类型上来看它只是一个32位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。
       对于matlab下的句柄使用,也是从百度知道上了解到的:

比如定义f(x)=x^2,可以写为
f=@(x)(x.^2)
其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针
f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等

定义匿名函数时也可以调用别的匿名函数,比如
f1=@(x,y)(x.^2+y.^2)
定义了函数x^2+y^2
f2=@(t)(f1(t,2))
定义了函数t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如
f1(2,3)
表示2^2+3^2
f2(3)=3
表示3^2+4
f3([1,2])
表示1^2+2^2 
说白了就是函数指针

ps:这里还是有点晕,句柄到底是不是函数指针?
 
几个关于面积,连通域的函数用法(此部分摘自http://www.cnblogs.com/gaoshangbing/MyArticles.html

1、 matlab函数bwareaopen──删除小面积对象

 

格式:BW2 = bwareaopen(BW,P,conn)
作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域。
算法:
(1)Determine the connected components.
L = bwlabeln(BW, conn);
(2)Compute the area of each component.
S = regionprops(L, 'Area');
(3)Remove small objects.
bw2 = ismember(L, find([S.Area] >= P));

 

2、matlab函数bwarea──计算对象面积

 

格式:total = bwarea(BW)
作用:估计二值图像中对象的面积。
注:该面积和二值图像中对象的像素数目不一定相等。

3、matlab函数imclearborder──边界对象抑制

 

格式:IM2 = imclearborder(IM,conn)
作用:抑制和图像边界相连的亮对象。若IM是二值图,imclearborder将删除和图像边界相连的对象。默认情况conn=8。
注:For grayscale images, imclearborder tends to reduce the overall intensity level in addition to suppressing border structures.
算法:
(1)Mask image is the input image.
(2)Marker image is zero everywhere except along the border, where it equals the mask image.

 

 

4、matlab函数bwboundaries──获取对象轮廓

格式:B = bwboundaries(BW,conn)(基本格式)
作用:获取二值图中对象的轮廓,和OpenCV中cvFindContours函数功能类似。B是一个P×1的cell数组,P为对象个数,每个cell是Q×2的矩阵,对应于对象轮廓像素的坐标。

5、matlab函数imregionalmin──获取极小值区域

 

格式:BW = imregionalmin(I,conn)
作用:寻找图像I的极小值区域(regional maxima),默认情况conn=8。
Regional minima are connected components of pixels with a constant intensity value, and whose external boundary pixels all have a higher value.

 

6、matlab函数bwulterode──距离变换的极大值

格式:BW2 = bwulterode(BW,method,conn)
作用:终极腐蚀。寻找二值图像BW的距离变换图的区域极大值(regional maxima)。用于距离变换的距离默认为euclidean,连通性为8邻域。

7、regionprops统计被标记的区域的面积分布,显示区域总数。

函数regionprops语法规则为:STATS = regionprops(L,properties)
该函数用来测量标注矩阵L中每一个标注区域的一系列属性。
L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。

返回值STATS是一个 长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。

Properties可以是由逗号分割的字符串列表、包含字符 串的单元数组、单个字符串
'all'或者'basic'。如果properties等于字符串'all',则表4.1中的度量数据都将被计算;如果properties等于字符串'basic',则属性:'Area''Centroid''BoundingBox'将被计算。表1就是所有有效的属性字符串。

 

表1 属性字符串列表

 

properties

度量图像区域的属性或功能

'Area'

图像各个区域中像素总个数

'BoundingBox'

包含相应区域的最小矩形

'Centroid'

每个区域的质心(重心)

'MajorAxisLength'

与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下)

'MinorAxisLength'

与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)

'Eccentricity'

与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)

'Orientation'

与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)

'Image'

与某区域具有相同大小的逻辑矩阵

'FilledImage'

与某区域具有相同大小的填充逻辑矩阵

'FilledArea'

填充区域图像中的on像素个数

'ConvexHull'

包含某区域的最小凸多边形

'ConvexImage'

画出上述区域最小凸多边形

'ConvexArea'

填充区域凸多边形图像中的on像素个数

'EulerNumber'

几何拓扑中的一个拓扑不变量——欧拉数

'Extrema'

八方向区域极值点

'EquivDiameter'

与区域具有相同面积的圆的直径

'Solidity'

同时在区域和其最小凸多边形中的像素比例

'Extent'

同时在区域和其最小边界矩形中的像素比例

'PixelIdxList'

存储区域像素的索引下标

'PixelList'

存储上述索引对应的像素坐标


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有