一幅 RGB 图像就是 M×N×3 大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置 的彩色图像所对应的红、绿、蓝三个分量。RGB 图像也可以看做由三个灰度图像形成的“堆栈”,当发 送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。 按照惯例,形成一幅 RGB 彩色图 像的三幅图像通常被称作红、绿、蓝分量图像。
分量图像的数据类决定了它们的取值范围。如果一幅 RGB 图像的数据类是 double,那么取值范围 就是 [0,1]。类似的,对于 uint8 类或 uint16 类的 RGB 图像,取值范围分别是[0,255]或[0,65535]。
用来表示这些分量图像像素值的比特数决定了一幅 RGB 图像的比特深度。
例如,如果每个分量图像都是 8 比特的图像,那么对应的 RGB 图像的深度就是 24 比特。通常, 所有分量图像的比特数都是相同的。在这种情况下,一幅 RGB 图像可能有的色彩数就是(2b)3,其中的 b 就是每个分量图像的比特数。对于 8 比特图像,颜色数为 (28)3即16777216。 令 fR 、 fG 和 fB 分别表示三幅 RGB 分量图像。RGB 图像就是利用 cat(连接)操作将这些分量图像 组合而成的彩色图像:
rab_image = cat(3, fR, fG , fB)
在运算中,图像按顺序放置。通常,cat(dim,A1,A2…)沿着由 dim 指定的方式连接数组 (它们必须 是相同尺寸)。
例如,如果 dim=1,数组就垂直安排;如果 dim=2,数组就水平安排; 如果 dim=3,数组 就按照三维方式堆叠。 如果所有的分量图像都是一样的,那么结果是一幅灰度图像。 令 rgb_image 表示一幅 RGB 图像,下面这些命令可以提取出三个分量图像:
fR = rgb_image(: , : , 1);
fG = rgb_image(: , : , 2);
fB = rgb_image(: , : , 3);
RGB 彩色空间常常用 RGB 彩色立方体加以显示,这个立方体的顶点是光的原色(红、绿、蓝)和二 次色(青色、紫红色、黄色)。
HSI 色彩空间是从人的视觉系统出发,直接用颜色三要素:色调(Hue)、饱和度(Saturation 或 Chroma) 和亮度 (Intensity 或 Brightness)来描述色彩。
H——表示颜色的相位角,是彩色最重要的属性,决定颜色的本质。红、绿、蓝分别相隔 120 度;互 补色分别相差 180 度,即颜色的类别。
S——表示颜色的深浅程度,饱和度越高,颜色越深。与白色的比例有关,白色比例越多,饱和度越 低。
I——表示色彩的明亮程度,人眼对亮度很敏感。 两个特点:
这里色度由某颜色点和强度轴连线与红颜色轴间的角度表示。反映了该颜色最接近红光的程度,或 者其波长与红光谱波长间的差。因此,0°为红色,120°为绿色,240°为蓝色。
可以看到 HSI 色彩空间和 RGB 色彩空间只是同一物理量的不同表示法,因而它们之间存在着转换 关系:HSI 颜色模式中的色调使用颜色类别表示,饱和度与颜色的白光光亮亮度刚好成反比,代表灰色 与色调的比例,亮度是颜色的相对明暗程度。
由于人的视觉对亮度的敏感程度远强于对颜色浓淡的敏感程度,为了便于颜色处理和识别,人的市 局系统经常采用 HSI 彩色空间,它比 RGB 空间更符合人的视觉特性。此外,由于 HSI 空间中亮度和色度 具有可分离性,使得图像处理和机器视觉中大量灰度处理算法都可在 HSI 空间方便进行。笔者此前做过 一个矫正人脸图像偏光的小项目,用到的某算法的关键一步即是在 HSI 空间中进行亮度矫正。
应用:可以用于偏光矫正、去除阴影、图像分割等。
RGB 向HSI 模型的转换是由一个基于笛卡尔直角坐标系的单位立方体向基于圆柱极坐标的双锥体的 转换。
基本要求是将 RGB 中的亮度因素分离,将色度分解为色调和饱和度,并用角向量表示色调,如图 4 所示。
RGB 转换至 HSI 的几种常见方法,下图列出几种常用的 RGB-HSI 转换公式:
每个 RGB 像素的 H 分量可用下面的公式得到:
将从 H 的公式中得出的所有结果除以 360°,即可将色调归一化在[0,1]之间。 如果给出的 RGB 值在 [0,1]之间,那么其他的两个 HSI 分量就已经在[0,1]之间了。
下面是惯用的函数:
hsi = rgb2hsi(rgb)
编写代码:
rgb_image=imread('D:\matlab r2019a\bin\数字图像处理 matlab 版\MATLAB 课本各章图片(冈萨雷 斯)\dipum_images_ch06\Fig0604(a)(iris).tif');
hsi_image = rgb2hsi(rgb_image)
subplot(1, 2, 1), imshow(rgb_image);title('(a)输入的 RGB 图像');
subplot(1, 2, 2), imshow(hsi_image);title('(b)RGB 空间图像转换为 HIS 图像');
有三个感兴趣的部分,正如早些时候提到的那样,分别对应原色之间相隔 120° 的范围。用 360° 乘以 H,这样就将色调的值还原成了原来的范围——[0°,360°].
编写代码:
rgb_image=imread('D:\matlab r2019a\bin\数字图像处理 matlab 版\MATLAB 课本各章图片(冈萨雷 斯)\dipum_images_ch06\Fig0604(a)(iris).tif'); hsi_image = rgb2hsi(rgb_image);
j = hsi2rgb(hsi_image);
subplot(1, 3, 1), imshow(rgb_image);title('(a)输入的 RGB 图像');
subplot(1, 3, 2), imshow(hsi_image);title('(b)RGB 空间图像转换为 HIS 图像');
subplot(1, 3, 3), imshow(j);title('(c)HIS 图像转换为 RGB 空间图像');
代码运行效果如下:
MATLAB 程序:
h = input('Adjust hue by: '); % 输入色度调整参数 h
s = input('Adjust saturation by: '); % 输入饱和度调整参数 s
i = input('Adjust intensity by: '); % 输入强度调整参数 i
rgb_img= imread('D:\matlab r2019a\bin\数字图像处理matlab版\MATLAB课本各章图片(冈 萨雷斯)\dipum_images_ch05\girl.jpg'); % 读取源图像并显示
figure(1);
subplot(231);imshow(rgb_img);title('1:原图像'); % HSI 颜色空间处理
hsi_image = rgb2hsi(rgb_img); % 将 rgb 颜色空间转换为 hsi 颜色空间
hue = hsi_image(:,:,1); % 提取色度通道
sat = hsi_image(:,:,2); % 提取饱和度通道
int = hsi_image(:,:,3); % 提取明度通道
hue = hue + 1 / 360 * h; % 对各通道进行处理
sat = sat + 0.01 * s;
int = int + 0.01 * i;
%hue(hue>1)=hue(hue>1) - 1; hue(hue<0)=1 - hue(hue<0);
hue(hue>1)=1; hue(hue<0)=0;
sat(sat>1)=1; sat(sat<0)=0;
int(int>1)=1; int(int<0)=0;
subplot(232);imshow(hue,[ ]);title('2:色度分量图');%画出色度分量图
subplot(233);imshow(sat,[ ]);title('3:饱和度分量图');%画出饱和度分量图
subplot(234);imshow(int,[ ]);title('4:亮度分量图');%画出亮度分量图
gray_img= rgb2gray(rgb_img);
subplot(235);imshow(gray_img,[ ]);title('5:灰度图');%画出灰度图
hsi_image(:,:,1) = hue; % 运算后的各通道返回原图
hsi_image(:,:,2) = sat;
hsi_image(:,:,3) = int;
rgb = hsi2rgb(hsi_image); % 将 hsi 颜色空间转换为 rgb 颜色空间,并显示
imwrite(rgb,'hsi 颜色空间转换后的图像.jpg')%储存图像
subplot(236);imshow(rgb);title('6:hsi 颜色空间转换后的图像');
①当色度分量调整参数为 0 时: 运行界面:
实验结果显示:
②当色度分量调整参数为 30 时:HSI 为接近红绿中间
③当色度分量调整参数为 120 时:HSI 为绿色
④当色度分量为 240 时:HSI 为蓝色
实验采用了灵活输入参数的方法,将色调调整参数设置为 30 其余设置为 0 的时候即可实现实验的要 求。实验中用到的主要函数有:imread 函数读取图像;imwrite 函数写入图像; rgb2hsi 函数将 RGB 图 像转换为 HSI 图像;hsi2rgb 函数将 HSI 转换为 RGB 图像;