图像类型、MATLAB数据类型,以及类型之间的转换(三)

来源:互联网 发布:php 大端小端 转换 编辑:程序博客网 时间:2024/05/29 09:40

上篇中我们对MATLAB的数据类型以及最基本的double类型和uint8类型的转换进行了讲解,除此之外,MATLAB里边仍然有部分函数可以实现数据类型转换的功能,在此我们将对这些函数进行学习;考虑到MATLAB里边图像读取和显示仍然和数据类型有莫大关系,所以我们也将对读取和显示函数进行必要说明。

MATLAB中常用类型转换函数

在一般情况下,由于图像读取类型uint8和MATLAB的默认类型double之间存在转换的必要,除了使用基本的double类型和uint8类型的转换之外,常常也使用下边的函数进行类型转换1

函数名 输入 输出 mat2gray uint8,uint16,double 归一化double im2double uint8,uint16,double 普通的double或归一化double im2uint8 uint8,uint16,double uint8 im2bw uint8,uint16,double logical

注:在没有特别说明的情况下,double类型包括普通的double类型和归一化的double类型

MAT2GRAY函数

函数使用的范例如下,其中A为uint8类型矩阵:

A =   77   78   77   76>> B=double(A)B =    77    78    77    76>> C=mat2gray(A)C =    0.5000    1.0000    0.5000         0>> C1=mat2gray(A,[0,255])C1 =    0.3020    0.3059    0.3020    0.2980>> D=mat2gray(B)D =    0.5000    1.0000    0.5000         0>> D1=mat2gray(B,[0,255])D1 =    0.3020    0.3059    0.3020    0.2980>> E=mat2gray(B/255)E =    0.5000    1.0000    0.5000         0>> E1=mat2gray(B/255,[0,1])E1 =    0.3020    0.3059    0.3020    0.2980

从上边的代码可知,MAT2GRAY函数有两种格式,分别为:

I = MAT2GRAY(A) %第一种形式I = MAT2GRAY(A,[AMIN AMAX]) %第二种形式

无论在哪种格式下,MAT2GRAY均输出归一化double类型。

第一种格式默认将A矩阵中的最小值和最大值设为AMIN和AMAX,小于AMIN的输出为0,大于AMAX的输出为1,介于AMIN和AMAX之间的数值输出对应于0~1之间的数值,例如输入分别为uint8类型,普通的double类型,归一化double类型时对应的C,D,E所示;

第二种格式中AMIN和AMAX为手动设置的数值(一般设置为A对应类型的最小值和最大值),小于AMIN的输出为0,大于AMAX的输出为1,介于AMIN和AMAX之间的数值输出对应于0~1之间的数值,例如输入分别为uint8类型,普通的double类型,归一化double类型时对应的C1,D1,E1所示;

MAT2GRAY第一种格式相当于将图像在本身最大最小值范围内进行了锐化,而第二种格式则只将在0~255或者0~1之间的图像进行了归一化。

IM2DOUBLE函数

函数使用的范例如下,其中A为uint8类型矩阵:

A =   77   78   77   76>> B=double(A)B =    77    78    77    76>> C=im2double(A)C =    0.3020    0.3059    0.3020    0.2980>> D=im2double(B)D =    77    78    77    76>> E=im2double(B/255)E =    0.3020    0.3059    0.3020    0.2980

从上边的代码可知,当输入为uint8类型时,输出归一化的double类型(其中0对应0,1对应255);当输出为double类型时,不做任何处理原样输出;

IM2UINT8函数

函数使用的范例如下,其中A为普通的double类型矩阵,B为uint8类型矩阵,C为归一化double类型矩阵:

A =     0   100   255   300>> B=uint8(A)B =    0  100  255  255>> C=mat2gray(B,[0,255])C =         0    0.3922    1.0000    1.0000>> D=im2uint8(A)D =    0  255  255  255>> E=im2uint8(B)E =    0  100  255  255>> F=im2uint8(C)F =    0  100  255  255

从上边的代码可知,当输入为uint8类型时,不做任何处理原样输出;当输入为普通的double类型时,发生截断;当输入为归一化d的ouble类型时,输出逆归一化的double类型,即:0对应0,1对应255;

IM2BW函数

