matlab

   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是不会因为溢出而把类型进行扩展的,因此在预测到会溢出时应事先进行类型转换,否则就得不到正确数据。例如我在对图像进行二维傅里叶变换时没注意到这个问题,导致每次变换后图像几乎是一片黑,我郁闷了半天。 Matlab中的细节问题及技巧(持续更新)后来发现原来是因为直流分量本来很大,但由于没有进行类型转换,导致直流被活生生地截掉了。
类型转换格式如下:
      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:这里还是有点晕,句柄到底是不是函数指针?
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值