基于直方图相似性的图像分类算法FPGA实现,包括tb测试文件和MATLAB辅助验证

95 阅读3分钟

1.算法运行效果图预览

MATLAB测试结果:

image.png

  image.png

FPGA测试结果:

image.png

上述仿真图中,红色XX表示图像读取完毕。因此输出XX。当图像输出完成之后,最下面的相似性指标

 

same1输出为11226,same2输出为67584.即图1和图2相似性较强,图1和图3相似性较弱。

 

2.算法运行软件版本

vivado2019.2

 

matlab2022A

 

3.算法理论概述

       图像直方图是一种统计图像像素强度分布的方法,它将图像空间转化为频率分布空间,反映了图像的颜色或灰度特征。对于灰度图像,每像素点的灰度值可以构建一个一维灰度直方图;对于彩色图像,可以分别构建R、G、B三个通道的直方图或色彩空间下的直方图。

 

      假设图像I的灰度范围是[0, L-1],则其直方图可以表示为:

image.png

 

       直方图相似性度量一般采用距离或相似性系数,如差值,欧氏距离、曼哈顿距离、余弦相似度等。例如,若要计算两幅图像I1和I2的直方图欧氏距离,可表示为:

image.png  

在本课题中,我们选择较为简单的差值计算方式。

 

在FPGA上实现基于直方图相似性的图像分类算法主要包括以下几个步骤:

 

图像采集与预处理:FPGA通过接口接收图像数据,进行必要的预处理,如去噪、缩放等,以适应后续直方图计算的要求。

 

直方图计算: 对每个像素的灰度值进行累加计数,构建直方图。在FPGA上,可以设计并行流水线结构,对每一行或每一个像素块独立进行灰度值计数,大大提高计算效率。

 

直方图比较: 将待分类图像的直方图与预先训练好的各个类别的参考直方图进行相似性度量。在FPGA中,可以实现高效的并行比较逻辑,计算直方图之间的距离或相似度。

 

分类决策: 根据直方图比较结果,选择最相似或距离最近的类别作为分类结果。这一步也可以通过查找表(LUT)或硬件决策树等硬件结构在FPGA上实现。

 

实时性优化: 由于FPGA的高度并行性和灵活性,可以有效优化算法的时间复杂度,实现实时的图像分类功能。

 

 

 

 

4.部分核心程序 ``timescale 1ns / 1ps

//

// Company:

// Engineer:

//

 

// Design Name:

// Module Name: test_image

// 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 i_ready;

reg [7:0] Tmp1[0:100000];

reg [7:0] Tmp2[0:100000];

reg [7:0] datas0;

reg [7:0] datas1;

reg [7:0] datas2;

 

integer fids1,jj1=0,dat1;

integer fids2,jj2=0,dat2;

//D:\FPGA_Proj\FPGAtest\code

 

initial

begin

         fids1= $fopen("D:\FPGA_Proj\FPGAtest\code\data1.bmp","rb");

         dat1 = $fread(Tmp1,fids1);

         $fclose(fids1);

end

 

initial

begin

         fids2= $fopen("D:\FPGA_Proj\FPGAtest\code\data2.bmp","rb");

         dat2 = $fread(Tmp2,fids2);

         $fclose(fids2);

end

 

 

initial

begin

i_clk=1;

i_rst=1;

i_ready=0;

#10780;

i_ready=1;

i_rst=0;

#655360;

i_ready=0;

end

 

always #5  i_clk=~i_clk;

 

reg[3:0]cnts=0;

 

 

always@(posedge i_clk)

begin

    cnts<=cnts+4'd1;

    datas0<=Tmp1[jj1];

         datas1<=Tmp1[jj1]+{4'd0,cnts};//在第一个相同图片的基础上随机加一些干扰,模拟一个相似的图像

         datas2<=Tmp2[jj2];

         jj1<=jj1+1;

         jj2<=jj2+1;

end

 

 

 

 

wire [31:0]o_same1;

image_similar image_similar_u1(

.i_clk     (i_clk),

.i_rst     (i_rst),

.i_ready   (i_ready),

.i_xin1    (datas0),

.i_xin2    (datas1),

.o_same    (o_same1)

    );

 

 

wire [31:0]o_same2;

image_similar image_similar_u2(

.i_clk     (i_clk),

.i_rst     (i_rst),

.i_ready   (i_ready),

.i_xin1    (datas0),

.i_xin2    (datas2),

.o_same    (o_same2)

    );

 

 

 

endmodule`