参考:http://www.ilovematlab.cn/thread-61626-3-1.html
http://blog.youkuaiyun.com/u010159842/article/details/52523520
前言
tip:首先我们需要知道的是如果要在控制台定义一个矩阵,那么它是一个double类型的矩阵而不是我理所当然认为它是uint8型的。
a =[235 200 89 20]
whos a
double
double()函数只是单纯地把数据转为double类型的,也就是说如果是uint8的类型的只是把它转换成double类型的,你也可以直观地理解为直接在uint8后面加了小数点及0,如302 ->302.0000这种形式,当然这只是为了方便记忆。
im2double
而对于im2double()函数,它就有点不同了,一则它和double()一样也是把数据转为double类型,但是这得分成两种情况去说。(1)当输入数据类型本身就是double类型的时候,此时im2double()函数几乎不起作用,返回和原矩阵一样的结果。(2)当输入数据类型是uint8时,那么返回值结果就是一个在[0,1]之间的double类型数据。把这个结果拿出来,仔细想一想其实就是double(输入结果)/255;得到的。这也就验证了别人所说的:按照0–>>0(0/255=0),255–>>1(255/255=1),将其值按比例处理成0~1之间的double数值
%使用系统函数im2double
A = uint8([1 2 3 4 5]);
tran_1 = im2double(A);
%使用自己的方法 /255得到
tran_2 = double(A)/255
mat2gray
mat2gray()函数和im2double()很像,但是又有不同,虽然两者的数据都会在[0,1]之间,但是mat2gray()是输入数据进行归一化的结果。
输入数据按照最小值–>>0;最大值–>>1,输出类型为double。也就是说无论如何,mat2gray()转换的结果一定有0,1两个数字。但是im
2double()却不一定有,只有在其输入数据内存在0,255时才会有。而且无论输入数据是uint8还是double类型,它都会进行归一化。
tran_3 =mat2gray(A);
mat2gray的原理
那mat2gray的原理到底是什么呢?看到一个人的blog这样写出了算法流程。于是自己写了个小程序去验证了下,果然是利用归一化中的X=(X-min)/(max - min)这个公式。
算法流程:
1、计算最大值和最小值的差值的倒数即:det=1/(max(F)-min(F));
2、对于数据F中介于最大值和最小值之间的数据是这样处理的使用temp_last=(temp1-min(F))*det即可。
% 定义一个验证向量
a = [1 4 8 12 11 21];
% 找到最值
max_1 = max(a);
min_1 = min(a);
% 归一化
det = 1/(max_1-min_1);
b = (a-min_1)*det;
c =mat2gray(a);
% 比较结果
difference = sum(b-c);