【Matlab】用索引来表示(伪彩色)的bmp图像的读取问题

迁移自CSDN:【matlab】matlab读用索引来表示(伪彩色)的bmp图像的格式相关问题

bmp图像的定义:bmp-百度百科
里面这样说到:

典型的BMP图像文件由四部分组成:
1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
3:调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值

注意第4条!!

这篇文章也可以参看一下:BMP文件格式详解(BMP file format)

在用3M君给的”如何一键批量裁剪、排列、并输出图片?“(微信号:科学计算编点程, kexuebc)文章中,有朋友想直接拿代码来用但是运行但是有问题,原因是与bmp的格式有关。以下是一些测试:

用matlab生成一张bmp图像

代码:

1
2
3
4
X = [1,2,3,4];
Y = [1,3,4,4];
plot(X,Y);
print('-dbmp','-r300','turecolor.bmp');

生成的图像:

turecolor

读取图像的一些信息:

1
2
3
[IM, map] = imread('turecolor.bmp','bmp');
im_size = size(IM)
im_class = class(IM)

结果:

1
2
3
4
5
6
7
8
im_size =
1800 2400 3
im_class =
uint8

可以看到图像的存储在一个三维矩阵里面的:垂直1800个像素,水平2400个像素,3个通道(RGB),位图数据类型为uint8.

从origin生成图像

图片是从origin生成的,它生成的就是用索引值来表示的,要配合调色板来使用。我先从origin生成一张图如下(随便生成的,不看也罢):

伪彩色

在matlab中读取查看它的信息,代码如下:

1
2
3
[IM, map] = imread('pseudocolor.bmp','bmp');
im_size = size(IM)
im_class = class(IM)

结果:

1
2
3
4
5
6
7
8
im_size =
2461 3216
im_class =
uint8

可以看到它与matlab生成的图像有一点不同,对,结果显示它是一个2维的数组,2维的数组是无法表示彩色的,所以它还有对应的调色板(matlab里面叫colormap?)。

解决办法

对于用RGB表示的图像直接用3M君给的代码就好。
对于origin生成的这种将其转换为真彩色即可,在matlab中对应的函数为ind2rgb。读取bmp图像的时候一起读取它的colormap。

例子:

1
2
3
4
[IM, color_map] = imread('pseudocolor.bmp','bmp');
im_size = size(IM)
IMrgb(:,:,:) = ind2rgb(IM, color_map);
IMrgb_size = size(IMrgb)

结果:

1
2
3
4
5
6
7
8
im_size =
2461 3216
IMrgb_size =
2461 3216 3

这样就可以用3M君的代码了。