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

基于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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

连锁收银系统如何助力实体门店私域运营

作为实体门店&#xff0c;私域运营是提升客户黏性和增加复购率的重要策略之一。而连锁收银系统在私域运营中扮演了关键的角色&#xff0c;它不仅可以帮助门店管理客户信息和消费记录&#xff0c;还能够通过数据分析和营销功能提供个性化的服务和推广活动。下面看看连锁收银系统…

STM32F407 2个高级定时器生成2路无刷电机波形以及相电流采集程序(寄存器版)

stm32f407 高级定时1、定时8 生成20k 中心PWM 波形 并分别用其通道4 触发ADC1 ADC2 采样 用于分别两无刷电机foc 电流环控制&#xff0c;ADC1产生50us的电流采集完成中断&#xff0c;用于foc算法周期运算 主要参考高级定时器的寄存器和ADC寄存器 首先&#xff0c;要使用STM32F…

libcity笔记: HSTLSTMEncoder

1 __init__ 2 encode 得到的内容如下&#xff1a; data_feature的内容&#xff1a; 一共有多少个location1【包括pad的一个】最长的时间间隔&#xff08;秒&#xff09;最长的距离间隔&#xff08;千米&#xff09;多少个useer idpadding 的locationidpad_item的内容 location…

Docker三剑客从0到1

一、docker三剑客介绍 使用"三剑客"可以帮助我们解决docker host维护,多容器编排部署,多个docker host集群的各个难题。 docker-machine 创建虚拟机 我们知道docker使用了linux的内核技术(namespace 资源隔离,cgroup资源限制等),那么如果我想在windows或Mac系统上…

原地去重问题和合并有序数组问题

原地去重问题 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。这是leetcode上的一道题 这里我们用…

shell脚本之sort,uniq,tr,cut,sphit,paste,ecal与正则表达式

sort命令 uniq命令 tr命令 cut命令 sphit命令 paste命令 ecal命令 正则表达式 sort命令 sort命令---以行为单位对文件内容进行排序&#xff0c;也可以根据不同的数据类型来排序 比较原则是从首字符向后&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将他们按升序…

54.指针

目录 一.什么是指针&#xff1f; 二&#xff0e;定义一个指针变量 三&#xff0e;指针变量类型 四&#xff0e;取地址运算符& 五.取值运算符* 六.视频教程 一.什么是指针&#xff1f; 口语中的指针一般指指针变量&#xff0c;指针变量存放的是一个地址。普通变量存放…

Blender雕刻建模_衰减

衰减 从中心点向外的强度衰减。 其中 中心点&#xff1a;即笔刷选中的顶点 半径&#xff1a;即笔刷的半径 衰减范围 从中心点向外的一个球形空间&#xff08;不仅是看见的2D球&#xff0c;而是一个3D球形的空间&#xff09; 为了避免误操作有如下几种方法&#xff1a; -Al…

u3d的ab文件注意事项

//----------------LoadAllAB.cs--------------------- using System.Collections;using UnityEngine;namespace System.IO{public class LoadAllAB : MonoBehaviour{ //读取本地string path "Assets/Actors/lznh/ab/animation/t_bl/";// Use this for initiali…

【吃透Java手写】6-Netty-NIO-BIO-简易版

Netty 1 BIO&NIO模型 1.1 BIO 在JDK1.4出来之前&#xff0c;我们建立网络连接的时候采用BIO模式&#xff0c;需要先在服务端启动一个ServerSocket&#xff0c;然后在客户端启动Socket来对服务端进行通信&#xff0c;默认情况下服务端需要对每个请求建立一堆线程等待请求&…

CUDA backend requires cuDNN. Please resolve dependency or disable的解决方法

先把 C:\Program Files\NVIDIA\CUDNN\v9.0里面的bin,include,lib文件夹中最里面的文件 复制到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4中的bin,include,lib文件夹 你的路径或许有点不一样&#xff0c;但大概就是这样 注意&#xff0c;复制完后&#xff0c;文…

西南大学计算机考研,选学硕还是专硕?西南大学计算机考研考情分析!

西南大学&#xff08;Southwest University&#xff09;是教育部直属&#xff0c;教育部、农业农村部、重庆市共建的重点综合大学&#xff0c;是国家首批"双一流"建设高校&#xff0c;"211工程"和"985工程优势学科创新平台"建设高校。现任党委书…

Gradio 案例——将 dicom 文件转为 nii文件

文章目录 Gradio 案例——将 dicom 文件转为 nii文件界面截图依赖安装项目目录结构代码 Gradio 案例——将 dicom 文件转为 nii文件 利用 SimpleITK 库&#xff0c;将 dicom 文件转为 nii文件更完整、丰富的示例项目见 GitHub - AlionSSS/dcm2niix-webui: The web UI for dcm2…

OpenAI 刚刚宣布了 “GPT-4o“ 免费用户开放、通过 API 可用

OpenAI 刚刚宣布了 “GPT-4o”。它可以通过语音、视觉和文本进行推理。 该模型速度提高了 2 倍&#xff0c;价格降低了 50%&#xff0c;比 GPT-4 Turbo 的速率限制高出了 5 倍。 它将对免费用户开放、通过 API 可用。 与 GPT-4 相比&#xff0c;GPT-4o 的速度和额外的编码能力…

阿里巴巴发布最新财报,营收重回增长轨道

KlipC报道&#xff1a;5月14日&#xff0c;阿里巴巴集团发布2024财年及第四财季最新财报&#xff0c;财报显示第四财季收入2218.74亿元&#xff0c;同比增长7%&#xff0c;超出市场预期。2024财年收入同比增长8%&#xff0c;达9411.68亿元。 第四财季净利润244.2亿元人民币&am…

802.1X认证,梦回网吧的年代。

1、802.1x的原理 &#xff08;1&#xff09;802.1x的产生原因 802.1X协议作为局域网接口的一个普通接入控制机制在以太网中被广泛应用&#xff0c;主要解决以太网内认证和安全方面的问题。802.1X协议是一种基于接口的网络接入控制协议。“基于接口的网络接入控制”是指&#…

c++20---std::erase----std::erase_if

问题&#xff1a;如何删除满足条件的所有元素。 erase #include <iostream> #include <algorithm> #include <vector>int main(){std::vector<int> vec{1,2,3,1,1,1,1,1};std::erase(vec,1);for(int v:vec) std::cout<<v<<" "…

【Kafka】2.深入理解Kafka事件流平台及其核心概念

1.事件流(Event streaming) 事件流是人体中枢神经系统的数字化的等价物。它是构建“始终在线”世界的技术基础&#xff0c;在这个世界中&#xff0c;企业越来越多地被定义为软件化和自动化&#xff0c;而软件的用户本身也是软件。 从技术上讲&#xff0c;事件流是从数据库、传…

vue3专栏项目 -- 六、上传组件(上)

1、上传组件需求分析 我们还需要新建和展示文章&#xff0c;新建文章自然是发送post请求&#xff0c;同时在post中自带对应的数据&#xff0c;展示文章就是根据id取出已有的数据并且展示出来。 这里有一个难点就是上传组件&#xff0c;上传文件是App应用中最基本的需求&#…

如何在Idea离线情况下安装vue.js插件

亲践有效&#xff0c;步骤如下: 1. 互联网环境登陆vue.js官网(Vue.js - IntelliJ IDEs Plugin | Marketplace)。 2. 然后先确定你的IDEA的版本&#xff1a;在你IDEA的安装文件中找到product-info.json&#xff0c;里面的buildNumber记录着你IDEA的精确版本号&#xff0c;根据…