【教程4>第9章>第2节】通过FPGA实现RGB图像转换为HSV图像——MATLAB仿真测试

目录

1.软件版本

2. RGB到HSV的转换原理

3. RGB到HSV的matlab仿真测试

4. 总结


欢迎订阅FPGA/MATLAB/Simulink系列教程

《★教程1:matlab入门100例》

《★教程2:fpga入门100例》

《★教程3:simulink入门60例》

《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》

《★专题3:人工智能基础应用研究》

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(纯色)。

       这种模型更符合人类对颜色的感知方式:人类视觉对明度的敏感度高于对色调和饱和度的敏感度,且色调的感知具有周期性(如红色和紫色在色轮上相邻)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值