【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”

article/2025/9/28 4:54:44

【MATLAB Image Processing Toolbox 入门教程六】

  • 1 gray2ind函数
  • 2 ind2gray函数
  • 3 mat2gray函数
  • 4 rgb2gray函数
  • 5 rgb2ind函数
  • 6 label2rgb函数
  • 7 imsplit函数
  • 8 grayslice函数


MATLAB Image Processing Toolbox支持的图像类型有:二值图像、索引图像、灰度图像、彩色图像。本章所讲的内容就是这些图像类型的互相转换。


1 gray2ind函数

gray2ind函数的作用是将灰度图像或二值图像转化为索引图像,具体使用方法为:

[X,map]=gray2ind(I,c) 将灰度图像I转化为索引图像
[X,map]=gray2ind(BW,c) 将二值图像BW转化为索引图像

对于输入参数c,是索引图像colormap的颜色数。可以指定为1-65536之间的正整数,对于灰度图像,c默认为64;对于二值图像,c默认为2。
对于输出参数中的X,返回的是与输入灰度或二值图像相同维度的数值数组,若c小于等于256,则X的数值类型为uint8,否则为uint16;
对于输出参数的map,是与X相关联的颜色映射,是一个c×3的数值数组。

接下来我们在工作空间中读入一张灰度图像,将其转换为索引图像后显示出来。

I=imread('cameraman.tif');
[X,cmap]=gray2ind(I,16);
imshow(X,cmap);

在这里插入图片描述

2 ind2gray函数

I=ind2gray(X,cmap)
此函数将带有颜色表cmap的索引图像X转化为灰度图像I。ind2gray函数在保留索引图像亮度的同时删除了色调和饱和度信息。
此函数中的输入输出参数和第一节中gray2ind函数的参数含义相同,就不做赘述,直接上示例:

[X,map]=imread('trees.tif'); %在MATLAB工作空间中载入索引图像
I=ind2gray(X,map); %将索引图像转化为灰度图像
subplot(1,2,1);imshow(X,map);title('索引图像'); %显示索引图像
subplot(1,2,2);imshow(I);title('灰度图像'); %显示灰度图像

在这里插入图片描述

3 mat2gray函数

我们知道,图像在计算机中是以矩阵的形式存储的,mat2gray函数的作用就是将一个矩阵转化为灰度图像,使用方式为:

I=mat2gray(A,[amin amax]) 将矩阵A转化为灰度图像I,灰度值在0-1之间,0为黑,1为白。A中小于amin的元素值对应I中的0,大于amax的元素值对应I中的1,其余映射到[0 1]之间。
I=mat2gray(A) 和上式相比,相当于A中的最大值赋给amax,A中最小值赋给amin。

接下来,我们对mat2gray函数用法进行示例。
首先往MATLAB工作空间读入一张图像:

I=imread('rice.png');
figure;
imshow(I);

在这里插入图片描述
接着,对图像I进行滤波操作,返回一个数值矩阵,对于filter2函数,我们现在只要知道它能对矩阵进行滤波操作就可以,具体会在以后的图像滤波专题中讲解。

J=filter2(fspecial('sobel'),I); %fspecial的作用是创建一个预定义的二维滤波器,以后讲到滤波的时候会详解。
figure;
imshow(J);

在这里插入图片描述
接下来,我们使用mat2gray函数将其转为灰度图像:

K=mat2gray(J);
figure;
imshow(K);

在这里插入图片描述
可以看出,转换成灰度图像后,米粒的边缘更加明显了,这其实是滤波的作用,在以后的章节会详细介绍图像滤波和图像增强。

4 rgb2gray函数

此函数通过消除图像的色调和饱和度,将RGB图像或RGB颜色图转化为灰度图像或灰度颜色图。通过计算R、G、B三个分量的加权和,将RGB值转化为灰度值:0.2989 * R + 0.5870 * G + 0.1140 * B

I=rgb2gray(RGB) 将真彩色图像RGB转换成灰度图像I。RGB是m×n×3的数值数组,对应的I是m×n的数值数组
newmap=rgb2gray(map) 将彩色colormap转换为灰度colormap。map是[0 1]内数值组成的c×3数组,每行都是一个三元素RGB,对应三个红绿蓝分量。newmap也是[0 1]内数值组成的c×3数组,但是每行元素是相同的,所以每行都指定一个强度值。

