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

上篇中我们对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第一种格式相当于将图像在本身最大最小值范围内进行了锐化,而第二种格式则只将在0255或者01之间的图像进行了归一化。
##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为输入图像。上述代码对应的结果为:
图像类型、MATLAB数据类型,以及类型之间的转换(三)_第1张图片

从上图可知:
当输入为普通的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])');

上述代码对应的结果分别如下图所示:
图像类型、MATLAB数据类型,以及类型之间的转换(三)_第2张图片

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

图像类型、MATLAB数据类型,以及类型之间的转换(三)_第3张图片

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

图像类型、MATLAB数据类型,以及类型之间的转换(三)_第4张图片

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

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

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

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


  1. 图像类型转换总结 ↩︎

  2. 谈谈matlab中的uint8和double ↩︎ ↩︎

你可能感兴趣的:(MATLAB,matlab,类型转换)