图像类型、MATLAB数据类型,以及类型之间的转换(一)
2015-04-14 16:54
549 查看
在使用MATLAB进行有关图像读取、显示和处理的时候,认真考虑图像类型以及MATLAB中的数据类型,从而根据自己的需要进行必要的类型之间的转换,可以有效避免不必要的细微错误——这样的细微错误有时候恰恰让我们折磨不已。
灰度图像(亦称亮度图像):比如常见的类型为uint8的灰度图像,对应幅值范围为0~255;类型为uint16灰度图像,对应幅值范围为0~65535;以及MATLAB中类型为归一化double的灰度图像,对应数值范围为0~1,其中0对应黑色,1对应白色。
这里所说的uint8,uint16类型,其实就是数字图像中每个像素的幅度分辨率,即:到底是用8位unsigned int还是用16位unsigned int表示黑色到白色的量化精细程度,显然使用位数越多图像显示越精细,但是要注意人眼对灰度图像存在分辨极限2。
二值图像:每个像素点幅值非0即1。也有人称之为logical类3,不过要注意,灰度图像幅值仅为0或1并不等于该图像为二值图像。
索引图像:图像由一个整型数值矩阵和一个M*3的调色板MAP共同组成,每个整型数值都对应(映射到)调色板MAP中的某一行,该行由RGB的三个分量共同构成某一种特定的颜色。M的大小取决于该整型数值的类型,如果为uint8类型,则M为256;如果为uint16类型,则M为65536,其实M也可以理解为每个像素可以被表示成不同种颜色的种数。
RGB图像(真彩色图,Truecolor):每个像素由三个分量组成,分别对应R,G,B三个分量,即:该图像的矩阵大小为M*N*3,可以理解为3个M*N的矩阵,三个矩阵分别存储每个像素对应的R,G,B数值。因为R,G,B一般情况下各有0~255的256种颜色,所以RGB图像某种情况下可以包含256*256*256=16 777 216(一般说的1600万色)颜色,因此也称之为真彩色。
其实原因很简单,无论使用索引图像还是RGB图像,在特定的情况下它们分别都可以实现节省存储空间的目的4,具体可以参考如下例子:
某200*200大小的颜色数为16(每个像素只可能为16种颜色中的一种)的彩色图,在R、G、B三个分量分别为0~255的情况下:
如果使用存储为RGB图像,则需要的空间大小为:200*200*3=120kBytes,其中每个像素的R、G、B分量各需要一个字节,即单个像素占用3Bytes。
如果存储为索引图像,因为颜色数为16,所以调色板MAP的大小为16*3的矩阵,占用16*3=48Bytes;而每个像素只用记录对应颜色的索引,该索引值为0~15,因此只占用半个Bytes,则所需空间大小为:200*200*0.5+16*3≈20kBytes。
这种情况下,存储为索引图像只占用存储为RGB图像所用空间的1/6。
如果上边的颜色数该为256*256*256,则存储为索引图像和RGB图像所需要的空间大小为:
RGB图像:200*200*3=120kBytes;
索引图像:200*200*3+256*256*256*3≈50MBytes;(多么大的一个调色板啊!)
可见,这种情况下存储为RGB图像更节省存储空间。
从上例可以看出,针对不同的情况,索引图像和RGB图像各有优缺点,特别是当像素多而颜色数少时存储为索引图像比较好(避免了大量相同RGB分量的重复),而当像素少而颜色数多时存储为RGB图像比较好(这种情况下,调色板MAP将占用很大的存储空间)。
本篇对图像类型的说明到此为止,关于MATLAB数据类型以及类型之间的转换方面的内容,我将在下篇博客中详述,并给出必要的实例代码。
图像工程(上册)《图像处理》(第三版),章毓晋,清华大学出版社 ↩
图像类型转换总结 ↩
GIF-7:图片格式与调色板 ↩
图像类型
图像的分类
根据不同的原理或方法,图像的类型其实可以分为很多种,但是考虑到我们此处的实际需求,结合Image Process Toolkit(图像处理工具,比如PS,MATLAB等)对图像类型的支持,我们将图像类型分为如下四种1:灰度图像(亦称亮度图像):比如常见的类型为uint8的灰度图像,对应幅值范围为0~255;类型为uint16灰度图像,对应幅值范围为0~65535;以及MATLAB中类型为归一化double的灰度图像,对应数值范围为0~1,其中0对应黑色,1对应白色。
这里所说的uint8,uint16类型,其实就是数字图像中每个像素的幅度分辨率,即:到底是用8位unsigned int还是用16位unsigned int表示黑色到白色的量化精细程度,显然使用位数越多图像显示越精细,但是要注意人眼对灰度图像存在分辨极限2。
二值图像:每个像素点幅值非0即1。也有人称之为logical类3,不过要注意,灰度图像幅值仅为0或1并不等于该图像为二值图像。
索引图像:图像由一个整型数值矩阵和一个M*3的调色板MAP共同组成,每个整型数值都对应(映射到)调色板MAP中的某一行,该行由RGB的三个分量共同构成某一种特定的颜色。M的大小取决于该整型数值的类型,如果为uint8类型,则M为256;如果为uint16类型,则M为65536,其实M也可以理解为每个像素可以被表示成不同种颜色的种数。
RGB图像(真彩色图,Truecolor):每个像素由三个分量组成,分别对应R,G,B三个分量,即:该图像的矩阵大小为M*N*3,可以理解为3个M*N的矩阵,三个矩阵分别存储每个像素对应的R,G,B数值。因为R,G,B一般情况下各有0~255的256种颜色,所以RGB图像某种情况下可以包含256*256*256=16 777 216(一般说的1600万色)颜色,因此也称之为真彩色。
索引图像和RGB图像在节省存储空间上各自的特点
可能有人看了上边索引图像和RGB图像的含义会有这样的疑问:同样是最终使用RGB三个分量来表示的图像,索引图像使用整型数值矩阵和调色板MAP来实现,而RGB图像却直接使用一个M*N*3的矩阵来实现,为什么不统一为只使用其中的一种方法来表示图像呢?其实原因很简单,无论使用索引图像还是RGB图像,在特定的情况下它们分别都可以实现节省存储空间的目的4,具体可以参考如下例子:
某200*200大小的颜色数为16(每个像素只可能为16种颜色中的一种)的彩色图,在R、G、B三个分量分别为0~255的情况下:
如果使用存储为RGB图像,则需要的空间大小为:200*200*3=120kBytes,其中每个像素的R、G、B分量各需要一个字节,即单个像素占用3Bytes。
如果存储为索引图像,因为颜色数为16,所以调色板MAP的大小为16*3的矩阵,占用16*3=48Bytes;而每个像素只用记录对应颜色的索引,该索引值为0~15,因此只占用半个Bytes,则所需空间大小为:200*200*0.5+16*3≈20kBytes。
这种情况下,存储为索引图像只占用存储为RGB图像所用空间的1/6。
如果上边的颜色数该为256*256*256,则存储为索引图像和RGB图像所需要的空间大小为:
RGB图像:200*200*3=120kBytes;
索引图像:200*200*3+256*256*256*3≈50MBytes;(多么大的一个调色板啊!)
可见,这种情况下存储为RGB图像更节省存储空间。
从上例可以看出,针对不同的情况,索引图像和RGB图像各有优缺点,特别是当像素多而颜色数少时存储为索引图像比较好(避免了大量相同RGB分量的重复),而当像素少而颜色数多时存储为RGB图像比较好(这种情况下,调色板MAP将占用很大的存储空间)。
总结
如前边所讲,根据不同的原理或方法,图像的类型可以分为很多种,但是在此处我们仅根据我们的需求来说明一些经常接触的图像类型,而且这些图像类型是我们在MATLAB中经常碰到和使用的,因此有必要进行这方面的学习。本篇对图像类型的说明到此为止,关于MATLAB数据类型以及类型之间的转换方面的内容,我将在下篇博客中详述,并给出必要的实例代码。
参考文献
图像类型转换总结 ↩图像工程(上册)《图像处理》(第三版),章毓晋,清华大学出版社 ↩
图像类型转换总结 ↩
GIF-7:图片格式与调色板 ↩
相关文章推荐
- 图像类型、MATLAB数据类型,以及类型之间的转换(二)
- 图像类型、MATLAB数据类型,以及类型之间的转换(三)
- matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- matlab中图像数据类型转换
- MATLAB图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- 包装类数据类型,以及数据类型之间的转换
- java中基本数据类型的包装类以及基本数据类型之间的转换
- matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- Matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- [置顶] matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- Hibernate多条件查询以及与java+sql 之间数据类型转换关系
- 变量和数制进制之间的相互转换以及八大基本数据类型
- 图像数据类型的转换 matlab opencv
- java基本数据类型、对应的封装类以及字符串之间的相互转换
- Java的基本数据类型之间的转换以及面试题
- Java 基本数据类型与其包装数据类型以及字符串(String)之间的转换问题
- daliu_it java基础笔记之 变量和数据类型以及数据类型之间的转换以及转义字符
- matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明
- Java中数据类型及其之间的转换(转)