示例1 读取RGB图像,转化成灰度图像并显示:

RGB=imread('peppers.png');
I=rgb2gray(RGB);
subplot(1,2,1);imshow(RGB);title('彩色图像');
subplot(1,2,2);imshow(I);title('灰度图像');

在这里插入图片描述
示例2 将RGB颜色图转化为灰度颜色图:

[X,map]=imread('corn.tif');
newmap=rgb2gray(map);
subplot(1,2,1);imshow(X,map);
subplot(1,2,2);imshow(X,newmap);

在这里插入图片描述

5 rgb2ind函数

此函数的作用是将RGB图像转为索引图像,具体的使用方法如下:

[X,cmap]=rgb2ind(RGB,Q) 使用具有 Q 种量化颜色的最小方差量化法并加入抖动,将 RGB 图像转换为索引图像 X,关联颜色图为 cmap。
[X,cmap]=rgb2ind(RGB,tol) 使用均匀量化法并加入抖动,将 RGB 图像转换为索引图像,容差为 tol。
X=rgb2ind(RGB,inmap) 使用逆颜色图算法并加入抖动,将 RGB 图像转换为索引图像,指定的颜色图为 inmap。
___ = rgb2ind(___,dithering) 启用或禁用抖动。

接下来我们对其中的输入输出参数进行讲解:

  1. RGB 输入的彩色图像,是一个m×n×3的矩阵。
  2. Q 最小方差量化法所用的量化颜色的数量,指定为小于65536的正整数。
  3. tol 均匀量化法所用的容差,指定为[0 1]内的数。
  4. inmap 输入的颜色图,指定为由范围 [0, 1] 内的值组成的 c×3 矩阵。inmap 的每行都是一个三元素 RGB,指定颜色图的单种颜色的红、绿和蓝分量。该颜色图最多有 65536 种颜色。
  5. dithering 是否执行抖动,默认为’dither’(执行抖动),也可以指定为nodither。抖动以损失空间分辨率为代价来提高颜色分辨率,如果选择 ‘nodither’,则 rgb2ind 不执行抖动,此时,函数将原始图像中的每种颜色映射到新颜色图中最接近的颜色。
  6. X 返回的索引图像,由非负整数组成的m×n矩阵。
  7. cmap 返回的颜色图,由范围 [0, 1] 内的值组成的 c×3 矩阵。cmap 的每行都是一个三元素 RGB,指定颜色图的单种颜色的红、绿和蓝分量。该颜色图最多有 65536 种颜色。

对于上述所说的最小方差量化法、均匀量化法、逆颜色图算法,下面简要说明一下:

  • 均匀量化 - 如果您指定 tol,则 rgb2ind 使用均匀量化来转换图像。均匀量化将 RGB 颜色立方体削减为较小的 tol 长度的立方体。例如,如果您指定 tol 为 0.1,则立方体的边缘为 RGB 立方体长度的十分之一。小立方体总数为:
    t = (floor(1/tol)+1)^3
    每个立方体表示输出图像中的一种颜色。因此,t 为颜色图的最大长度。rgb2ind 会删除不显示在输入图像中的任何颜色,因此实际颜色图可能小于 t。
  • 最小方差量化 - 如果您指定 Q,则 rgb2ind 使用最小方差量化。最小方差量化将 RGB 颜色立方体削减为不同大小的较小块(未必是立方体),具体取决于这些颜色在图像中的分布情况。如果输入图像实际使用的颜色数少于指定的数量,则输出颜色图也会变小。
  • 逆颜色图 - 如果您指定输入颜色图 inmap,则 rgb2ind 使用颜色图映射。逆颜色图算法可将指定颜色图量化为每个颜色分量 32 个不同色阶。然后,对于输入图像中的每个像素,查找量化的颜色图中最接近的颜色。

接下来,我们举一个rgb2ind函数的使用示例:

RGB=imread('ngc6543a.jpg');
imshow(RGB);
[X,map]=rgb2ind(RGB,32);
figure;
imshow(X,map);

