目录
欢迎订阅FPGA/MATLAB/Simulink系列教程
1.软件版本
matlab2024b(版本2019a之后的版本基本都可以运行)
2. RGB到HSV的转换原理
RGB色彩空间基于物理三原色叠加原理,而HSV色彩空间则从视觉感知角度定义颜色。两者的转换本质是从 “物理信号表示” 到 “视觉感知描述” 的映射,核心在于通过数学运算将三原色强度值转换为符合人类视觉逻辑的色彩属性。
在RGB色彩空间中,任意颜色可表示为三维向量 (R, G, B),其中R、G、B∈[0, 1](为便于数学计算,通常将0-255的数值归一化到0-1区间)。转换为HSV时,需要计算三个分量:
色调(H):表示颜色的种类,如红色、蓝色等,取值范围通常为 [0°, 360°],对应色轮上的角度。不同颜色在色轮上的位置由三原色的相对强度决定。
饱和度(S):表示颜色的鲜艳程度,取值范围 [0, 1]。饱和度为0时表示灰色(无色彩),值越大颜色越鲜艳。
明度(V):表示颜色的明亮程度,取值范围[0, 1],反映颜色中包含的白光比例。
计算过程分为以下几个关键步骤:
确定明度(V)
明度V是RGB三通道中的最大值,反映颜色的整体亮度:V=max(R,G,B)
计算对比度(C)
对比度C表示颜色中最亮分量与最暗分量的差值,用于后续饱和度计算:C=V−min(R,G,B)
计算饱和度(S)
饱和度S的计算需考虑明度V的影响:
该公式表示,当最亮分量与最暗分量差值越大(C越大)且明度V越高时,颜色越鲜艳(S越大)。
计算色调(H)
色调H的计算最为复杂,需根据三原色的相对强度确定色轮角度:
首先定义中间变量Δ,用于后续角度计算:
根据最大值分量的不同,分三种情况计算H:
>当V=R时(红色为最亮分量)
此时,若G≥B,H对应色轮上红色到黄色再到绿色的区间;若G<B,H对应红色到品红再到蓝色的区间。
>当V=G时(绿色为最亮分量)
此时H对应绿色到青色再到蓝色的区间。
>当V=B时(蓝色为最亮分量)
3. RGB到HSV的matlab仿真测试
我们根据上述的原理,编写如下的matlab程序,同时使用matlab自带的函数rgb2hsv进行对比:
clc
clear;
close all;
warning off;
I = imread('1.jpg');
I = imresize(I,[256,256]);
HSVS = rgb2hsv(I);
figure;
subplot(1,3,1);
imshow(I,[]);
title('彩色图');
subplot(1,3,2);
imshow(HSVS,[]);
title('MATLAB自带函数转换的HSV图');
rgbImg=I;
% 确保输入为double类型并归一化到[0,1]
if ~isa(rgbImg, 'double')
rgbImg = im2double(rgbImg);
end
% 提取RGB分量
r = rgbImg(:,:,1);
g = rgbImg(:,:,2);
b = rgbImg(:,:,3);
% 获取图像尺寸
[m, n, ~] = size(rgbImg);
% 初始化HSV图像
hsvImg = zeros(m, n, 3, 'double');
h = hsvImg(:,:,1);
s = hsvImg(:,:,2);
v = hsvImg(:,:,3);
% 计算明度V
v = max(max(r, g), b);
% 计算对比度C和最小值min_rgb
min_rgb = min(min(r, g), b);
c = v - min_rgb;
% 计算饱和度S
% 处理V=0的情况(黑色,饱和度为0)
s = zeros(size(v));
nonBlack = v > 0;
s(nonBlack) = c(nonBlack) ./ v(nonBlack);
% 计算色调H
% 初始化H为0
h = zeros(size(v));
% 处理不同的最大值情况
% 情况1: 最大值为R
maskR = (v == r) & nonBlack;
if any(maskR(:))
delta = c(maskR);
h(maskR) = 60 * ((g(maskR) - b(maskR)) ./ delta);
end
% 情况2: 最大值为G
maskG = (v == g) & nonBlack;
if any(maskG(:))
delta = c(maskG);
h(maskG) = 120 + 60 * ((b(maskG) - r(maskG)) ./ delta);
end
% 情况3: 最大值为B
maskB = (v == b) & nonBlack;
if any(maskB(:))
delta = c(maskB);
h(maskB) = 240 + 60 * ((r(maskB) - g(maskB)) ./ delta);
end
% 处理H为负数的情况
h(h < 0) = h(h < 0) + 360;
% 组合HSV图像
hsvImg(:,:,1) = h;
hsvImg(:,:,2) = s;
hsvImg(:,:,3) = v;
subplot(1,3,3);
imshow(HSVS,[]);
title('根据公式转换的HSV图');
这里,我们使用的测试图片为:
然后运行之后如下:
可以看到,通过公式生成的HSV格式的图片与matlab自带的rgb2hsv的效果一样。
4. 总结
从几何角度看,RGB 色彩空间是三维笛卡尔坐标系中的立方体,三个轴分别对应 R、G、B 分量;而 HSV 色彩空间可视为圆柱体模型:
圆柱体中轴线(V 轴)表示明度,从底部 V=0(黑色)到顶部 V=1(白色);
圆柱横截面的圆周表示色调H,360° 环绕对应不同颜色;
从圆心到圆周的距离表示饱和度S,圆心处S=0(灰色),圆周处S=1(纯色)。
这种模型更符合人类对颜色的感知方式:人类视觉对明度的敏感度高于对色调和饱和度的敏感度,且色调的感知具有周期性(如红色和紫色在色轮上相邻)。