MATLAB 将RGB颜色空间转为HSI颜色空间、LAB颜色空间 原理及程序

这篇博客介绍了HSI和CIE-Lab两种颜色空间,以及它们与RGB模型的关系。HSI模型更符合人类视觉感知,其中H表示色调,S表示饱和度,I表示亮度。CIE-Lab颜色空间是一种设备无关的模型,L代表亮度,a和b分别代表色彩的绿红和蓝黄分量。文中还提供了RGB到HSI和Lab的转换公式,并展示了图像通道提取的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一张彩色图像是由R、G、B三个通道组成,所以首先需要将彩色图像分为三个通道的图像。
原图以下是对猫图进行单通道提取得到的图像。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

HSI颜色空间

HSI[Hue-Saturation-Intensity(Lightness),HSI或HSL]颜色模型用H、S、I三参数描述颜色特性,其中H定义颜色的频率,称为色调;S表示颜色的深浅程度,称为饱和度;I表示强度或亮度。
当人观察一个彩色物体时,用色调、饱和度、亮度来描述物体的颜色。色调是描述纯色的属性(纯黄色、橘黄或者红色);饱和度给出一种纯色被白光稀释的程度的度量;亮度是一个主观的描述,实际上,它是不可以测量的,体现了无色的强度概念,并且是描述彩色感觉的关键参数。而强度(灰度)是单色图像最有用的描述子,这个量是可以测量且很容易解释。则将提出的这个模型称作为HSI(色调、饱和度、强度)彩色模型,该模型可在彩色图像中从携带的彩色信息(色调和饱和度)里消去强度分量的影响,使得HSI模型成为开发基于彩色描述的图像处理方法的良好工具,而这种彩色描述对人来说是自然而直观的。
HSI模型是美国色彩学家孟塞尔(H.A.Munseu)于1915年提出的,它反映了人的视觉系统感知彩色的方式,以色调、饱和度和强度三种基本特征量来感知颜色。
HSI模型与RGB模型关系
彩色图像可以采用RGB或HSI等颜色模型来描述,它们之间存在着严格的数学关系,可以相互转换。实际应用时,应该根据需要选择适当的颜色模型。
HSI颜色模型中的H分量是确定颜色的主要因素,当它发生变化时色调值也将变化;S分量越大(接近1),颜色越纯,S分量越小(接近0),颜色越接近纯灰色。由此可见,与RGB颜色模型相比,HSI颜色模型比较符合人眼对景物颜色的感知。
RGB模型与HSI模型比较
HSI模型与RGB模型转换关系

给定一幅RGB彩色格式图像,每个RGB像素的H分量可用下式得到:
在这里插入图片描述
其中,
在这里插入图片描述
饱和度分量由下式给出:

在这里插入图片描述
最后,亮度分量由下式给出:
在这里插入图片描述

采用上式将RGB图像转为HSI图像
在这里插入图片描述

四、 CIE-Lab颜色空间

同RGB颜色空间相比Lab是一种不常用的色彩空间。它是在1931年国际照明委员会(CIE)制定的颜色度量国际标准的基础上建立起来的。1976年,经修改后被正式命名为CIELab。它是一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。Lab颜色空间中的L分量用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;a表示从红色到绿色的范围,取值范围是[127,-128];b表示从黄色到蓝色的范围,取值范围是[127,-128]。下图所示为Lab颜色空间的图示;

在这里插入图片描述
RGB转Lab颜色空间

RGB颜色空间不能直接转换为Lab颜色空间,需要借助XYZ颜色空间,把RGB颜色空间转换到XYZ颜色空间,之后再把XYZ颜色空间转换到Lab颜色空间。
(1) RGB到XYZ颜色空间有如下关系:
在这里插入图片描述

仔细观察式(1.7),其中在这里插入图片描述
各系数相加之和为0.950456,非常接近于1,我们知道R/G/B的取值范围为[ 0,255 ],如果系数和等于1,则X的取值范围也必然在[ 0,255 ]之间,因此我们可以考虑等比修改各系数,使其之和等于1,这样就做到了XYZ和RGB在同等范围的映射。这也就是为什么代码里X,Y,Z会分别除以0.950456、1.0、1.088754。
(2) XYZ颜色空间到Lab颜色空间的转换
在这里插入图片描述
上面两个公式中,L*,a*,b*是最终的LAB色彩空间三个通道的值。X,Y,Z是RGB转XYZ后计算出来的值,Xn,Yn,Zn一般默认是95.047,100.0,108.883。
在这里插入图片描述上图展示了将原图转换到Lab色彩空间后,单通道结果。从左到右依次是L通道、a通道、b通道。其中L通道代表亮度通道,L单通道图像与gray图像结果相似。a通道在深绿部分的值最低,洋红部分值最高。