在这里插入图片描述

6 label2rgb函数

在【MATLAB Image Processing Toolbox 入门教程二】快速入门之“亮度校正”和“目标识别”中我们简单使用过这个函数,它的功能是将标签矩阵转为RGB图像,本小节将对这个函数进行详细讲解。
label2rgb函数的使用方法为:

  • RGB=label2rgb(L):将标签图像L转化为RGB图像,以便可视化标记区域。label2rgb函数根据标签矩阵中对象的数量决定分配给每个对象的颜色。
  • RGB=label2rgb(L,cmap):指定在RGB图像中使用的颜色图cmap。
  • RGB=label2rgb(L,cmap,zerocolor):指定背景元素(标记为0的元素)的RGB颜色。
  • RGB=label2rgb(L,cmap,zerocolor,order):控制label2rgb如何为标签矩阵中的区域指定颜色。
  • RGB = label2rgb(___,‘OutputFormat’,outputFormat):这里的outputformat可以指定返回一个颜色列表,而不是返回RGB图像,具体的参数设置下面会讲解。

接下来对输入输出参数进行说明:

  1. L:标签图像,一般是一个非负整数矩阵,标记为0的是背景,标记为1的是第一个对象,标记为2的是第二个对象,以此类推。可以使用watershed函数或者labelmatrix函数获得一个标签矩阵。
  2. cmap:指定在生成的rgb图像中使用的颜色图。默认为‘jet’,也可以指定为MATLAB中预定义的颜色图。在这里插入图片描述
  3. zerocolor:填充标签矩阵中元素0的颜色,即背景的颜色。默认为[1 1 1]白色,也可以指定为表示RGB颜色的三元数组或者下图中所示的颜色图像缩写。在这里插入图片描述
  4. order:颜色顺序,指定为noshuffle(default)或shuffle。“noshuffle”顺序排列colormap颜色,以数字顺序标记矩阵区域。“shuffle”随机分配colormap颜色。
  5. OutputFormat:RGB中返回的RGB数据的输出格式,指定为以下之一。
    ‘image’-返回一个RGB图像。如果输入标签矩阵L的大小为M×N,则输出RGB图像的大小为M×N×3。
    ‘triplets’-返回RGB颜色列表。输出的大小是一个C-by-3矩阵,其中包含输入标签矩阵中每个C标签的RGB三元组。

label2rgb函数示例:
此例中,我们将一个灰度图像转为标签矩阵,再转为RGB图像,并改变其中的参数观察RGB图像的变化。

I=imread('rice.png');
BW=imbinarize(I);
CC=bwconncomp(BW);
L=labelmatrix(CC);
RGB=label2rgb(L);
RGB1=label2rgb(L,'spring','c','shuffle');
RGB2=label2rgb(L,'colorcube','r','shuffle');
subplot(1,3,1);imshow(RGB);
subplot(1,3,2);imshow(RGB1);
subplot(1,3,3);imshow(RGB2);

在这里插入图片描述

7 imsplit函数

此函数的作用是将多通道图像分割成单独的图像,若图像I有k个通道,则函数返回一组图像,表示各个通道的图像。用法为:

[c1,c2,c3,...,ck]=imsplit(I);

利用此函数,我们可以将RGB图像中每个通道单独提取出来并显示:

I=imread('peppers.png');
imshow(I);
[R,G,B]=imsplit(I);
montage({R,G,B},'Size',[1,3]);

在这里插入图片描述

在这里插入图片描述
可以看出,红辣椒的信号主要在红色通道。黄色和绿色辣椒在红色和绿色通道中都有信号。图中的白色物体,如前景中的大蒜,在这三个通道中都有很强的信号。

8 grayslice函数

grayslice函数和gray2ind函数功能一样,都是将灰度图像转为索引图像,但是所不同的是,grayslice函数使用的方法是多级阈值法。此函数用法为:

  • X=grayslice(I,N):既然是多级阈值法,那阈值的数量决定了这个方法的质量,其中N就是阈值的数量,它是正标量,代表用于多级阈值化的阈值总数,grayslice函数根据N的值自动计算阈值。X是输出的索引图像,大小与输入的灰度图像I相等。
  • X=grayslice(I,thresholds):在此用法中,thresholds是指定的阈值集,grayslice函数利用指定的阈值集来对灰度图像I进行多级阈值化。