函数使用的范例如下,其中A为普通的double类型矩阵,B为uint8类型矩阵,C、D为归一化double类型矩阵:

A =     0   100   255   300>> B=uint8(A)B =    0  100  255  255>> C=mat2gray(A)C =         0    0.3333    0.8500    1.0000>> D=mat2gray(B)D =         0    0.3922    1.0000    1.0000>> subplot(311);im2bw(A,0.35);title('im2bw(A,0.35)')>> subplot(312);im2bw(B,0.4);title('im2bw(B,0.4)')>> subplot(313);im2bw(C,0.34);title('im2bw(C,0.34)')

从上述代码可知,IM2BW的格式为:

BW=IM2BW(I,LEVEL)

其中LEVEL为0~1之间的阈值,I为输入图像。上述代码对应的结果为:

从上图可知:
当输入为普通的double类型时,对应输入A,则A中数值大于等于LEVEL的则输出1(黑色),小于LEVE1的输出0(白色);
当输入为uint8类型时,对应输入B,则先将B对应到0~1之间(其中0对应0,255对应1),然后再和LEVEL进行比较;
当输入为归一化的double时,对应输入C或者D,直接和LEVEL进行比较;

其他类型转换函数

除了上边所讲的四个常用类型转换函数之外,还有其他的类型转换函数,如:

I=IM2UINT16(A)I=IM2UINT32(A)

类似这些函数的含义,可以参见IM2UINT8的用法。

MATLAB中图像读取和显示函数

在MATLAB中进行图像读取和显示,最常使用到的函数如下所示:

>> I=imread('rice.tif');>> imshow(I);

其中第一个函数为图像读取函数,第二个函数为图像显示函数。一般来说,读取函数相对简单,只需要将要读取的文件放在当前工作目录下,便可直接读取;而图像显示函数则相对复杂,特别是图像在读取、类型转换、运算等一系列操作之后,如果在此时忽略数据类型而直接进行图像显示,可能造成像参考文献2中那样意外的失败2。

IMSHOW函数

IM2SHOW函数的几种格式如下所示:

>> imshow(I) >> imshow(I,[]) >> imshow(I,[0,255]) >> imshow(X,MAP) 

函数使用的范例如下,其中A为uint8类型,B为普通的double类型,C为归一化的double类型:

A =    0  100  200>> subplot(311);imshow(A);title('imshow(A)');>> subplot(312);imshow(A,[]);title('imshow(A,[])');>> subplot(313);imshow(A,[0,255]);title('imshow(A,[0,255])');B =     0   100   200>> subplot(311);imshow(B);title('imshow(B)');>>subplot(312);imshow(B,[]);title('imshow(B,[])');>>subplot(313);imshow(B,[0,255]);title('imshow(B,[0,255])');C =         0    0.3922    0.7843>> subplot(311);imshow(C);title('imshow(C)');>> subplot(312);imshow(C,[]);title('imshow(C,[])');>> subplot(313);imshow(C,[0,255]);title('imshow(C,[0,255])');

上述代码对应的结果分别如下图所示:
输入为uint8类型

由图可知,当输入为uint8类型时,第三种格式等价于第一种格式,第二种格式对当前图像进行了锐化;

输入为普通的double类型

由图可知,当输入为普通的double类型时,第一种格式不适用,一般为全白,出现参考文献2中的错误3;第二种格式对图像进行了锐化;第三种格式则正常显示;

输入为归一化的double类型

当输入为归一化的double类型时,第一种格式正常显示;第二种格式对图像进行了锐化;第三种格式不适用,一般为全黑;

从上边的实验可得到如下的结论:

使用第一种格式时,输入图像应该为uint8类型或者归一化的double类型;
使用第二种格式时,显示的图像一般是被锐化的,即对比度被增强;
使用第三种格式时,输入图像应该为uint8类型或者普通的double类型;

到此为止,有关图像类型、MATLAB数据类型,以及类型之间的转换的所有内容已经讲述完毕,相信大家也应该对相关内容有了一定的了解和认识。考虑到这是我对很久前学习内容的总结,若有错误和不当的地方,还请大家多多指正,如有不解亦可以留言于我进行交流。

参考文献


  1. 图像类型转换总结 ↩
  2. 谈谈matlab中的uint8和double ↩
  3. 谈谈matlab中的uint8和double ↩
0 0