1. HSV 色彩空间

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。

RGB和CMY颜色模型都是面向硬件的,而 HSV(Hue Saturation Value)颜色模型是面向用户的。

1.1 色调(Hue)

用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;

1.2 饱和度(Saturation)

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

纯度S为一比例值,范围从0到1,它表示成所选颜色的纯度和该颜色最大的纯度之间的比率。S=0时,只有灰度。

1.3 明度(Value)

明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

V表示色彩的明亮程度,范围从0到1。有一点要注意:它和光强度之间并没有直接的联系。

在这里插入图片描述

From: HSV (HSV颜色模型)-百度百科

2. 色彩空间转换

RGB 色彩空间模型如下:
在这里插入图片描述

HSV 色彩空间模型如下:
在这里插入图片描述

2.1 Matlab 指令

ImgHSV = rgb2hsv(ImgRGB);
ImgRGB = hsv2rgb(ImgHSV);

2.2 对应转换公式

在这里插入图片描述
From: RGB模型转换到hsv原理及其opencv实现代码

在这里插入图片描述

From: Python3 识别判断图片主要颜色,提取指定颜色的方法

3. 示例:提取图片中的黄色

3.1 示例代码:

flag_hsv = rgb2hsv(frame);              % 将图像的 rgb 色彩空间转化至 hsv 色彩空间
flag_new = 255*ones(size(frame));       % 创建一个白色图像,将特定颜色提取到此处
flag_new_hsv = rgb2hsv(flag_new);       % 将白色图像也转换至hsv色彩空间

% 找出图像中黄色的像素
[row, col] = ind2sub( size(flag_hsv),...
    find( flag_hsv(:,:,1)>(16/180) & flag_hsv(:,:,1)< (34/180)...
    & flag_hsv(:,:,2)>0.16 & flag_hsv(:,:,3)>0.48 ) );

% 将图像中的黄色像素复制到刚才新建的白色图像中
for i = 1 : length(row)
    flag_new_hsv(row(i),col(i),:) = flag_hsv(row(i),col(i),:);
end

flag_yellow = hsv2rgb(flag_new_hsv);     % 将提取出来的黄色,转化至rgb空间,进行展示

3.2 代码效果:

From: 使用MATLAB提取图片中特定颜色

4. 示例:根据颜色提取黄瓜

From: matlab-对图像进行特定部分提取并得到rgb三原色(matlab实现)

5. 示例:基于RGB空间的颜色提取

From: RGB图像中特定颜色的提取

2020-11-21 更新程序 (Matlab版)

% Function : 提取图像中的黄色
% ParamsIn : ImgIn
% ParamsOut: ImgOut
% Date     : 2020-11-21
% Author   : JC

% 可以更改 HSV 通道的取值范围,达到检测其他颜色的目的

function ImgOut = ExtractYello(ImgIn)

ImgRGB = ImgIn;
ImgHSV = rgb2hsv(ImgRGB);

% 提取图像中黄色部分,得到只有黄色部分的图
ImgNewRGB = 255*ones(size(ImgRGB));         % 创建一个白色图像,将特定颜色提取到此处
ImgNewHSV = rgb2hsv(ImgNewRGB);             % 将白色图像也转换至hsv色彩空间

[row, col] = ind2sub( size(ImgHSV),...      % 找出图像中黄色的像素
    find( ImgHSV(:,:,1)>(35/360) & ImgHSV(:,:,1)< (61/360)...
    & ImgHSV(:,:,2)>0.16 & ImgHSV(:,:,3)>0.48 ) );

for i = 1 : length(row)                     % 将图像中的黄色像素复制到刚才新建的白色图像中
    ImgNewHSV(row(i),col(i),:) = ImgHSV(row(i),col(i),:);
end

ImgNewRGB = hsv2rgb(ImgNewHSV);     % 将提取出来的黄色,转化至rgb空间,进行展示

ImgOut = ImgNewRGB;

Ref: 色彩空間(RGB, HSV, LAB, YUV)