zoukankan      html  css  js  c++  java
  • 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 不得不删除了很多歌曲,只是为了腾地方~~~~~~~~~~~~~~~~~

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

  • 相关阅读:
    leetcode 【 Merge Two Sorted Lists 】 python 实现
    leetcode 【 Remove Duplicates from Sorted List II 】 python 实现
    leetcode 【 Remove Duplicates from Sorted List 】 python 实现
    leetcode 【 Remove Nth Node From End of List 】 python 实现
    leetcode 【 Linked List Swap Nodes in Pairs 】 python 实现
    i++操作非原子的验证代码
    黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束
    mysql 原理 ~ sql查询语句
    tidb 架构 ~Tidb学习系列(3)
    mysql 查询优化 ~ 善用profie利器
  • 原文地址:https://www.cnblogs.com/lightninghzw/p/3984638.html
Copyright © 2011-2022 走看看