基于EBAZ4205矿板的图像处理:05均值滤波算法

news2024/9/23 9:32:55

基于EBAZ4205矿板的图像处理:05均值滤波算法

项目全部文件已经上传,是免费的

先看效果

请添加图片描述
可以明显看到图像变糊了,这就是均值滤波的特点,将噪声均摊到每个点上的同时,也会让图像丢失细节。

算法讲解

均值滤波,简直是太简单了,就是用一个滑动窗口的所有像素点的均值代替该滑动窗口的中心像素点的的像素值。

算法的FPGA部署

在这里插入图片描述
算法本身很简单,但是这里的实现思想却很重要!!

均值计算,自然少不了除法,计算均值就是sum/N,但是,对于FPGA而言,涉及到浮点数的除法预算很耗时,所以这里最推荐的做法就是将分子和分母都整数倍扩大,让sum乘上一个很大的数,然后移位除法,这样就实现了用整型运算替代了浮点数运算,大幅节约了运算耗时,和运算资源。

所以这里的做法是sumx3641,然后右移15位(移位除法),再加上sumx3641的第14位(四舍五入)。

block design

在这里插入图片描述
其实和我的上一篇是一样的,只有video_procress 模块里面代码不一样

项目代码

video_process 模块

module video_processor(
    (* X_INTERFACE_IGNORE = "true" *) input         frame_clk,    //cmos 像素时钟
    (* X_INTERFACE_IGNORE = "true" *) input         frame_rst_n,  
    
    //预处理图像
    (* X_INTERFACE_IGNORE = "true" *) input         pre_vsync, //预处理图像场同步信号
    (* X_INTERFACE_IGNORE = "true" *) input [23:0]  pre_data,  //预处理图像数据
    (* X_INTERFACE_IGNORE = "true" *) input         pre_href,  //预处理图像数据有效信号
    (* X_INTERFACE_IGNORE = "true" *) input         pre_frame_ce, //预处理图像时钟使能信号

    //阈值控制
    (* X_INTERFACE_IGNORE = "true" *) input [7:0 ]  loc_bin_thresh_coefficient, //来自PS端的局部二值化阈值系数

        
    //处理后图像
    (* X_INTERFACE_IGNORE = "true" *) output        pos_vsync, //处理后图像场同步信号
    (* X_INTERFACE_IGNORE = "true" *) output [23:0] pos_data,  //处理后图像数据
    (* X_INTERFACE_IGNORE = "true" *) output        pos_href, //处理后图像数据有效信号
    (* X_INTERFACE_IGNORE = "true" *) output        pos_frame_ce //处理后图像时钟使能信号  
);

//wire define 
wire [7:0] gray_data ;
wire       gray_vsync;
wire       gray_frame_ce;
wire       gray_href;

