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

7094 2025-05-09 21:57:31
(1)HSV颜色模型:HSV颜色模型,又称为六角锥体模型,以色调(H)、饱和度(S)、亮度(V)为基础,能够更加自然地表现和处理颜色,因而在

(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 ~= 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');

(6)FPGA实现(RGB转HSV)

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

(7)FPGA实现(HSV转RGB)

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

为什么说恋爱中女生是白痴 恋爱中女生是白痴吗|2024年最新版!日本必買家電、數位產品、伴手禮大集合(附優惠券)