一、数据类型
1、整型
int
和unit
都是整型,只是前一个有符号,后一个没有符号,比如在16位系统中,int
范围是-32768-32767
,unit
范围是0-65535
。
2、浮点型
single
和double
都是浮点型(单精度、双精度),只是single
最多可以显示小数点后7位,double
最多可以显示小数点后14位;single
变量存储大小位32位(4个字节),double
变量存储大小为64位(8个字节)。
3、逻辑型
logical
是逻辑数据类型,有0和1两种。
4、元胞数组
cell array
元胞数组类型,数组元素可以是不同的数据类型。
5、结构体
structure
为结构体类型,与C语言的结构体类似,例创建一个station结构体,有两种方式,一是通过‘结构体名称.字段名称’进行创建和赋值,ctation.name=‘s’;station.x=100;station.y=120;二是通过struct创建结构体,station=struct('name',{s},'x',{100},'y',{120})
。
char
为字符串类型;例如‘Hello,world!’
。
二、数据类型转换
浮点数128.4转换为整数:
a = int8(128.4)=127
高位溢出,因为128.4超出了int8的范围(-128~127),需要用:
a = int16(128.4)=128
a = round(128.4)=128
round()
函数为取整函数,小数部分小于0.5则舍去,即四舍五入。
a = fix(128.4)=128
a = fix(-128.6)=-128
fix()
函数为向0取整函数。
三、图像数据类型转换
1、uint8
转化为double
用来方便图像的运算:double
函数只是将读入图像的uint8
数据转换为double类型,一般不使用。常用的是im2double
函数,将uint8
图像转为double
类型,范围为0-1
,如果是255
的图像,那么255转为1,0还是0,中间的做相应改变。
matlab中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double。
-
I2=im2double(I1)
:把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出。默认情况下,matlab将图像中的数据存储为double型,即64位浮点数。 -
im2double()
:将图象数组转换成double精度类型。 -
im2single()
: 将图像转化为single类型。 -
im2uint8()
:将图象数组转换成unit8类型。 -
im2uint16()
:将图象数组转换成unit16类型。
2、uint8
和im2uint8
的区别
在数据类型转换时候uint8
和im2uint8
的区别,uint8
的操作仅仅是将一个double
类型的小数点后面的部分去掉;但是im2uint8
是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。
图像数据在计算前需要转换为double,以保证精度;很多矩阵数据也都是double的,要想显示,必须先转换为图像的标准数据格式。
如果转换前的数据符合图像数据标准(比如是double则要位于0~1之间),那么可以直接使用im2uint8
。如果转换前的数据分布不合规律,则使用uint8
,将其自动切割至0~255(超过255的按255),因此最好使用mat2gray
,将一个矩阵转化为灰度图像的数据格式(double)。
3、double
类型图像的显示
图像数据在进行计算前要转化为double
类型的,这样可以保证图像数据运算的精度。很多矩阵的很多矩阵数据也都是double
的,要想显示它,必须先转换为图像的标准数据格式。
如果直接运行imshow(I)
,显示的是一个白色的图像。这是因为imshow()
显示图像时对double
型是认为在0-1范围内,即大于1时都是显示为白色,而imshow
显示uint8
型时是0~255范围。经过运算后范围在0-255之间的double
型数据就被不正常得显示为白色图像了。
具体方法有:
-
imshow(I/256);
将图像矩阵转化到0-1之间 -
imshow(I,[]);
自动调整数据的范围以便于显示 (注意这里,必须是灰度图,负责不行) -
imshow(uint8(I));
-
imshow(mat2gray(I));
上面的mat2gray
是将最终获得的矩阵转化为灰度图像。常用的为:
A = im2uint8(mat2gray(result))
这样就将result
矩阵转化为uint8
类型的图像。