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


    目录

    1.算法运行效果图预览

    2.算法运行软件版本

    3.部分核心程序

    4.算法理论概述

    4.1计算最大值和最小值

    4.2计算亮度L

    4.3计算饱和度S

    4.4计算色调H

    5.算法完整程序工程


    1.算法运行效果图预览

    FPGA结果导入到MATLAB显示效果:

    2.算法运行软件版本

    Vivado2019.2

    matlab2022a

    3.部分核心程序

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

    4.算法理论概述

            在数字图像处理中,RGB和HLS是两种常见的颜色空间。RGB基于红绿蓝三种基本颜色的叠加来定义其他颜色,而HLS则代表色调、亮度和饱和度,它更接近人类视觉对颜色的感知。将RGB图像转换为HLS图像的目的通常是为了更方便地进行某些类型的图像处理,比如色彩平衡和色彩分离。RGB颜色空间基于笛卡尔坐标系,其中R、G、B分别代表红、绿、蓝三种颜色的强度。HLS颜色空间则是基于圆柱坐标系,其中H代表色调(0-360度),L代表亮度(0-1),S代表饱和度(0-1)。

            转换的第一步是将RGB值归一化到[0,1]范围。然后,通过计算RGB颜色空间的最大值和最小值来得到亮度L。色调H由RGB中的最大值和最小值决定,并使用反正切函数来得到0-360度的角度。最后,饱和度S基于最大值和亮度L来计算。

    具体的转换公式如下:

    将RGB值归一化到[0,1]:
    R' = R/255
    G' = G/255
    B' = B/255

    4.1计算最大值和最小值


    Max = max(R', G', B')
    Min = min(R', G', B')
    Diff = Max - Min

    4.2计算亮度L


    L = (Max + Min) / 2


    4.3计算饱和度S

    if L < 0.5:
    S = Diff / (Max + Min)
    else:
    S = Diff / (2 - Max - Min)

    4.4计算色调H


    if Diff == 0:
    H = 0
    else:
    if Max == R':
    H = (60 * ((G' - B') / Diff) + 360) % 360
    elif Max == G':
    H = (60 * ((B' - R') / Diff) + 120) % 360
    elif Max == B':
    H = (60 * ((R' - G') / Diff) + 240) % 360

           这些公式可以将每一个像素从RGB颜色空间转换到HLS颜色空间。值得注意的是,这种转换通常是可逆的,也就是说,你也可以从HLS颜色空间转换回RGB颜色空间。在实现RGB到HLS的转换时,通常会先读取一幅RGB图像,然后将上述公式应用于图像中的每一个像素。

    5.算法完整程序工程

    OOOOO

    OOO

    O

  • 相关阅读:
    OpenCV透视变换——将斜方向的图片转成正方向鸟瞰图
    存储性能测试
    java 遍历文件夹目录树形结构并在控制台输出且保存到本地文件
    react数据管理之setState与Props
    WebAssembly核心编程[3]: Module 与 Instance
    6.【图的应用2】有向⽆环图DAG描述表达式、拓扑排序和逆拓扑排序(AOV网)、关键路径(AOE网)
    七、定时器类的编写与解析 —— TinyWebServer
    C++入门应该注意的问题(this指针和类对象)
    源码包部署
    Spring Cloud Stream详解
  • 原文地址:https://blog.csdn.net/aycd1234/article/details/134396332