基于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 |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)