主程序

path='D:\cat.jpg';
%% RGB
I=imread(path);
figure();
subplot(231);
imshow(I);%显示原始彩色图像title('原始图像');
gray = rgb2gray(I);
r = I(:,:,1);  %通道R
g = I(:,:,2);  %通道G
b = I(:,:,3);  %通道B
% figure();
subplot(232);
imshow(r);title('r');
% figure();
subplot(233);
imshow(g);title('g');
% figure();
subplot(234);
imshow(b);title('b');
%%  HSI颜色空间
iHsi=rgb2hsi(I);
figure();
hsi_H=iHsi(:,:,1);  %色调
hsi_S=iHsi(:,:,2);  %饱和度
hsi_I=iHsi(:,:,3);  %亮度
subplot(131);imshow(hsi_H);title('H(色调)');
subplot(132);imshow(hsi_S);title('S(饱和度)');
subplot(133);imshow(hsi_I);title('I(亮度)');
%%  CIE颜色空间
iLab = RGB2Lab(I);
L=iLab(:,:,1);  %色调
a=iLab(:,:,2);  %饱和度 
b=iLab(:,:,3);  %亮度
figure();
subplot(131);imshow(L,[]);title('L(亮度)');
subplot(132);imshow(a,[]);title('a(深绿-洋红)');
subplot(133);imshow(b,[]);title('b(袅蓝-焦黄)');

rgb转hsi程序

function [hsi] = rgb2hsi(rgb)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
rgb=im2double(rgb);
r=rgb(:,:,1);
g=rgb(:,:,2);
b=rgb(:,:,3);

%   H 单位弧度
num=0.5*((r-g)+(r-b));
den=sqrt( (r-g).^2 + (r-b).*(g-b) );
theta=acos(num./(den+eps)); %分母+eps防止为0  acos得到的是弧度
H0=theta.*(g>=b);   %G>=B
H1=(2*pi-theta).*(g<b);  %G<B
H=H0+H1;
% %转成角度
% H=H.*360./(2*pi);

%   S
num=3.*min(min(r,g),b);
S=1-num./(r+g+b+eps);

%   I
I=(r+g+b)/3;

H=(H-min(min(H)))./(max(max(H))-min(min(H)));
S=(S-min(min(S)))./(max(max(S))-min(min(S)));

hsi=cat(3,H,S,I);

end


rgb转lab程序

function [Lab] = RGB2Lab(img)
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
if nargin == 1     %nargin:输入参数的个数
    img=im2double(img);
    R=img(:,:,1);
    G=img(:,:,2);
    B=img(:,:,3);
end
% if nargin == 1
%     R = double(img(:,:,1));
%     G = double(img(:,:,2));
%     B = double(img(:,:,3));
%   
% end
% 
% if max(max(R)) > 1.0 || max(max(G)) > 1.0 || max(max(B)) > 1.0
%   R = double(R) / 255;
%   G = double(G) / 255;
%   B = double(B) / 255;
% end

% Set a threshold
T = 0.008856;   %6/29^3

[M, N] = size(R);
s = M * N;
RGB = [reshape(R,1,s); reshape(G,1,s); reshape(B,1,s)];

% RGB to XYZ
MAT = [0.412453 0.357580 0.180423;
       0.212671 0.715160 0.072169;
       0.019334 0.119193 0.950227];
XYZ = MAT * RGB;

% Normalize for D65 white point
%   调整x y z的取值范围在[0,255]
X = XYZ(1,:) / 0.950456;
Y = XYZ(2,:);
Z = XYZ(3,:) / 1.088754;

XT = X > T;
YT = Y > T;
ZT = Z > T;

Y3 = Y.^(1/3); 

% 网络上说要除以Xn Yn Zn,但是除了以后范围跑了
% X=X./95.047;
% Y=Y./100.0;
% Z=Z./108.883;

% ~XT:举证0 1 取反
fX = XT .* X.^(1/3) + (~XT) .* (7.787 .* X + 4/29);
fY = YT .* Y.^(1/3) + (~YT) .* (7.787 .* Y + 4/29);
fZ = ZT .* Z.^(1/3) + (~ZT) .* (7.787 .* Z + 4/29);

% L = reshape(YT .* (116 * Y3 - 16.0) + (~YT) .* (903.3 * Y), M, N);
L = reshape( 116 * fY - 16.0, M, N);
a = reshape(500 * (fX - fY), M, N);
b = reshape(200 * (fY - fZ), M, N);

if nargout < 2      %nargout:输出参数的个数
  Lab = cat(3,L,a,b);
  % 结果归一化到0-1
  Lab=Lab./255;
end

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值