基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证

117 阅读1分钟

1.算法运行效果图预览

1.jpeg

2.jpeg

3.jpeg

4.jpeg

 

2.算法运行软件版本

VIVADO2019.2

 

matlab2022a

 

3.算法理论概述

       图像阈值计算和分割是图像处理领域的一项重要任务,它通过设定一个阈值将图像从灰度空间转化为二值空间,从而实现对图像区域的有效划分。基于直方图的阈值选取方法主要依赖于图像的灰度直方图分布特性。

 

在开始之前,我们需要了解直方图和阈值分割的基本概念:

 

直方图:图像的直方图是表示图像中每个灰度级出现频率的图表。对于灰度图像,直方图显示了从黑到白(通常是0到255)的灰度值分布。

 

阈值分割:阈值分割是指通过一个阈值将图像的像素分为两组(通常是前景和背景),使得两组之间的差异最大化。

 

 

 

 

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:

//

//

//MATLAB/verilog/python/opencv/tensorflow/caffe/C/C++等算法仿真

 

 

module test_image;

 

reg i_clk;

reg i_rst;

reg i_ready;

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

reg [7:0] datas;

wire[15:0]o_histb;

 

wire[7:0]o_lvl;

wire[7:0]o_y;

 

integer fids,jj=0,dat;

 

//D:\FPGA_Proj\FPGAtest\code2

 

initial

begin

         fids = $fopen("D:\FPGA_Proj\FPGAtest\code2\data.bmp","rb");

         dat  = $fread(Tmp,fids);

         $fclose(fids);

end

 

initial

begin

i_clk=1;

i_rst=1;

i_ready=0;

#1000;

i_ready=1;

i_rst=0;

#655350;

i_ready=0;

end

 

always #5  i_clk=~i_clk;

 

always@(posedge i_clk)

begin

         datas<=Tmp[jj];

         jj<=jj+1;

end

 

 

im_hist im_hist_u(

.i_clk    (i_clk),

.i_rst    (i_rst),

.i_ready  (i_ready),

.i_xin    (datas),

.o_histb   (o_histb),

.o_lvl     (o_lvl),

.o_y       (o_y)

);

 

 

//将数据导出,由MATLAB显示图像分割效果

integer fout1;

initial begin

 fout1 = $fopen("result.txt","w");

end

 

always @ (posedge i_clk)

 begin

    if(jj>=66613+1 & jj<=66613+65536)

         $fwrite(fout1,"%d\n",o_y);

         else

         $fwrite(fout1,"%d\n",0);

end

 

 

 

 

 

endmodule`