今天主要讲的是在MATLAB下,怎么实现数据类、图像类型之间的转换。首先我们需要先了解一下数据类和图像类型。
在MATLAB中,关于数据类型一共包括了10项,分别包含了8项数值数据类、1项字符类、1项逻辑数据类,如下表所示。其中,所有的数值计算都可用double类来进行。
图像类型:
在MATLAB工具箱中,它支持亮度、二值、索引、RGB图像四种图像类型。大多数单色图像的处理运算是通过二值图像和亮度图像来进行的,彩色图像当做索引图像或RGB图像来处理,由于彩色图像处理较为复杂,所以本次将不讨论RGB图像和索引图像,后期再做说明。
1.亮度图像:
一幅亮度图像是一个数据矩阵,其归一化的取值表示亮度。若亮度图像的像素都是uint8类或uint16类,则它们的整数值范围分别是[0,255]和[0,65535]。若图像数据是double类的,则像素取值就是浮点数。规定双精度型归一化亮度图像的取值范围是[0,1]。
2.二值图像:
二值图像是一种只有逻辑数字0和1的逻辑数组。在MATLAB中,因为并不把只含有0和1的数值数组认为是二值数组,所以需要使用logical函数把数值数组转化为二值数组。
比方说:若A是一个由0和1构成的数值数组,则使用
>> B = logical(A) %创建一个逻辑数组B
还有一种情况就是A中除了0和1之外还有其他元素,则使用logical函数可以将所有非零的量变换为逻辑1,而将所有的数值0变换成逻辑0。
使用函数islogical,测试一个数组是否是逻辑数组:
>> islogical ( c ) %若c是逻辑数组,函数返回1,否则返回0.
数据类间的转化
>> B = data_class_name(A) %data_class_name可以为表1‘数据类’中的任何一项。
比方:A是一个uint8类的数组,则命令:
>>B = double(A)
将产生一个双精度数组B。
其中需要注意的是:如果将一个精度范围大的类转换为精度范围小的类,比如将double类转换为uint8类,若double类的数组在区间[0,255]之外存在其他的值,则会自动将大于255的值转换为255,小于0的值转换为0。所以一般精度范围大的数组转换为精度范围小的数组,需要将原来的数组进行一定的缩放,使其取值尽量在精度小的范围内。
图像类和类型间的转换
im2uint8函数:可以检测出输入的数据类,并进行所有必要的缩放,以便使工具箱能将这些数据识别为有效的图像数据。
比如,一个double类2*2的图像f,它可以是中间计算的结果:
执行转换:
>> g = im2uint8(f)
im2uint8函数:可以将所有小于0的值设置为0,将输入中所有大于1的值设置为255,再将所有其他值乘以255,并将得到的结果四舍五入得到最接近的整数,从而完成转换。
注:彩色图像的转化这里不做讨论,后期再做说明。
mat2gray函数:将double类的任意数组转换成取值范围为[0,1]的归一化double类数组
>> g = mat2gray(f) %将f转换为[0,1]之间的double类的数组,生成g
>> gb = im2bw(g,TV) %将g数组使用阈值TV将其转换为二值图像,生成gb
**islogical函数:**将一个逻辑数组的事实存储为一个变量。
>> gbv = islogical(gb)
**im2double函数:**将一个逻辑数组转换为一个值为0和1的double类数值数组。
>> gbd = im2double(gb)
注:若gb是一个uint8类的数值数组,对其使用im2double结果与其是一个逻辑数组得到的结果是不一致的。
注:MATLAB支持嵌套语句,上述的所有操作可写成:
>> gbd = im2double(im2bw(mat2gray(F),0.5))
下期将实现数组的索引功能,以及介绍怎么实现一些标准数组。
:MATLAB支持嵌套语句,上述的所有操作可写成:
>> gbd = im2double(im2bw(mat2gray(F),0.5))
下期将介绍怎么实现数组的索引功能,以及怎么实现一些标准数组。
后期将持续更新,你的关注就是我更新的动力哦