1、前言(需要源码的评论区留言邮箱)

        均值/中值滤波,对于滤波窗口内每个像素的权重都是一样的。但是噪声在图像当中往 往比较突兀,即和原图有较大的差异,那么它必然不是平均分布的。本节先引入一个概念: 正态分布,其概率分布图,如图所示,数据主要集中在中间,并向两边逐渐减少。

        

        因此我们引入正太分布函数如下:一个是一维的,一个是二维的。

        其中σ为高斯分布的强度,σ值越大,数据越分散;反之,数据越向中心集中分布。图像像素是平面分布的,如果灰度值在0~255范围可取,那么灰度图像就是二维分布的。

2、高斯核(模板)

        以3x3像素矩阵为例,我们要怎么确定每个像素点的高斯权重呢,这可以通过matlab求。代码如下:这里我们假设σ=3(也就是代码中的sigma为3,这个值可以根据自己的实际情况改变),求出高斯模板,但是我们需要将求出的高斯模板定点化,然后由于fpga不太好处理小数,因此我们需要将该模板*2^10(定点化)。

clear all; close all; clc;

% ---------------------------------------------------
% 计算3*3高斯模板
sigma = 3;
G1=zeros(3,3);   %3*3高斯模板
for i=-1 : 1
    for j=-1 : 1
%         G1(i+2,j+2) = exp(-(i.^2 + j.^2)/(2*sigma^2)) / (2*pi*sigma^2);
        G1(i+2,j+2) = exp(-(i^2 + j^2)/(2*sigma^2)) ;
    end
end

% 归一化3*3高斯模板
temp = sum(sum(G1));
G2 = G1/temp;

% 3*3高斯模板 *1024定点化
G3 = floor(G2*1024);



结果如下:

 3、fpga实现该算法。

        通过matlab求出高斯核后,后面的就简单了,只需要对应相乘,然后再移位即可。核心代码如下。

always@(posedge sys_clk)
    if(!sys_rst_n)begin
		sum_line1_data<=18'd0;
		sum_line2_data<=18'd0;
        sum_line3_data<=18'd0;
	end
	else begin
		sum_line1_data<=matrix_p11*18'd109+matrix_p12*18'd115+matrix_p13*18'd109;
		sum_line2_data<=matrix_p21*18'd115+matrix_p22*18'd122+matrix_p23*18'd115;
		sum_line3_data<=matrix_p31*18'd109+matrix_p32*18'd115+matrix_p33*18'd109;
	end

always@(posedge sys_clk)
    if(!sys_rst_n)
        gas_data<=18'd0;
    else 
		gas_data<=(sum_line1_data+sum_line2_data+sum_line3_data)>>10;

reg	[1:0] gas_filter_vs_reg;
reg [1:0] gas_filter_hr_reg;

always@(posedge sys_clk)
    if(!sys_rst_n)begin
		gas_filter_vs_reg<=2'd0;
		gas_filter_hr_reg<=2'd0;
	end 
	else begin
		gas_filter_vs_reg<={gas_filter_vs_reg[0],matrix_vs};
		gas_filter_hr_reg<={gas_filter_hr_reg[0],matrix_hr};
	end

assign gas_filter_vs=gas_filter_vs_reg[1];
assign gas_filter_hr=gas_filter_hr_reg[1];
assign gas_filter_data={gas_data[7:3],gas_data[7:2],gas_data[7:3]};

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