基于FPGA的图像PSNR质量评估计算实现,包含testbench和MATLAB辅助验证程序

102 阅读3分钟

1.算法运行效果图预览

设置较大的干扰,PSNR=15。

 

f42779aee1985488240248b895ca2a4e_82780907_202312262208030084914136_Expires=1703600283&Signature=anHUuahhydtkrWgtFo6%2FUThICPA%3D&domain=8.jpeg

 

设置较小的干扰,PSNR=25。

 

7e7ac7ff0bc18b7461a691eb46e09e6f_82780907_202312262208150146358249_Expires=1703600295&Signature=MQwfEsJXv8jeFLMnc6VeAQhbEw8%3D&domain=8.jpeg

 

2.算法运行软件版本

matlab2022a

 

vivado2019.2

 

 

3.算法理论概述

       基于FPGA的图像PSNR(峰值信噪比)质量评估计算实现涉及到数字图像处理、硬件设计和编程等多个领域。PSNR是一种用于评估图像质量的指标,它衡量了原始图像和经过处理后的图像之间的相似程度。PSNR值越大,表示处理后的图像质量越好。基于FPGA的图像PSNR质量评估计算实现通过硬件加速,可以实现对图像质量的实时评估,为图像处理算法的优化和调试提供有力的支持。

 

PSNR的计算公式如下:

 

PSNR = 10 × log10((MAX_I^2) / MSE)

 

       其中,MAX_I表示图像的最大像素值,MSE表示原始图像和处理后的图像之间的均方误差。均方误差的计算公式如下:

 

MSE = (1 / (M × N)) × ΣΣ[I(i,j) - K(i,j)]^2

 

       其中,I(i,j)表示原始图像中像素(i,j)的灰度值,K(i,j)表示处理后图像中像素(i,j)的灰度值,M和N分别表示图像的行数和列数。

 

      基于FPGA的图像PSNR质量评估计算实现需要将上述数学公式转化为硬件电路,通过编程实现对图像的实时处理和质量评估。具体步骤如下:

 

图像输入:将待评估的图像数据输入到FPGA中。

计算均方误差:根据输入的原始图像和处理后的图像,计算它们之间的均方误差。这需要设计相应的硬件电路,对每个像素进行差值平方和累加操作。

计算PSNR:根据计算得到的均方误差和图像的最大像素值,计算PSNR值。这需要设计相应的硬件电路,实现上述PSNR计算公式的功能。

输出结果:将计算得到的PSNR值输出到显示器或其他输出设备中,完成图像质量评估。

        综上所述,基于FPGA的图像PSNR质量评估计算实现需要结合数字图像处理、硬件设计和编程等多个领域的知识,通过合理的算法设计和硬件优化,实现对图像质量的实时评估和提升。

 

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

//

// Company:

// Engineer:

//

// Create Date: 2022/07/28 01:51:45

// 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 [7:0] tmps1 [0:100000];

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

reg [7:0] Images1;

reg [7:0] Images2;

wire [7:0] o_PSNR;

integer fids1,fids2,idx=0,dat1,dat2;

 

//D:\FPGA_Proj\FPGAtest\codepz\test0N.bmp 路径改为自己的路径

 

initial

begin

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

        dat1 = $fread(tmps1,fids1);

        $fclose(fids1);

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

        dat2 = $fread(tmps2,fids2);

        $fclose(fids2);

end

 

initial

begin

i_clk=1;

i_rst=1;

#1000;

i_rst=0;

end

 

always #5  i_clk=~i_clk;

 

always@(posedge i_clk)

begin

    if(idx<=66613)

    begin

        Images1<=tmps1[idx];

        Images2<=tmps2[idx];

        end

        else begin

        Images1<=8'd0;

        Images2<=8'd0;

        end

        idx<=idx+1;

end

 

 

tops tops_u(

.i_clk      (i_clk),

.i_rst      (i_rst),

.i_images1  (Images1),

.i_images2  (Images2),

.o_PSNR     (o_PSNR)

);

 

//integer fout1;

//initial begin

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

//end

 

//always @ (posedge i_clk)

// begin

//    if(idx<=67131)

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

//    else

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

//end

 

endmodule`