基于FPGA的图像RGB转HSV实现,包含testbench和MATLAB辅助验证程序

1.算法运行效果图预览

 

将FPGA的仿真结果导入到matlab中:

 

 

 

2.算法运行软件版本

vivado2019.2

 

matlab2022a

 

3.算法理论概述

        在数字图像处理中,色彩空间的转换是常见的操作。其中,RGB和HSV是两种经常使用的色彩空间。RGB基于红、绿、蓝三种颜色的组合,而HSV则代表色相、饱和度和明度。本文将探讨如何基于FPGA实现RGB到HSV的转换,并深入讨论其背后的原理和数学公式。

 

3.1. RGB与HSV色彩空间

       RGB色彩空间:RGB色彩模型采用三维笛卡尔坐标系统,红、绿、蓝三原色位于三个角上。原色值位于坐标轴上的点,而其他颜色则位于立方体内部。通过三原色的不同强度组合,可以得到各种颜色。 RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。红、绿、蓝三个颜色通道每种色各分为256阶亮度,在0时“灯”最弱——是关掉的,而在255时“灯”最亮。当三色灰度数值相同时,产生不同灰度值的灰色调,即三色灰度都为0时,是最暗的黑色调;三色灰度都为255时,是最亮的白色调。在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。

 

       HSV色彩空间:HSV色彩空间更加接近人类视觉对色彩的感知。其中,H(Hue)代表色相,表示颜色的基本属性;S(Saturation)代表饱和度,表示颜色的深浅;V(Value)代表明度,表示颜色的明亮程度。

 

       HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。

 

色调H

 

        用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

 

饱和度S

 

        饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

 

明度V

 

        明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

 

3.2. RGB到HSV转换原理

RGB到HSV的转换涉及以下步骤:

 

首先将RGB值标准化到[0,1]范围。对于8位的RGB值,可以通过除以255来完成这一步。

 

 

 

然后计算色相H,饱和度S,明度V

 

 

 

4.部分核心程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2023/08/01 
// Design Name:
// Module Name: RGB2gray
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
  
  
module test_image;
  
reg i_clk;
reg i_rst;
reg [7:0] Rbuff [0:100000];
reg [7:0] Gbuff [0:100000];
reg [7:0] Bbuff [0:100000];
reg [7:0] i_Ir,i_Ig,i_Ib;
wire [7:0] o_H,o_S,o_V;
integer fids1,dat1,fids2,dat2,fids3,dat3,jj=0;
  
  
  
  
//D:\FPGA_Proj\FPGAtest\codepz
initial
begin
    fids1 = $fopen("D:\\FPGA_Proj\\FPGAtest\\codepz\\R.bmp","rb");
    dat1  = $fread(Rbuff,fids1);
    $fclose(fids1);
end
  
initial
begin
    fids2 = $fopen("D:\\FPGA_Proj\\FPGAtest\\codepz\\G.bmp","rb");
    dat2  = $fread(Gbuff,fids2);
    $fclose(fids2);
end
  
initial
begin
    fids3 = $fopen("D:\\FPGA_Proj\\FPGAtest\\codepz\\B.bmp","rb");
    dat3 = $fread(Bbuff,fids3);
    $fclose(fids3);
end
  
  
  
initial
begin
i_clk=1;
i_rst=1;
#1200;
i_rst=0;
end
  
always #5  i_clk=~i_clk;
  
always@(posedge i_clk)
begin
    i_Ir<=Rbuff[jj];
    i_Ig<=Gbuff[jj];
    i_Ib<=Bbuff[jj];
    jj<=jj+1;
end
  
  
  
main_RGB2HSV main_RGB2HSV_u(
.i_clk    (i_clk),
.i_rst    (i_rst),
.i_image_R      (i_Ir),
.i_image_G      (i_Ig),
.i_image_B      (i_Ib),
.o_H            (o_H),// Y
.o_S            (o_S),// Y
.o_V            (o_V)
);
  
  
integer fout1;
initial begin
 fout1 = $fopen("H.txt","w");
end
  
always @ (posedge i_clk)
 begin
    if(jj<=66616)
    $fwrite(fout1,"%d\n",o_H);
    else
    $fwrite(fout1,"%d\n",0);
end
  
integer fout2;
initial begin
 fout2 = $fopen("S.txt","w");
end
  
always @ (posedge i_clk)
 begin
    if(jj<=66616)
    $fwrite(fout2,"%d\n",o_S);
    else
    $fwrite(fout2,"%d\n",0);
end
  
  
integer fout3;
initial begin
 fout3 = $fopen("V.txt","w");
end
  
always @ (posedge i_clk)
 begin
    if(jj<=66616)
    $fwrite(fout3,"%d\n",o_V);
    else
    $fwrite(fout3,"%d\n",0);
end
  
  
  
  
  
endmodule

  

posted @   简简单单做算法  阅读(118)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示