数字图像处理:RGB与HSV颜色空间转换详解及MATLAB实现
创作时间:
作者:
@小白创作中心
数字图像处理:RGB与HSV颜色空间转换详解及MATLAB实现
引用
CSDN
1.
https://blog.csdn.net/2301_80417284/article/details/144295437
RGB与HSV是数字图像处理中常用的两种颜色空间模型。RGB模型基于红、绿、蓝三种基本颜色的线性叠加来表示颜色,而HSV模型则通过色调、饱和度和亮度三个维度来描述颜色。本文将详细介绍RGB与HSV颜色空间的转换原理,并提供MATLAB实现代码,同时简要介绍FPGA实现的相关内容。
HSV颜色模型简介
HSV颜色模型,又称为六角锥体模型,以色调(H)、饱和度(S)、亮度(V)为基础,能够更加自然地表现和处理颜色,因而在计算机视觉、图像处理领域得到了广泛应用。
- H(色调):表示颜色的种类。色调通常用角度来表示,范围从0°(红)到120°(绿)再到240°(蓝),最后回到360°(红色)。
- S(饱和度):表示颜色的纯净度和鲜艳程度。当S=1时,表示颜色是最纯净的、最鲜艳的;当S=0时,颜色变为灰色,表示没有鲜明的色彩。
- V(亮度):表示颜色的明暗程度。当V=1时,表示颜色完全亮丽;当V=0时,表示颜色完全暗淡,即颜色为黑色。
MATLAB代码实现
下面通过MATLAB代码实现RGB到HSV的转换以及HSV到RGB的逆转换。
% 清空工作区和命令行窗口
clear;
clc;
% 读取图像
input_path = 'D:/FPGA/Image processing/8_rgb_hsv/matlab/1_1920x1080.bmp';
input_image = imread(input_path);
[height, width, ~] = size(input_image);
% 检查图像尺寸
if height ~= 1080 || width ~= 1920
error('输入图像必须是1920x1080像素!');
end
% 创建HSV图像和还原的RGB图像
hsv_image = zeros(height, width, 3);
restored_rgb = zeros(height, width, 3, 'uint8');
% RGB转HSV
for y = 1:height
for x = 1:width
R = double(input_image(y,x,1));
G = double(input_image(y,x,2));
B = double(input_image(y,x,3));
% 归一化到[0,1]
r = R/255;
g = G/255;
b = B/255;
Cmax = max([r g b]);
Cmin = min([r g b]);
delta = Cmax - Cmin;
% 计算H (归一化到0-1)
if delta == 0
H = 0;
elseif Cmax == r
H = mod(((g-b)/delta), 6)/6;
elseif Cmax == g
H = ((b-r)/delta + 2)/6;
else
H = ((r-g)/delta + 4)/6;
end
% 确保H为正值
if H < 0
H = H + 1;
end
% 计算S
if Cmax == 0
S = 0;
else
S = delta/Cmax;
end
% 计算V
V = Cmax;
% 存储HSV值 (已归一化到0-1)
hsv_image(y,x,1) = H;
hsv_image(y,x,2) = S;
hsv_image(y,x,3) = V;
end
end
% HSV转回RGB
for y = 1:height
for x = 1:width
H = hsv_image(y,x,1) * 6; % 转回0-6范围以便计算
S = hsv_image(y,x,2);
V = hsv_image(y,x,3);
C = V * S;
X = C * (1 - abs(mod(H, 2) - 1));
m = V - C;
% 根据H的范围决定RGB值
if H >= 0 && H < 1
r = C; g = X; b = 0;
elseif H >= 1 && H < 2
r = X; g = C; b = 0;
elseif H >= 2 && H < 3
r = 0; g = C; b = X;
elseif H >= 3 && H < 4
r = 0; g = X; b = C;
elseif H >= 4 && H < 5
r = X; g = 0; b = C;
else
r = C; g = 0; b = X;
end
% 转换回[0,255]范围
R = round((r + m) * 255);
G = round((g + m) * 255);
B = round((b + m) * 255);
% 确保值在0-255范围内
R = min(max(R, 0), 255);
G = min(max(G, 0), 255);
B = min(max(B, 0), 255);
restored_rgb(y,x,1) = uint8(R);
restored_rgb(y,x,2) = uint8(G);
restored_rgb(y,x,3) = uint8(B);
end
end
% 显示原始图像、HSV图像和还原的RGB图像
figure('Name', 'Image Comparison');
subplot(1,3,1);
imshow(input_image);
title('Original RGB Image');
subplot(1,3,2);
imshow(hsv_image); % 现在可以直接显示,因为值已经在0-1范围内
title('HSV Image');
subplot(1,3,3);
imshow(restored_rgb);
title('Restored RGB Image');
% 获取输入文件的目录路径
[filepath,~,~] = fileparts(input_path);
% 在相同目录下保存输出图像
imwrite(hsv_image, fullfile(filepath, 'output_hsv.bmp'));
imwrite(restored_rgb, fullfile(filepath, 'output_restored_rgb.bmp'));
% 打开输出文件
output_path = fullfile(filepath, 'output.txt');
fidc = fopen(output_path, 'wb');
% 将HSV数据写入文本文件
for y = 1:height
for x = 1:width
% 将0-1范围的HSV值转换为适合FPGA处理的定点数格式
% 假设FPGA使用8位精度:
% H: 0-1 转换为 0-255
% S: 0-1 转换为 0-255
% V: 0-1 转换为 0-255
H = uint8(hsv_image(y,x,1) * 255);
S = uint8(hsv_image(y,x,2) * 255);
V = uint8(hsv_image(y,x,3) * 255);
% 按HSV顺序写入三个字节
fwrite(fidc, [H S V], 'uint8');
end
end
% 关闭文件
fclose(fidc);
fprintf('已生成output.txt文件\n');
FPGA实现要点
在FPGA实现中,需要注意以下几点:
- RGB转HSV:由于H(色调)本来应该0°
360°,如今映射到了0255,会有所损失。 - HSV转RGB:中间变量的精度真的很重要!!!
本文原文来自CSDN
热门推荐
有哪些成功的跨学科教学案例可以借鉴
胡萝卜怎么吃最有营养?有哪些禁忌?
如何焯煮豆角才能做到完美鲜嫩
养龟新手必看!超实用养龟全攻略,龟王神带你避坑,养出漂亮龟宝
运营商赠送光猫的性能与实用性深度解析:是否值得选择?
海参的营养真相:并非人人适宜的高档补品
打卡国家博物馆:一次穿越历史与文化的旅程
李宗伟与大数据分析可视化:运动员的数字化转型
国画四君子 梅兰竹菊名家作品赏析
痤疮发生与加重由多种内外因素决定
如何培养社交能力:心理学视角下的指南
钢结构工程用方管与方矩管:应用、性能及发展趋势
陕西工业职业技术学院2025年招生简章!附招生计划、选科要求
一语双关,妙语连珠:探寻成语的智慧与魅力
究竟丨如何理解在教育和培训领域促进消费?社会培训分类施策是大方向
山东烟台最有名的7大特色美食和3大景点,鲜香味美,你都去过吗?
如何将域名解析到指定IP地址:从购买域名到配置DNS记录的完整指南
香蕉对人体的贡献,好吃健康益处多多
晚安倍健:失眠问题为何成了中老年人的普遍困扰
中医饮食养生原则与方法
西湖龙井的口感与特点,真正的龙井茶是什么口感(甘香不洌)
健康科普丨头发一天不洗就油?可能是洗头方式不正确
家庭聚餐场所布局改造方案
如何评估黄金的纯度和质量?怎样判断黄金的价值和价格?
探秘望城最美古镇 望城如此多娇 | 来铜官,感受火与诗的璀璨烂漫
GPT-5:人工智能的新篇章,未来已来
空腹血糖12无明显症状正常吗?控制饮食能降吗
换季肌肤问题及芦荟胶的全方位护理策略
鸡蛋为什么不能空运?揭开航空行李规则背后不为人知的秘密
纺织业数字化转型:技术创新之外另有路径