当前位置: 首页 > news >正文

数字图像处理(16):RGB与HSV互转

        (1)HSV颜色模型:HSV颜色模型,又称为六角锥体模型,以色调(H)、饱和度(S)、亮度(V)为基础,能够更加自然地表现和处理颜色,因而在计算机视觉、图像处理领域得到了广泛应用。

        (2)H表示色调,用来表示颜色的种类。色调是人在视觉上区分颜色的一种方式,类似RGB模型中的红、绿、蓝等基本颜色。色调通常用角度来表示,0°(红)~120°(绿)~240°(蓝)~360°(红色)。

        (3)S表示饱和度,用来表示颜色的纯净度和鲜艳程度。当S=1时,表示颜色是最纯净的、最鲜艳的;当S=0时,颜色变为灰色,表示没有鲜明的色彩。

        (4)V表示亮度,用来表示颜色的明暗程度。当V=1时,表示颜色完全亮丽;当V=0时,表示颜色完全暗淡,即颜色为黑色。

        

        (5)matlab代码实现

% 清空工作区和命令行窗口
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 ~= 1920error('输入图像必须是1920x1080像素!');
end% 创建HSV图像和还原的RGB图像
hsv_image = zeros(height, width, 3);
restored_rgb = zeros(height, width, 3, 'uint8');% RGB转HSV
for y = 1:heightfor x = 1:widthR = 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 == 0H = 0;elseif Cmax == rH = mod(((g-b)/delta), 6)/6;elseif Cmax == gH = ((b-r)/delta + 2)/6;elseH = ((r-g)/delta + 4)/6;end% 确保H为正值if H < 0H = H + 1;end% 计算Sif Cmax == 0S = 0;elseS = delta/Cmax;end% 计算VV = 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:heightfor x = 1:widthH = 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 < 1r = C; g = X; b = 0;elseif H >= 1 && H < 2r = X; g = C; b = 0;elseif H >= 2 && H < 3r = 0; g = C; b = X;elseif H >= 3 && H < 4r = 0; g = X; b = C;elseif H >= 4 && H < 5r = X; g = 0; b = C;elser = 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:heightfor x = 1:width% 将0-1范围的HSV值转换为适合FPGA处理的定点数格式% 假设FPGA使用8位精度:% H: 0-1 转换为 0-255% S: 0-1 转换为 0-255% V: 0-1 转换为 0-255H = 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');

(6)FPGA实现(RGB转HSV)

由于H(色调)本来应该0°~360°,如今映射到了0~255,会有所损失。

(7)FPGA实现(HSV转RGB)

        中间变量的精度真的很重要!!!

http://www.lryc.cn/news/499708.html

相关文章:

  • web组态可视化编辑器
  • 数组 - 八皇后 - 困难
  • 【分布式】Redis分布式缓存
  • Ubuntu——extrepo添加部分外部软件源
  • 评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能
  • 如何查看电脑刷新率
  • mysql集群MHA方式部署
  • 第十七章 使用 MariaDB 数据库管理系统
  • rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)
  • Unity性能优化---动态网格组合(一)
  • Appium:安装uiautomator2失败
  • 电子信息工程自动化 单片机彩灯控制
  • word poi-tl 表格功能增强,实现表格功能垂直合并
  • LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型
  • 《鸿蒙开发-答案之书》 怎么设置Json字段的别名
  • ftp服务器搭建-安装、配置及验证
  • 鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)
  • c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序
  • 人工智能学习路线详细规划
  • 深度学习之视觉处理
  • 遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。
  • Spring Boot与Spring Security集成:前后分离认证流程的优化实践
  • 设计模式——Chain(责任链)设计模式
  • HarmonyOS(63) ArkUI 自定义占位组件NodeContainer
  • Python深度强化学习对冲策略:衍生品投资组合套期保值Black-Scholes、Heston模型分析...
  • 【opencv入门教程】2. Point()类用法
  • 前端导出excel实战(xlsx库和exceljs库)
  • 【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo
  • Python库常用函数-数据分析
  • 汽车EEA架构:架构的简介