//*****************************************************
//**                    main code
//*****************************************************
//rgb转ycbcr模块
rgb2gray  u_rgb2gray(
    .cmos_frame_clk     (frame_clk      ),
    .cmos_rstn          (frame_rst_n    ),//同步复位
    .cmos_frame_vsync   (pre_vsync      ),
    .cmos_frame_data    (pre_data       ),
    .cmos_frame_href    (pre_href       ),
    .cmos_frame_ce      (pre_frame_ce   ),

    .dataout_frame_vsync(gray_vsync     ),
    .dataout_frame_data (gray_data      ),
    .dataout_frame_href (gray_href      ),
    .dataout_frame_ce   (gray_frame_ce  )
);
//wire define
wire        matrix_frame_vsync;
wire        matrix_frame_href;
wire        matrix_frame_ce;
wire [7:0]  matrix_p11; //3X3 矩阵数据
wire [7:0]  matrix_p12; 
wire [7:0]  matrix_p13;
wire [7:0]  matrix_p21; 
wire [7:0]  matrix_p22; 
wire [7:0]  matrix_p23;
wire [7:0]  matrix_p31; 
wire [7:0]  matrix_p32; 
wire [7:0]  matrix_p33;

 VIP_matrix_generate_3x3_8bit u_VIP_matrix_generate_3x3_8bit(
    .clk                (frame_clk      ), 
    .rst_n              (frame_rst_n    ),
    .per_frame_vsync    (gray_vsync     ),
    .per_frame_href     (gray_href      ), 
    .per_frame_ce       (gray_frame_ce      ),
    .per_img_Y          (gray_data  ),
    
    //输出3x3矩阵
    .matrix_frame_vsync (matrix_frame_vsync ),
    .matrix_frame_href  (matrix_frame_href  ),
    .matrix_frame_ce    (matrix_frame_ce    ),
    .matrix_p11         (matrix_p11),    
    .matrix_p12         (matrix_p12),    
    .matrix_p13         (matrix_p13),
    .matrix_p21         (matrix_p21),    
    .matrix_p22         (matrix_p22),    
    .matrix_p23         (matrix_p23),
    .matrix_p31         (matrix_p31),    
    .matrix_p32         (matrix_p32),    
    .matrix_p33         (matrix_p33)
);
avg_filter   u_avg_filter(
    .clk                     (frame_clk             ),
    .rst_n                   (frame_rst_n           ),
    .matrix_img_vsync        (matrix_frame_vsync    ),
    .matrix_img_href         (matrix_frame_href     ),
    .matrix_frame_ce         (matrix_frame_ce       ),
    .matrix_p11              (matrix_p11            ),
    .matrix_p12              (matrix_p12            ),
    .matrix_p13              (matrix_p13            ),
    .matrix_p21              (matrix_p21            ),
    .matrix_p22              (matrix_p22            ),
    .matrix_p23              (matrix_p23            ),
    .matrix_p31              (matrix_p31            ),
    .matrix_p32              (matrix_p32            ),
    .matrix_p33              (matrix_p33            ),
    .dataout_vsync           (pos_vsync             ),       
    .dataout_href            (pos_href              ),       
    .dataout_gray            (pos_data              ),       
    .dataout_frame_ce        (pos_frame_ce          ));
endmodule 

均值滤波模块