下面,我们举两个例子演示一下grayslice函数的用法。
第一个例子是用指定阈值的个数来将灰度图像转化为索引图像。

I=imread('snowflakes.png');
X=grayslice(I,16); %指定阈值数量为16
imshow(I); %显示原图I
figure;
imshow(X,jet(16)); %显示X

在这里插入图片描述
在这里插入图片描述
接下来这个例子,我们指定多级阈值的值,将灰度图像转为索引图像。

I=imread('coins.png');
thresholds=[45 65 84 108 134 157 174 189 206 228]; %指定多级阈值的值
X=grayslice(I,thresholds);
m=double(max(X(:)));
imshow(X,jet(m));

在这里插入图片描述

至此,MATLAB中一些常用的图像类型转换函数就讲解完毕了,我们下节见。


http://chatgpt.dhexx.cn/article/5FEx4h6O.shtml

相关文章

黑白图转RGB(Matlab)

SamplePath1 "C:\Users\LY\Desktop\green\"; %存储图像的路径 fileExt *.bmp; %待读取图像的后缀名 %获取所有路径 files dir(fullfile(SamplePath1,fileExt)); len size(files,1); for ii1:lenfileName strcat(SamplePath1,files(ii).name);Iimread(fileNa…

【mmdeploy】mmseg转ONNX/TensorRT,附推理代码

目录 1.关于mmdeploy 2.环境安装 2.1预编译安装(Linux-x86_64, CUDA 11.x, TensorRT 8.2.3.0): 2.2预编译安装(Linux-x86_64, CUDA 11.x, ONNX): 3.mmseg工程torch转onnx 4.使用onnx模型文件进行推理…

讨论Matlab中double,im2double,mat2gray函数区别

图像类和类型间的转换 im2uint8 将输入中所有小于0的设置为0,而将输入中所有大于1的设置为255 其他的所有乘以255 im2uint16 将输入中所有小于0的设置为0,而将输入中所有大于1的设置为65535 mat2gray 把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组 im2…

Matlab中double,im2double,mat2gray函数使用方法介绍

图像类和类型间的转换 im2uint8 将输入中所有小于0的设置为0,而将输入中所有大于1的设置为255 其他的所有乘以255 im2uint16 将输入中所有小于0的设置为0,而将输入中所有大于1的设置为65535 mat2gray 把一个double类的任意数组转换成值范围在[0,1]的归一化double类数组 im2…

numpy转PIL.Image: 处理Mask图像为单通道的彩色/灰度图colormap.png

文章目录 从分割数据集说起8位彩色图8位灰度图1位二值图 什么是图像位深PNG图像格式简介如何处理Mask图像注意!!!PIL一定要手动close 防止内存泄漏PIL库相关函数 从分割数据集说起 8位彩色图 下图是 NYU数据集 里的一张Mask图像, 显示彩图,…

matlab图像类型的转换九种

在对图像进行处理时,很多时候对图像的类型有特殊的要求,例如,在对索引图像进行滤波时,必须把它转换为RGB图像,否则光对图像的下标进行滤波,得到的是毫无意义的结果。在MATLAB中,提供了许多图像类…

matlab mat2gray函数 对图像数据归一化的理解以及互转

