由RGB到HSV的转换详解
1RGB色彩空间
在图像处理中,最常见的就是RGB色彩模型。在RGB模型中,每种颜色出现在红、绿、蓝的原色光谱分量中。该模型基于笛卡尔坐标系。如图1所示,RGB原色值位于3个角上;二次色青色,深红色和黄色位于另外三个角上,黑色位于原点处,白色位于里原点最远的角上。
图1 RGB色彩模型
图1左 RGB彩色立方体示意图。图1右,RGB 24bit彩色立方体。原点到白色顶点的中轴线是灰度线,r、g、b三分量相等,强度可以由三分量的向量表示。
用RGB来理解色彩、深浅、明暗变化:
色彩变化:三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
深浅变化:RGB顶点和CMY顶点到原点和白色顶点的中轴线的距离
明暗变化:中轴线的点的位置,到原点,就偏暗,到白色顶点就偏亮
光学的分析
三原色RGB混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。
只能说将三原色光以不同的比例复合后,对人的眼睛可以形成与各种频率的可见光等效的色觉。
2 HSV色彩空间
HSV色彩空间如图2所示圆锥体。色度表示圆锥角。HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
图2 HSV色彩模型
3 RGB色彩空间转HSV
4 HSV在图像处理应用
HSV在用于指定颜色分割时,有比较大的作用。
H和S分量代表了色彩信息。
分割应用:
用H和S分量来表示颜色距离,颜色距离指代表两种颜色之间的数值差异。
Androutsos等人通过实验对HSV颜色空间进行了大致划分,亮度大于75%并且饱和度大于20%为亮彩色区域,亮度小于25%为黑色区域,亮度大于75%并且饱和度小于20%为白色区域,其他为彩色区域。
对于不同的彩色区域,混合H与S变量,划定阈值,即可进行简单的分割。
5 matlab实现RGB转HSV
clear
clc
close all
img = imread('1.bmp');
figure, imshow(img), title('RGB image')
img = im2double(img);
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
imgsize = size(img);
row = imgsize(1);
column = imgsize(2);
%%Calculation Of V
for i=1:1:row
for j=1:1:column
maxMatrix(i,j) =max(max(R(i,j),G(i,j)),B(i,j));
minMatrix(i,j) =min(min(R(i,j),G(i,j)),B(i,j));
end
end
V = maxMatrix;
figure, imshow(V), title('V image without using rbg2hsv ')
%% Calculation Of S
for i=1:1:row
for j=1:1:column
if V(i,j) == 0
S(i,j) = 0;
else
S(i,j) = (maxMatrix(i,j)-minMatrix(i,j)) / maxMatrix(i,j);
end
end
end
figure, imshow(S), title('S image without using rgb2hsv ')
%% Calculation Of H
for i=1:1:row
for j=1:1:column
if maxMatrix(i,j) == R(i,j)
H(i,j) = (1/6)*(0 + ((G(i,j) -B(i,j)) / (maxMatrix(i,j)-minMatrix(i,j))));
elseif maxMatrix(i,j) == G(i,j)
H(i,j) = (1/6)*(2 + ((B(i,j) -R(i,j)) / (maxMatrix(i,j)-minMatrix(i,j))));
elseif maxMatrix(i,j) == B(i,j)
H(i,j) = (1/6)*(4 + ((R(i,j) -G(i,j)) / (maxMatrix(i,j)-minMatrix(i,j))));
end
if H(i,j) < 0
H(i,j) = H(i,j) + 360;
end
end
end
figure, imshow(H), title('H image without using rgb2hsv ')
HSV = cat(3,H,S,V);
figure, imshow(HSV), title('HSV image without using rgb2hsv ')
实验原图
V分量
S分量
H分量
HSV图像(RGB转换后)
相关文章