1. matlab图像保存说明

matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点double(64位,8个字节),自然可以节省很大一部分存储空间。
  详细来说imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。例如,彩色图像像素大小是400300( 高 * 宽 ),则保存的数据矩阵为400300*3,其中每个颜色通道值是处于0~255之间。
但是虽然matlab中读入图像的数据类型是uint8,而在图像矩阵运算的时候,使用的数据类型却是double类型。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为:

Function ‘*’ is not defined for values of class ‘uint8’

1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。

2. matlab图像类型转换

matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,区别如下:

img = imread('./1.jpg'); % 读入是unit8型(0~255)数据I1  = im2double(img);    % 把图像转换成double精度类型(0~1)I2  = double(img)/255;   % uint8转换成double,作用同im2double

这里补充说明一下,im2double( )和double( )的区别。double( img)就是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化,原本数据是0255之间,转化后还是0255。例如原来是255,那么转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)则不仅仅是将uint8转换到double类型,而且把数据大小从0255映射到01区间。
  另外需要补充说明下面这种情况:

img = imread('./1.jpg');I1  = double(img);I2  = im2double(I2); % I2数据依然是0~255,并不是0~1,即I1=I2

因为I1已经是double类型,imdouble不会对double类型数据0255映射到区间01,所以上面im2double操作没有任何作用,I1和I2相等。
  总结如下:函数im2double将输入转换成double类型。如果输入是uint8、unit16 或者是二值的logical类型,则函数im2double 将其值归一化到0~1之间,当然就是double类型的了。如果输入本身就是double类型,输出还是double类型,并不进行映射。
  如果已经是double类型的数据需要映射,则进行下面操作即可:

I2 = I1/255;

3. matlab图像显示imshow类型问题

在matlab处理完数据好,我们希望显示或者imwrite写入图片时候,需要注意。如果直接对double之间的数据矩阵I运行imshow(I),我们会发现有时候显示的是一个白色的图像。
  这是因为imshow()显示图像时对double型是认为在01范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0255范围。所以对double类型的图像显示的时候,要么归一化到01之间,要么将double类型的0255数据转为uint8类型。解决方法如下:

imshow(I/255);    % 将图像矩阵转化到0-1之间imshow(I,[]);     % 自动调整数据的范围以便于显示inshow(uint8(I)); % 转成uint8

4. uint和double数据转换的深入说明

double和uint8、uint16之间数据转换有下面的函数:

im2double(); % 将图像数组转换成double精度类型
im2uint8();  % 将图像数组转换成unit8类型
im2uint16(); % 将图像数组转换成unit16类型

当然,当图像数据是double类型的0~1之间,下面两者操作是等价的:

I1=im2uint8(I);
I2=uint8(round(I*255));

但是matlab默认double类型图片数据是位于01之间的,而uint8是位于0255。所以如果矩阵数据图像是double类型(01之间)可直接im2uint8,这样不仅完成数据类型转换,而且将01之间映射为了0~255之间的数据。
但是如果图像矩阵数据是double类型的0255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,01之间的数据才会映射到0~255之间整型的数据。例如下面程序:

img64 = [1,2,3,4];I8    = im2uint8(img64); % I8结果为[255255255255]

5. mat2gray()和im2double()区别

这两个如果都是对uint8数据操作,区别就在于前者是归一化操作,归一化后也在01之间,自然结果也是double类型,后者是将数据从0255映射到0~1。例如:

I  = uint8([1,1,2,3]);
I1 = mat2gray(I);  % 归一化,I1结果是double型[0,0,0.5,1]
I2 = im2double(I); % 映射化,I2结果是double型[0.0039,0.0039,0.0078,0.0118]

可以看出,虽然两者都是一种归一化,im2double只不过最大值永远是常数255,最小值永远是0,如下:

I−0.0255.0−0.0

而mat2gray最大值和最小值都是当前矩阵中最大最小的值,如下:

I−min(I)max(I)−min(I)

另外补充一个函数,mat2str()是将数型转换为字符串类型,一般在批量处理图片,给保存图片格式的名称中有作用,这样就不需要格式化sprintf操作了,非常方便。

资源来源:https://www.cnblogs.com/psztswcbyy/p/7489516.html


我的个人博客主页,欢迎访问

我的CSDN主页,欢迎访问

我的GitHub主页,欢迎访问

