zoukankan      html  css  js  c++  java
  • [转]matlab中图像格式转换

    uint 8:无符号的8位(8bit)整型数据(unit 都是存储型)
    int :整型数据
    1、在MATLAB中,数值一般都采用double型(64位)存储和运算.
    2、为了节省存储空间,MATLAB为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称为8位型像。
    3、函数image能够直接显示8位图像,但8位型数据和double型数据在image中意义不一样,
    4、对于索引图像,数据矩阵中的值指定该像素的颜色种类在色图矩阵中的行数。当数据矩阵中的值为0时,表示用色图矩阵中第一行表示的颜色绘制;当数据矩阵中的值为1时,表示用色图矩阵中的第二行表示的颜色绘制该像素,数据与色图矩阵中的行数总是相差1。所以,索引图像double型和uint8型在显示方法上没有什么不同,只是8位数据矩阵的值和颜色种类之间有一个偏差1。调用格式均为image(x); colormap(map);
    5、对于灰度图像,uint8表示范围[0,255],double型表示范围[0,1]。可见,double型和uint8型灰度图像不一样,二者转换格式为:

    I8=uint8 (round (I64*255)); !!double转换成uint 8

    I64=double (I8)/255; !!!uint转换成double

    反之,imread根据文件中的图像种类作不同的处理。当文件中的图像为灰度图像时,imread把图像存入一个8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个8位RGB矩阵中。
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double
    因此
    I2=im2double(I1) :把图像数组I1转换成double精度类型;
    如果不转换,在对uint8进行加减时会产生溢出
     
    图像数据类型转换函数
    默认情况下,matlab将图象中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。

    im2double():将图象数组转换成double精度类型
    im2uint8():将图象数组转换成unit8类型
    im2uint16():将图象数组转换成unit16类型

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。
            但是,问题的真正的解释其实应该是这样的。首先是在数据类型转换时候uint8和im2uint8的区别,uint的操作仅仅是将一个double类型的小数点后面的部分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。
             图像数据在进行计算前要转化为double类型的,这样可以保证图像数据运算的精度。很多矩阵的很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间,这个是由Matlab中的规定),那么可以直接使用im2uint8。
        如果转换前不满足这个分布规律,则使用uint8,将其自动切割至0~255(超过255的按255)最好使用mat2gray,这个函数可以把一个double类的任意数组转换成取值范围在[0,1]之间的,将一个矩阵转化为灰度图像的数据格式(double)另外,可以用isgray判断矩阵是否是一个图像数据矩阵。


    matlab中用imshow()显示图像与图像矩阵的数据类型的关系

    在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。 那么如何解决这个问题呢?笔者曾经用fix()函数把图像矩阵由实数形式转化成整数形式,但这样仍无法改变图像矩阵是double型的事实。 通过搜索,找到两个解决方法: imshow(I/256); -----------将图像矩阵转化到0-1之间 imshow(I,[]); -----------自动调整数据的范围以便于显示 (不明白原理!%lwb 添加内容:此处用了图像灰度拉伸方法,将图像最小的像素值变为0,最大的为255%) 从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!不知什么原理! 此外还找到一些方法,还没有试过,记录如下:
    uint8和im2uint8的区别
    图像数据在计算前需要转换为double,以保证精度; 很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式. 如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间),那么可以直接使用im2uint8 如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255(超过255的按255) 最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double) 另外,可以用isgray判断矩阵是否是一个图像数据矩阵

    总之,im2uint8、im2double要跟uint8、double区别开来。

    double 就是简单地把一个变量类型转换成double类型,数值大小不变;
    比如 a=6 是个unit8类型的话,double(a)的结果还是6,不过现在这个6是double类型的。
    函数im2double将输入转换成double类型。如果输入是 uint8 unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间,当然就是double类型的了。如果输入本身就是double类型,输出还是double类型,并不进行归一化。。


    !!!!!!!!!!!!!!!!!!!
    imhist(I)
    为图像,在灰度条上显示一个直方图。直方图中bin的数目有图像的类型决定。如果I是个灰度图像,imhist将使用默认值256个bins。如果I是一个二值图像,imhist使用两bins。

    imhist(I, n)
    使用指定的n个bin来绘制直方图。n同时也制定了颜色条的长度,如果是二值图像,n只能赋值为2。

    imhist(X, map)
    为索引文件显示直方图。这个直方图在colormap图上显示像素值的分布。colormap必须至少和X最大索引一样长。

    [counts,x] = imhist(...)

    bin应该是直方图直方的个数,要把灰度归为几类,有几个直方形,就有几个bin。这样,如果设定了bins,那么其他颜色之类,应该以一种算法归于最近的bin。

  • 相关阅读:
    Git 常用命令
    Python 常用算法记录
    Python基础Web服务器案例
    你真的懂SDWebImage?
    Core Data的那点事儿~
    看看 SDWebImage内部基本实现过程
    App上架流程 & 上架被拒10大原因
    KVO中你所不知道的"坑"
    math公式手写识别网址
    umi build出现的Path must be a string的问题解决
  • 原文地址:https://www.cnblogs.com/caffeaoto/p/9198730.html
Copyright © 2011-2022 走看看