该函数将真彩色图像转换为索引图像, 由于RGB图像一个像素占用三个字节, 分别存储R、G、B分量的值,而索引图像一个像素占用一个字节。在将灰度图像转换为索引图像时, 是从3个字节映射到一个字节的关系。 通常有以下两种算法:
- Gray = (R + G + B) / 3,即求得R、G、B三个分量平均值作为索引图像中对应像素点的像素值。
- Gray = min(R, G, B),即以R、G、B三个中最小分量作为索引图像对应像素点的像素值。
但是,这个方法对于Gamma校正的图片(平常所见到的24位真彩色图片均为Gamma校正的图片)并不适用,因为Gamma校正后的分量值不是物理上的功率,不能直接相加,因此,提出一种改进的算法来纠正这一问题。
注意这里的2.2次方和2.2次方根,RGB颜色值不能简单直接相加,而是必须用2.2次方换算成物理光功率。因为RGB值与功率并非简单的线性关系,而是幂函数关系,这个函数的指数称为Gamma值,一般为2.2,而这个换算过程,称为Gamma校正。
真彩色
16位一般叫高彩色,一般称之64K色, 一共有2^16 = 64*1024 = 65536种色彩
24位真彩色:一共有2^24= 16 777 216,种色彩,也就是1600万色.
32位真彩色,并不是2^32种颜色,而是24位真彩色(1600万色)加上8位的透明度,让显示更好,更接近自然的色彩.
调用格式:
- [X,map] = rgb2ind(RGB, n)
使用第二种算法把真彩色图像转换为索引图像,其中n指定map中颜色项数(表示有几种颜色,比如n=2,那就只有两种颜色构成了一张图片,但并非二值图像), n最大不能超过65536。返回值中map即索引图像的调色板,map里储存的是颜色索引,是一张各个数字对应颜色的表格。如果bmp文件是真彩色或灰度的,就不需要色表,得到的X是二维或三维的矩阵,数值介于0到255之间。如果是索引格式的(如256色、16色等等)就有这样一张表格,X是一个二维矩阵,数值介于0-255或0-15之间,显示图像时需要色表才能正确对应颜色。
- X = rgb2ind(RGB, map)
使用调色板map将真彩色图像转换为索引图像,即在调色板中找到与真彩色图像颜色值最接近的颜色作为转换后的索引图像的像素值。map中颜色项数(即size(map, 1))不能超过65536。
- [X,map] = rgb2ind(RGB, tol)
利用第一种算法把真彩色图像转换为索引图像, map中最多包含(floor(1/tol)+1)^3种颜色, tol必须是介于0.0和1.0之间的数。
- [...] = rgb2ind(..., dither_option)
其中dither_option用于开启/关闭dither, dither_option可以是'dither'(默认值)或'nodither'。
相关函数: ind2gray, mat2gray, ntsc2rgb, rgb2ind, rgb2ntsc
程序示例
% 1. 显示RGB真彩色
imgrgb = imread('flower.jpg');
figure('Name', '显示真彩色图像')
imshow(imgrgb)
% 2. 显示灰度图像
imggray = rgb2gray(imgrgb);
figure('Name', '显示灰度图像')
imshow(imggray)
% 3. 显示索引图像
[imgind, map] = rgb2ind(imgrgb, 10);
figure('Name', '显示索引图像')
imshow(imgind, map)
RGB=imread('football.jpg');
[X1,map1]=rgb2ind(RGB,64);
[X2,map2]=rgb2ind(RGB,0.2);
map3=colorcube(256);
X3=rgb2ind(RGB,map3);
figure;
subplot(131);imshow(X1,map1);
subplot(132);imshow(X2,map2);
subplot(133);imshow(X3,map3);