问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

数字图像处理:RGB与HSV颜色空间的相互转换

创作时间:
作者:
@小白创作中心

数字图像处理:RGB与HSV颜色空间的相互转换

引用
CSDN
1.
https://m.blog.csdn.net/2301_80417284/article/details/144295437

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

HSV颜色模型详解

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

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

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

MATLAB代码实现

下面通过MATLAB代码实现RGB与HSV的相互转换:

% 清空工作区和命令行窗口
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');  

运行结果展示

通过上述代码,可以将输入的RGB图像转换为HSV图像,并将HSV图像还原为RGB图像。以下是转换前后的图像对比:

从图中可以看出,HSV转换后的图像在色调、饱和度和亮度上都有所变化,但通过反向转换,可以基本还原原始图像。

总结

本文介绍了HSV颜色模型的基本概念,并通过MATLAB代码实现了RGB与HSV的相互转换。HSV模型在计算机视觉和图像处理领域具有广泛的应用,掌握其转换方法对于从事相关领域工作的技术人员具有重要意义。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号