• 【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图像

    代码:

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

    生成的图像:
    turecolor
    读取图像的一些信息:

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

    结果:

    im_size =
    
            1800        2400           3
    
    
    im_class =
    
    uint8

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

    从origin生成图像

    图片是从origin生成的,它生成的就是用索引值来表示的,要配合调色板来使用。我先从origin生成一张图如下(随便生成的,不看也罢):
    伪彩色
    在matlab中读取查看它的信息,代码如下:

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

    结果:

    im_size =
    
            2461        3216
    
    
    im_class =
    
    uint8

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

    解决办法

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

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

    结果:

    im_size =
    
            2461        3216
    
    
    IMrgb_size =
    
            2461        3216           3

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

  • 相关阅读:
    Oracle第五周测验
    软件测试第五周
    Oracle第四周作业
    c++第二章测试
    软件测试第四章
    软件测试 第三章
    Centos 安装.NET Core环境
    .net core 集成极光推送
    Swagger添加文件上传测试
    linux firewall
  • 原文地址:https://www.cnblogs.com/shanchuan/p/8150335.html
Copyright © 2020-2023  润新知