首页 > 代码库 > Converting Between Image Classes (matlab 中图像类之间的转换)
Converting Between Image Classes (matlab 中图像类之间的转换)
首先类似于C中的类型转换,matlab中也有其对应的类型转换。
For example,
a=2;double(a) ---> 2.0 or 更多位数
a=2.1;uint8(a) ---> 2,反正是去掉了小数部分。
因为uint8是八个bit即一个byte存储的,因此其范围是0~255,超出255的double数据被强制转换为255,低于0的double数据被强制转换为0,中间的double数据则直接被去除小数部分。
a=[0,1;2,0];logical(a) ---> a=[0,1;1,0],非0全部转换为1
a=[0,1;2.0,0];logical(a) ---> 同上
实际上,上述的还未转换前的a均是double型,因为matlab默认将矩阵以double类型存储。。。
but,
a=uint8([0,1;2,0]);logical(a) ---> a=[0,1;1,0],非0全部转换为1
因此,logical的规则比较简单。
下面,我们来看看image processing toolbox 提供的类型转换函数的区别
有一些前提默认的东东:无法考证到出处。。。
--- > 图像的标准数据格式中,logical的取值范围是{0,1},double的取值范围是[0,1],uint8的取值范围是[0,255]
下面给出函数实例:
f=[-0.5,0.5;0.75,1.5];
(1). g1=im2uint8(f) --> g1=[0,128;191,255]
--- > 低于0的被直接转换为0,高于1的直接被转换为1.注意原有的f里面的最大值是f_max=1.5,最小值f_min=-0.5.
那么f中的范围介于0,1之间的值(设为f_value),被转化为 (f_value - f_min)/(f_max-f_min);
可以看出这是一个比例转换。。。
全部转换为在[0,1]的比例后,再集体乘上255
(2).有的时候f中可能存在多个小于0或者多个超过1的数,如果再使用im2uint8 就会丢失比例信息,十分恶心。
为了看起来不那么恶心,matlab puts forward a function named mat2gray.
As the name suggests,matrix data(always double) converting to gray(notation for density of image,0~255之类的)...
but,,,mat2gray的输出结果矩阵的范围是[0,1].
ex. f=[-2.0,-0.5;0.5,2.0];mat2gray(f) ---> [0,0.3750;0.6250,1.0]
这里先找到f_min 和 f_max,然后按照 (f_value - f_min)/(f_max - f_min) 对f中的每个数据(原始为f_value)进行转换。。。
经此一役,得到的矩阵依旧是double型,此时再使用 im2uint8,就可以将矩阵以最初的比例映射到[0,255]范围了。。。多么简单的映射阿,愚蠢的我思量了好久。。。
(3).简单的逻辑转换:
f=[-0.5,0.5;0.75,1.5];
g1=mat2gray(f); ---> g1=[0,0.5;0.625,1]
gb1=im2bw(g1,0.6); --> gb1=[0,0;1,1],大于0.6即输出1,反之输出0.。。。且结果矩阵是logical类型
gb2=g1 > 0.6 ---> 同上。。。。同样是布尔值的奥义。。。
(4).转换为 double型。。。
gb3=im2double(gb1); ---> gb3=[0,0;1,1]...只是gb3的class是double。。
gb4=im2double(uint8(gb1)); ---> gb4=[0,0;0.0039,0.0039];....
坑阿。。。logical到double直接就转换过去,uint8到double就得把uint8的数据统一除以255。。。
简单地想想,因为图像数据格式中,double是[0,1]间的。。因此得转换为比例。。。
(5).漏了一个。。。im2uint8(f),即第一种情况,当f是logical类型时,if f_value 为1,则转换为255,为0则转换为0.。。
容易理解,二值图像主要是图像分割操作的结果,,,且以非黑(像素值0)即白(像素值255)的形式显示出来以证明边缘等的存在。。。
总之,uint8是标准的真彩范围,double是[0,1]间,显示了比例,logical主要用于二值图像~~~~~~~~~~~
亲测,inshow这个函数,imshow(f)...默认会将对f进行 im2uint8操作。。。估计是为了显示真彩吧。。。
注意这些坑爹的玩意吧。。。然后学渣用的ubuntu为了装个matlab 2012 不得不删除了很多歌曲,只是为了腾地方~~~~~~~~~~~~~~~~~
若有新坑,继续补充~~~
Converting Between Image Classes (matlab 中图像类之间的转换)