刚好今天也有需要用三维重建中的深度数据,数据值大于255,自己用matlab可以显示出来,如果直接保存成图片数据都是1,什么都看不到,拿给别人也没有用,于是就想到用mat2gray先将数据进行归一化到(0,…

Matlab中mat2gray函数用法

目录 语法 描述 例子 将矩阵转换为图像 ​​​​​​​ mat2gray将矩阵转换为灰度图像 语法 I mat2gray(A,[amin amax]) I mat2gray(A)描述 I mat2gray(A,[amin amax]) 将矩阵转换为包含0(黑色)到1(白色)范围内的值A的灰度…

图像处理函数——mat2gray、imclose、imopen、imerode

文章目录 1.mat2gray2.imclose3.imopen4.imerode 1.mat2gray 功能: 将矩阵转换为灰度图像 用法:: l mat2gray(A, [amin amax])将矩阵A转换为灰度图像l。 [amin amax]为表示转换的阙值,A中大于amax的值将转换成1,小于amin的值将转…

mat2gray

文章目录 SyntaxDescriptionConvert a Matrix into an Image mat2gray:将矩阵转换为灰度图像 Syntax I mat2gray(A,[amin amax]) I mat2gray(A)Description I mat2gray(A,[amin amax])将矩阵A转换为强度图像I,该强…

CAN网络dbc格式

dbc 格式 是vector公司定义的私有文件格式。因vector公司在汽车领域,用者甚众,dbc成为描述can matrix,can报文格式的一种重要形式。格式标准说明,见本人上传附件。 CAN协议领域,有很多CAN协议,通用的有J19…

CAN 网络通信矩阵

CAN 网络通信矩阵 通信矩阵DBC文件DBC软件 通信矩阵 将信号、消息和网络节点的相互关系以表格形式展现,由OEM定义。 车辆网络中各节点ECU必须遵循该通讯矩阵才能完成信息的交互和共享。 网络节点:一个汽车控制器作为一个网络节点消息:一个控…

整车CAN网络介绍---CAN--PT CAN--Chassis CAN--Body CAN--Info CAN

CAN(Controller Area Network)控制器局域网络,CAN网络在早期的整车应用中以BCM(车身控制 1.整车CAN网络介绍 CAN(Controller Area Network)控制器局域网络,CAN网络在早期的整车应用中以BCM(车身控制器)为控制中心,主要是车身零部件(雨刮/大灯…

【汽车总线技术】CAN FD与CAN网络共存的解决方案

1.CAN FD发展的背景介绍 随着总线技术在汽车电子领域越来越广泛和深入的应用,特别是自动驾驶技术的迅速发展,汽车电子对总线宽度和数据传输速率的要求也越来也高,传统CAN(1MBit/s,8Bytes Payload)已难以满…

整车CAN网络基本结构

在了解can网络之前, 先了解1个问题: 什么是智能硬件与ECU ? 何为智能硬件, 就是包含智能控制单元的硬件, 比如发动机, 发动机上有一块儿专门负责控制发动机进气量, 喷油量, 排气量的控制单元, 这块单元相当于发动机的大脑. 他具有信号发送, 信号接收, 参数存储等基本功能, 这…

CAN网络应用软件设计CANoeCANFD

CAN CAN网络应用 简单案例 典型汽车网络拓扑结构 动力CAN(1) 负责车辆动力和必须实时响应的安全相关ECU接入这条CAN 底盘动态CAN(2) 负责底盘动态控制和辅助相关的功能的ECU接入到这条CAN信息CAN(3) 负责仪…

AutoSar之CAN网络管理

本文首发于微信公众号“汽车控制与人工智能”欢迎关注。 今天整理下AUTOSAR中的CAN网络管理。 ​AUTOSAR中网络管理主要使用了CAN接口(CanIf),并提供通用网络管理接口(NmIf)。CAN网络管理在CAN架构中所处的位置如图1,与其他模块的交互如图2。 图1 CAN架构 图2 网络管理和…

can 网络管理

网络管理主要功能: 是用来管理ECU是否在网络里面,不在的话请求加入,也就是ALIVE报文,要判断是否掉线,以及睡眠状态的转换机制,以及跛行状态判,也即是RING报文。 主要的实现逻辑流程&#xff1…

CAN网络管理唤醒功能

采用1043的can 芯片:工作模式 – 正常模式 – 具有 INH 输出以及本地和远程唤醒请求功能的待机模式 – 具有 INH 输出以及本地和远程唤醒请求的低功耗睡眠模式 状态切换流程图: CAN唤醒的需求: 唤醒请求(Wake Up Request) 唤醒请求可分为两种: ● 主动唤醒请求:来自模…

关于CAN网络管理状态

首先介绍一下,我是一名刚刚入职1个月的汽车网络测试工程师,目前主要是一边学习一边跟着公司前辈做一个项目,主要的内容就是进行通信、网络、诊断方面的测试。想以文字的形式记下自己学习的一些感想或者是经验之类的,达到巩固知识的…