【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) 启用或禁用抖动。
接下来我们对其中的输入输出参数进行讲解:
- RGB 输入的彩色图像,是一个m×n×3的矩阵。
- Q 最小方差量化法所用的量化颜色的数量,指定为小于65536的正整数。
- tol 均匀量化法所用的容差,指定为[0 1]内的数。
- inmap 输入的颜色图,指定为由范围 [0, 1] 内的值组成的 c×3 矩阵。inmap 的每行都是一个三元素 RGB,指定颜色图的单种颜色的红、绿和蓝分量。该颜色图最多有 65536 种颜色。
- dithering 是否执行抖动,默认为’dither’(执行抖动),也可以指定为nodither。抖动以损失空间分辨率为代价来提高颜色分辨率,如果选择 ‘nodither’,则 rgb2ind 不执行抖动,此时,函数将原始图像中的每种颜色映射到新颜色图中最接近的颜色。
- X 返回的索引图像,由非负整数组成的m×n矩阵。
- 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图像,具体的参数设置下面会讲解。
接下来对输入输出参数进行说明:
- L:标签图像,一般是一个非负整数矩阵,标记为0的是背景,标记为1的是第一个对象,标记为2的是第二个对象,以此类推。可以使用watershed函数或者labelmatrix函数获得一个标签矩阵。
- cmap:指定在生成的rgb图像中使用的颜色图。默认为‘jet’,也可以指定为MATLAB中预定义的颜色图。
- zerocolor:填充标签矩阵中元素0的颜色,即背景的颜色。默认为[1 1 1]白色,也可以指定为表示RGB颜色的三元数组或者下图中所示的颜色图像缩写。
- order:颜色顺序,指定为noshuffle(default)或shuffle。“noshuffle”顺序排列colormap颜色,以数字顺序标记矩阵区域。“shuffle”随机分配colormap颜色。
- 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中一些常用的图像类型转换函数就讲解完毕了,我们下节见。