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


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中一些常用的图像类型转换函数就讲解完毕了,我们下节见。

图像处理工具箱\@uint8\Contents.m ..............\......\contourc.m ..............\......\contours.m ..............\......\dct2.m ..............\......\idct2.m ..............\applylut.c ..............\applylut.dll ..............\applylut.m ..............\ball1.gif ..............\bestblk.m ..............\blkproc.m ..............\bmpread.m ..............\bmpwrite.m ..............\bwarea.m ..............\bweuler.m ..............\bwfill.m ..............\bwlabel.m ..............\bwmorph.m ..............\bwperim.m ..............\bwselect.m ..............\cmgamdef.m ..............\cmgamma.m ..............\cmpermute.m ..............\cmunique.m ..............\col2im.m ..............\colfilt.m ..............\Contents.m ..............\convmtx2.m ..............\corr2.m ..............\dct2.m ..............\dctmtx.m ..............\dctmtx2.m ..............\dilate.m ..............\dither.m ..............\edge.m ..............\erode.m ..............\freqz2.m ..............\fsamp2.m ..............\fspecial.m ..............\ftrans2.m ..............\fwind1.m ..............\fwind2.m ..............\getimage.m ..............\getline.m ..............\getpts.m ..............\getrect.m ..............\gifread.m ..............\gifwrite.m ..............\gray2ind.m ..............\grayslice.m ..............\hdfpeek.m ..............\hdfread.m ..............\hdfwrite.m ..............\histeq.m ..............\idct2.m ..............\im2bw.m ..............\im2col.m ..............\im2double.m ..............\im2uint8.m ..............\imadjust.m ..............\imapprox.m ..............\imcontour.m ..............\imcrop.m ..............\imfeature.m ..............\imhist.m ..............\immovie.m ..............\imnoise.m ..............\impixel.m ..............\improfile.m ..............\imresize.m ..............\imrotate.m ..............\imshow.m ..............\imslice.m
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值