首页 > 其他分享 >FPGA/ZYNQ:中值滤波

FPGA/ZYNQ:中值滤波

时间:2024-06-12 09:46:18浏览次数:9  
标签:FPGA max data1 滤波 ZYNQ rst data data2

一、简述
滤波是图像处理领域应用非常广泛的工具之一,它可以改善图像质量,包括去除高频噪声与干扰、图像平滑等。我们常见的空间滤波有中值滤波和均值滤波。图像可以看成是一个定义在二维平面上的信号,该信号的幅值对应像素的灰度(彩色图像对应 RGB 三个分量)。图像的频率指的是空间频率,它和我们认知的物理频率是不同的。图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。图像的主要成分是低频信息,它形成了图像的基本灰度等级,对图像结构的决定作用较小;中频信息决定了图像的基本结构,形成了图像的主要边缘结构;高频信息形成了图像的边缘和细节,是在中频信息上对图像内容的进一步强化。
我们也可以通过空间滤波器(也称为空间掩模、模板或窗口)直接作用于图像本身而对图像进行滤波处理。空间滤波器由两部分组成:(1)邻域,(2)对该邻域包围的图像像素执行的预定义操作。领域是指一个像素点及其附近像素点所组成的空间。滤波会产生一个新像素,像素的坐标就是邻域中心的坐标,像素的值就是滤波操作的结果。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值近真实值,从而消除孤立的噪声点。
二、实现方法
建立3x3滤波模板,再对3x3模板中每行的值按大小排序,再按列取最大值列中的最小值,中值列中的中值,最小值中的最大值,再对取出的三个值取中值,最终得到9个值中的中值。将该值作为模板中心位置的值。
三、实现过程
1.对图像进行灰度化处理
2.对灰度化后的图像进行中值滤波,在其中调用3x3生成模块、中值提取模块
灰度化处理将在其他博客中介绍,这里不做详细介绍,3x3生成模块在上一个博客中已经做了介绍,可以查看上一个博客了解。本章主要介绍中值提取模块
reg [2:0] median_frame_vsync_r; reg [2:0] median_frame_href_r; reg [2:0] median_frame_clken_r;
首先对视频信号做延时处理,延迟三个时钟周期。

//step1 对sort3进行三次例化操作
     Sort3 u_Sort3_1(
    .clk (clk),
    .rst_n (rst_n),
    
    .data1 (data11),
    .data2 (data12),
    .data3 (data13),
    
    .max_data (max_data1),
    .mid_data (mid_data1),
    .min_data (min_data1)
    );

    Sort3 u_Sort3_2(
    .clk (clk),
    .rst_n (rst_n),
    
    .data1 (data21),
    .data2 (data22),
    .data3 (data23),
    
    .max_data (max_data2),
    .mid_data (mid_data2),
    .min_data (min_data2)
    );

    Sort3 u_Sort3_3(
    .clk (clk),
    .rst_n (rst_n),
    
    .data1 (data31),
    .data2 (data32),
    .data3 (data33),
    
    .max_data (max_data3),
    .mid_data (mid_data3),
    .min_data (min_data3));

第一步,调用三次Sort模块对3行数据进行排序(按从大到小)

Sort3 u_Sort3_4(
 .clk (clk),
 .rst_n (rst_n),

 .data1 (max_data1),
 .data2 (max_data2),
 .data3 (max_data3),
 
 .max_data (),
 .mid_data (),
 .min_data (max_min_data));

 Sort3 u_Sort3_5(
 .clk (clk),
 .rst_n (rst_n),
 
 .data1 (mid_data1),
 .data2 (mid_data2),
 .data3 (mid_data3),
 
 .max_data (),
 .mid_data (mid_mid_data),
 .min_data ());

 Sort3 u_Sort3_6(
 .clk (clk),
 .rst_n (rst_n),
 
 .data1 (min_data1),
 .data2 (min_data2),
 .data3 (min_data3),
 
 .max_data (min_max_data),
 .mid_data (),
 .min_data ());

第二步,再调用三次Sort模块,以列为单位求取最大值列中的最小值,中值列中的中值,最小值列中的最大值

//step3 将step2中的三个值再取中值
Sort3 u_Sort3_7(
    .clk (clk),
    .rst_n (rst_n),
    
    .data1 (max_min_data),
    .data2 (mid_mid_data),
    .data3 (min_max_data),
    
    .max_data (),
    .mid_data (target_data),
    .min_data ()
 
  );

第三步,再调用一次Sort模块,求取上步三个值中的中值,以作为输出的3x3模板的中值。

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        median_frame_clken_r <= 0;
        median_frame_href_r <= 0;
        median_frame_vsync_r <= 0;
    end
    else begin
        median_frame_vsync_r <= {median_frame_vsync_r[1:0],median_frame_vsync};
        median_frame_clken_r <= {median_frame_clken_r[1:0],median_frame_clken};
        median_frame_href_r  <= {median_frame_href_r[1:0],median_frame_href};
    end
end

因为每一步Sort执行都耗费一个时钟周期,所以需要对信号做延迟处理,延迟三个时钟周期。
其中调用的Sort模块是用来排序求取最大值、最小值、中值的模块,代码实现较为简单,如下

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        max_data <= 0;
        mid_data <= 0;
        min_data <= 0;
    end
    else begin
        if(data1>=data2 && data1>=data3)
            max_data <= data1;
        else if(data2>=data1 && data2>=data3)
            max_data <= data2;
        else
            max_data <= data3;
        if((data1 >= data2 && data1 <= data3) || (data1 >= data3 && data1 <= data2))
            mid_data <= data1;
        else if((data2 >= data1 && data2 <= data3) || (data2 >= data3 && data2 <= data1))
            mid_data <= data2;
        else
            mid_data <= data3;
        if(data1 <= data2 &&data1 <= data3)
            min_data <= data1;
        else if(data2 <= data1 && data2 <= data3)
            min_data <= data2;
        else 
            min_data <= data3;
    end
    
end

对输入的三个数据进行大小比较以输出。至此已经可以成功实现中值滤波
四、总结
中值滤波是图像处理中常见的一种滤波方式,对椒盐噪声抑制效果较好。在硬件中的实现方式也较为简单,本次实验也成功实现中值滤波。由于实验中的图像对滤波前后的效果不明显,本次实验图未上传。
五、参考资料
1.正点原子sdk中值滤波;
2.csdn——bingbudingxz
(本文用作学习记录,如有侵权请告知作者)

标签:FPGA,max,data1,滤波,ZYNQ,rst,data,data2
From: https://www.cnblogs.com/ppptwlearning/p/18230276

相关文章