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 不得不删除了很多歌曲,只是为了腾地方~~~~~~~~~~~~~~~~~

若有新坑,继续补充~~~

原文地址:https://www.cnblogs.com/lightninghzw/p/3984638.html