`timescale 1ns / 1ps
//作者:抢公主的大魔王
//日期:24.5.15


module avg_filter(
        (* X_INTERFACE_IGNORE = "true" *) input   wire                     clk             ,
        (* X_INTERFACE_IGNORE = "true" *) input   wire                     rst_n           ,
        (* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_img_vsync,
        (* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_img_href,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p11,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p12,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p13,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p21,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p22,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p23,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p31,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p32,
        (* X_INTERFACE_IGNORE = "true" *) input   wire    [7:0]            matrix_p33,
        (* X_INTERFACE_IGNORE = "true" *) input   wire                     matrix_frame_ce,
        (* X_INTERFACE_IGNORE = "true" *) output reg                       dataout_vsync  ,       //  processed Image data vsync valid signal
        (* X_INTERFACE_IGNORE = "true" *) output reg                       dataout_href   ,       //  processed Image data href vaild  signal
        (* X_INTERFACE_IGNORE = "true" *) output reg      [23:0]           dataout_gray ,          //  processed Image brightness output
        (* X_INTERFACE_IGNORE = "true" *) output reg                       dataout_frame_ce
    );  
//----------------------------------------------------------------------
//  calc sum of [p11,p12,p13;p21,p22,p23;p31,p32,p33]
reg             [ 9:0]          data_sum1;
reg             [ 9:0]          data_sum2;
reg             [ 9:0]          data_sum3;
reg             [11:0]          data_sum;

always @(posedge clk)
begin
    data_sum1 <= matrix_p11 + matrix_p12 + matrix_p13;
    data_sum2 <= matrix_p21 + matrix_p22 + matrix_p23;
    data_sum3 <= matrix_p31 + matrix_p32 + matrix_p33;
    data_sum  <= data_sum1 + data_sum2 + data_sum3;
end

//----------------------------------------------------------------------
//  avg_data = round(data_sum/9.0) -> avg_data = round(data_sum*3641 >> 15)
reg             [22:0]          data_mult;

always @(posedge clk)
begin
    data_mult <= data_sum * 12'd3641;
end

reg             [7:0]           avg_data;

always @(posedge clk)
begin
    avg_data <= data_mult[22:15] + data_mult[14];
end

//----------------------------------------------------------------------
//  lag 4 clocks signal sync
reg             [3:0]           matrix_img_vsync_r1;
reg             [3:0]           matrix_img_href_r1;
reg             [3:0]           matrix_frame_ce_r1;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        matrix_img_vsync_r1 <= 4'b0;
        matrix_img_href_r1  <= 4'b0;
        matrix_frame_ce_r1  <= 4'b0;
    end
    else
    begin
        matrix_img_vsync_r1 <= {matrix_img_vsync_r1[2:0],matrix_img_vsync};
        matrix_img_href_r1  <= {matrix_img_href_r1[2:0],matrix_img_href};
        matrix_frame_ce_r1  <= {matrix_frame_ce_r1[2:0],matrix_frame_ce};
    end
end

reg             [7:0]           matrix_p22_r1       [0:3];

always @(posedge clk)
begin
    matrix_p22_r1[0] <= matrix_p22;
    matrix_p22_r1[1] <= matrix_p22_r1[0];
    matrix_p22_r1[2] <= matrix_p22_r1[1];
    matrix_p22_r1[3] <= matrix_p22_r1[2];
end

//----------------------------------------------------------------------
//  result output
always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        dataout_gray <= 'd0;
    else
        dataout_gray <= {3{avg_data}};
end

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        dataout_vsync <= 1'b0;
        dataout_href  <= 1'b0;
        dataout_frame_ce <= 1'b0;
    end
    else
    begin
        dataout_vsync <= matrix_img_vsync_r1[3];
        dataout_href  <= matrix_img_href_r1[3];
        dataout_frame_ce <= matrix_frame_ce_r1[3];
    end
end

endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【十大排序算法】----选择排序(详细图解分析+实现,小白一看就会)

目录 一&#xff1a;选择排序——原理 二&#xff1a;选择排序——分析 三&#xff1a;选择排序——实现 四&#xff1a;选择排序——优化 五&#xff1a;选择排序——效率 一&#xff1a;选择排序——原理 选择排序的原理&#xff1a;通过遍历数组&#xff0c;选出该数组…

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事&#xff1a; Linux之父叫做“Linus Torvalds”&#xff0c;我们简称为雷纳斯。Linux是开源项目&#xff0c;所以在Linux的早期开发中&#xff0c;许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时&#xff0c;雷纳斯每天都会收到许许…

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

如何进行事务处理

1、问题背景 在数据库存储系统中&#xff0c;事务处理是一种保证多个数据库操作作为单个逻辑单元执行的技术。事务处理可以确保数据的一致性、完整性和隔离性。 在使用 Google Cloud Datastore 时&#xff0c;可以使用 datastore.transaction() 函数来进行事务处理。datastor…

ubuntu在conda环境中使用 pip install -r requirements.txt但是没有安装在虚拟环境中

whereis pip pip listubuntu在conda环境中使用pip install lpips0.1.3 但是安装在了这里 Requirement already satisfied: lpips0.1.3 in /home/uriky/anaconda3/lib/python3.11/site-packages (0.1.3) 就会出现黄色波浪&#xff0c;未在虚拟环境中安装包 解决办法1&#xff1…

在云服务器上运行StyleGAN3生成伪样本

首先是传入数据&#xff0c;这里我们不做赘述。 对于数据格式的裁剪&#xff0c;可以通过以下代码进行&#xff1a; from glob import glob from PIL import Image import os from tqdm import tqdm from tqdm.std import trangeimg_path glob(r"C:\Users\Administrato…

uniapp使用地图开发app, renderjs使用方法及注意事项

上次提到uniapp开发地图app时得一些问题&#xff0c;最后提到使用renderjs实现app中使用任何地图&#xff08;下面将以腾讯地图为例&#xff0c;uniapp中写app时推荐使用得是高德地图&#xff0c;无法使用腾讯地图&#xff08;renderjs方式除外&#xff09;&#xff09;。 1、…

独立静态ISP:互联网连接的新选择

在数字化时代&#xff0c;互联网连接的质量直接影响着我们的工作与生活。随着技术的发展&#xff0c;独立静态ISP&#xff08;Internet Service Provider&#xff0c;互联网服务提供商&#xff09;逐渐成为企业和个人用户关注的焦点。本文将从五个方面探讨独立静态ISP的优势、应…

Trieve实践:好用功的开源RAG

目录 RAG概述 RAG架构 Trieve Trieve介绍 Trieve使用 初始化 自行搭建RAG Trieve是什么&#xff0c;RAG是什么&#xff0c;本文来带你了解。其实在很多产品应用里面都会有RAG,比如ai客服&#xff0c;针对性的智能问答&#xff0c;都是基于RAG实现的 RAG概述 RAG 是一种…

【竞技宝】英超:曼城击败热刺,赢西汉姆联就夺冠

曼城在英超补赛中跟热刺相遇,这场比赛对于双方来说都必须赢。曼城要是拿不下热刺,联赛夺冠形势就不容乐观。热刺则是需要击败曼城,保留拿到下赛季欧冠的一线希望。所以,热刺和曼城开场就全力以赴。上半场热刺和曼城门将都做出精彩扑救,比分维持在0比0。下半场曼城金靴哈兰德发威…

基于springboot实现医药管理系统项目【项目源码+论文说明】

基于springboot实现医药管理系统演示 摘要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&…

airmon-ng start wlan0

错误原因&#xff1a;有一些后台程序干扰&#xff0c;导致无法成功启动监听模式 解决&#xff0c;关闭提示的进程即可 kill -9 PID号

apache与nginx下安装zabbix

apache下安装zabbix #进入zabbix官网 https://www.zabbix.com/ #选择好要配置的服务#安装zabbix存储库 [rootzabbix-server ~]# rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm [rootzabbix-server ~]# yum clean all #清理…

C++ STL概念之 迭代器

什么是迭代器 迭代器&#xff08;Iterator&#xff09;是一个在容器中访问元素的对象&#xff0c;提供了一种方法来顺序访问容器中的元素&#xff0c;而无需暴露容器的底层表示。 或者说 行为像指针一样的类型。可能是指针也可能是被类封装的指针&#xff0c;不关注容器底层细…

SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析

原文链接&#xff1a;SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247604401&idx4&snd2d39846dce07bee765c820de1cf92f3&chksmfa821956cdf5904…

GM812条码模块的技术参数

扫码性能参数 *测试条件&#xff1a;环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; **测试条件&#xff1a;测试距离&#xff08;最小景深最大景深&#xff09;/2&#xff1b; 环境温度23℃&#xff1b;环境照度300 LUX&#xff1b; *规格如有更改&#xff0c;恕不另…

嵌入式学习72-复习(字符设备驱动框架)

编辑 drivers/char/Kconfig 为了在make menuconfig是能够显示出我们写的驱动程序 make menuconfig 编辑 drivers/char/Makefile 才是真正把编写好的源文件加入到编译中去 make modules cp drivers/char/first_driver.ko ~/nfs/rootfs/

Kotlin扩展函数和运算符重载

扩展函数 fun String.lettersCount():Int{var count 0for(i in this){if(i.isLetter())count}return count } fun main(){val str:String "12we"println(str.lettersCount()) } 相当于直接将方法写在类里面。函数体内可以直接使用this而不用传参。 运算符重载 …

织梦dedecms企业网站模板安装教程

很多新手在拿到织梦模板后不知道如何安装&#xff0c;所以&#xff0c;云部落(Yunbuluo.Net)资源网专门整理了一份图文版织梦模板通用安装教程&#xff0c;希望对大家有所帮助。 第一步&#xff1a; 将域名解析绑定好之后&#xff0c;上传下载的模板至您的WEB根目录中&#xf…

品鉴中的食物搭配:如何创造美味的红酒与食物组合

品鉴云仓酒庄雷盛红酒时&#xff0c;食物搭配是一个不可忽视的环节。通过巧妙的搭配&#xff0c;红酒与食物可以相互衬托&#xff0c;呈现出更加美妙的风味。下面就让我们一起探讨如何创造美味的红酒与食物组合。 首先&#xff0c;了解红酒与食物的搭配原则是关键。一般来说&a…