图像格式及Matlab的格式转换相关推荐

  1. matlab 数值格式转换,Matlab字符串转换及数值格式转换

    Matlab字符串转换及数值格式转换 字符串转换函数 abs 字符串到ASCII转换 dec2hex 十进制数到十六进制字符串转换 fprintf 把格式化的文本写到文件中或显示屏上 hex2dec ...

  2. Matlab音频格式转换

    所需前置知识 读音频 audioread 语法:   [y,Fs] = audioread(filename);   从名为 filename 的文件中读取数据,并返回样本数据 y 以及该数据的采样率 ...

  3. Matlab 音频格式转换(wav,ogg,flac,au,aiff,aif,aifc,mp3,m4a,mp4 互转)

    欢迎转载,但请一定要给出原文链接,标注出处,支持原创! 谢谢~ https://blog.csdn.net/qq_29225913/article/details/105445028 目录 1.目标及 ...

  4. MIPI RAW和YUV常见图像格式的解析、格式转换和看图软件

    设计初衷 在ISP的图像算法开发中,经常会涉及到YUV.RAW等格式的图像.例如,在YUV域,经常会涉及到I420.NV12和P010等数据格式之间的转换.在RAW域,又会经常涉及到MIPI RAW等 ...

  5. Python:图片格式转换

    JPG格式图片转PNG格式 png和jpg最大的不同点在于png支持alpha通道,也就是我们说的透明通道,而jpg是不支持透明通道的,这就使得png格式在某些场合具有特殊的用途. RGBA是代表Re ...

  6. DDSM数据库转换图像格式——LJPEG转为PNG格式

    Digital Database for Screening Mammography (DDSM)数据库是一个非常大的乳腺图像数据库,有一万多张图像,但是图像格式是LJPEG,现有的图像软件(如pho ...

  7. Matlab批量转换dicom,基于Matlab的批量转换DICOM格式CT序列图像的实现

    龙源期刊网 http://www.doczj.com/doc/25ac806b59fb770bf78a6529647d27284a733760.html 基于Matlab的批量转换DICOM格式CT ...

  8. matlab 转换图片格式,Matlab实现图片格式转换 pgm转jpg等

    在Matlab下,转换图片格式相对比较容易,本文以 PGM 转 JPG 为例,贴出示例程序: % 将pgm图片批量转换为jpg图片 function [ ] = pgm2jpg( ) % 读取指定目录 ...

  9. Matlab 将cell转换成double格式

    Matlab 将cell转换成double格式: data_cell是cell格式的数据,转化成data_double的double格式 data_double=transpose(str2num(c ...

最新文章

  1. OC与Swift封装网络工具类
  2. 海军工程大学学生电子课程-DIY Final预验收
  3. oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)
  4. RxJava系列4(过滤操作符)
  5. 学习:组件生命周期(1)
  6. JS之字符串截取方法substring
  7. oracle错误27101,ORA-27101ORA-01034错误解决
  8. ListView中convertView和ViewHolder的工作原理
  9. html未填写提示,文本框输入信息,未输入的文本框会提示输入,并且未输入的文本框会变红...
  10. java如何调用同目录下的文件_文件目录发生了增删改操作?Java如何实时监控?...
  11. C#进行Post请求(解决url过长的问题)
  12. html教程作用,HTML段落的作用及教程
  13. B站有哪些好的Java视频教程,看这篇就够了!
  14. UNITY开发VR从入门到放弃---VR自学手册
  15. 【Redis踩坑日记】Redis由于目标计算机积极拒绝,无法连接
  16. stm32F107VC通过模拟SPI方式读取LIS3DH三轴加速度传感器数据
  17. android基础的博客,【复习】Android基础
  18. 第三方软件MOOS-IvP扩展
  19. 如果时光可以倒流,会不会有不一样的故事
  20. 大龄程序媛的一路风景

热门文章

  1. 现在的access数据库有2种后缀格式:.mdb和.accdb,区别是.mdb是access2003版及以前,.accdb是2007版access的格式
  2. 微信公众号中 JavaScript 获取用户周边的标志性建筑列表
  3. python36中文手册_GitHub - cdarlint/python-36.zh_CN: python文档翻译(中文)
  4. 搭建msys2基础开发平台
  5. 20個網頁抓取工具快速抓取網站
  6. 从懵懂到精通装饰器在python里的作用
  7. 关于硬盘分区以及引导
  8. 动态磁盘无损转换到基本磁盘
  9. SMT常见的电子元件认识
  10. 《AutoCAD全套园林图纸绘制自学手册》一1.3 园林布局