【Matlab 图像】HSV 色彩空间分析

本文详细介绍了HSV色彩空间,包括色调、饱和度和明度的概念,并阐述了RGB到HSV的转换方法。通过Matlab代码示例,展示了如何提取图像中的黄色和黄瓜,以及基于RGB空间的颜色提取。这些技术在图像分析和颜色识别领域具有广泛应用。

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

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)


### MATLABHSV 颜色空间转换和操作 #### RGB 到 HSV 的转换 在 MATLAB 中,可以使用 `rgb2hsv` 函数将 RGB 图像转换为 HSV 颜色空间。此函数接受一个 M×N×3 数组作为输入,并返回相同大小的数组,其中每个像素表示对应的 HSV 值。 ```matlab % 将RGB图像转为HSV hsv_img = rgb2hsv(rgb_img); ``` 通过上述代码片段可完成从 RGB 至 HSV 色彩模型间的变换[^1]。 #### 显示 HSV 各通道 为了更好地理解 HSV 图像中的各个分量,可以通过绘制不同子图来展示这些信息: ```matlab figure; subplot(221), imshow(rgb_img), title('原始RGB'); subplot(222), imshow(hsv_img(:,:,1), []), title('色相H(归一化值)'); subplot(223), imshow(hsv_img(:,:,2), []), title('饱和度S'); subplot(224), imshow(hsv_img(:,:,3), []), title('明度V'); ``` 这段脚本会创建一个新的图形窗口,并分别显示原图以及经过转换后的三个独立HSV组件图像。 #### 对 HSV 数据的操作 一旦获得了 HSV 表达形式的数据,则可以根据需求对其进行调整再变换成其他格式。例如增加图片整体的颜色鲜艳程度即提高其饱和度水平: ```matlab % 修改饱和度并转回RGB hsv_mod = hsv_img; hsv_mod(:,:,2) = min(hsv_mod(:,:,2) * 1.5, 1); % 安全地增强饱和度不超过最大界限 rgb_mod = hsv2rgb(hsv_mod); figure; imshowpair(rgb_img, rgb_mod, 'montage'), title('原图 vs 增强饱和度'); ``` 这里先复制了一份原有的 HSV 彩色数据副本用于后续修改;接着针对第二维也就是 S 维进行了线性放大处理但保持数值范围合理合法;最后利用 `hsv2rgb()` 方法反向映射得到新的 RGB 结果以便直观对比效果差异。 #### 创建颜色阈值 当涉及到特定应用场景比如目标检测时,可能需要基于某种颜色特征建立二元掩码。对于 HSV 来说就是定义好合适的区间边界从而筛选出符合条件的对象区域: ```matlab lower_bound = [0/360, 0.3, 0.2]; % 设定下界(HSV) upper_bound = [60/360, 0.7, 0.8]; % 上界(HSV) mask = all(bsxfun(@le, lower_bound(:)', permute(hsv_img,[3 1 2])), 1) & ... all(bsxfun(@ge, upper_bound(:)', permute(hsv_img,[3 1 2])), 1); result_image = mask .* uint8(cat(3,ones(size(mask)), zeros(size(mask)), zeros(size(mask)))); imshow(result_image); title('应用颜色阈值得到的结果') ``` 以上代码实现了对给定 HSV 区间内的所有像素点标记出来形成蒙板,并进一步可视化该部分所覆盖的内容[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值