PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波

什么是高斯滤波

高斯滤波是一种常见的图像处理技术,用于去除图像中的噪声和平滑图像。它的原理基于统计学中的高斯分布(也称为正态分布)。

在高斯滤波中,一个二维的高斯核函数被用来对图像中的每个像素进行加权平均。这个高斯核函数定义了一个权重分布,使得距离中心像素越远的像素在平均过程中具有较小的权重,而距离中心像素越近的像素具有较大的权重。这种权重的分布导致了一个平滑的效果,因为图像中每个像素的值都是由周围像素的加权平均所决定的。

高斯滤波的主要优点是能够有效地去除高斯噪声和其他类型的噪声,同时保持图像的边缘和细节。然而,它也有一些缺点,例如在处理大尺度的噪声时可能会丢失一些细节信息,并且计算复杂度较高。

在实际应用中,高斯滤波常常被用来作为图像预处理的步骤,以提高后续图像处理算法的性能,例如边缘检测、图像分割等。

高斯滤波算子是指用于执行高斯滤波操作的核或矩阵。这个算子是一个二维的矩阵,其中的元素值是按照高斯函数的形式进行定义的。对于一个给定的高斯滤波算子,其大小(通常是一个奇数)和标准差(控制高斯分布的宽度)是两个关键的参数。一般来说,较大的标准差会导致一个更广泛的权重分布,从而导致更加平滑的结果。高斯滤波算子的中心元素具有最大的权重,而周围的元素权重则随着它们与中心元素的距离递减。这种权重的分布使得该滤波器对图像中的噪声有针对性地进行平滑处理,同时保留图像的细节和边缘。

通常情况下,高斯滤波算子的大小是一个正方形矩阵,其元素值是通过高斯函数计算得到的。例如,一个3×3的高斯滤波算子如下所示:

1 2 1
2 4 2
1 2 1

这里的权重是通过一个标准差为1的高斯函数计算得到的。实际应用中,为了减少计算复杂度,常常会对这个矩阵进行归一化,使得权重之和等于1。

高斯滤波的步骤和算法实现

  1. 确定高斯核大小和标准差: 首先需要确定高斯核的大小,通常选择一个奇数大小的核,例如3×3、5×5等。同时,还需要指定高斯核的标准差,标准差越大,权重分布越广,平滑效果越明显。

  2. 构建高斯核: 根据确定的大小和标准差,构建一个二维高斯函数作为滤波核。

  3. 对图像进行卷积: 将构建的高斯核应用于原始图像上,对每个像素及其周围像素进行加权平均。这一步实质上是将高斯核与图像进行卷积操作,计算每个像素点的新值。

  4. 边界处理: 在卷积过程中,需要考虑图像边界的处理。通常可以采用各种边界填充方式,如零填充、复制边界像素值等,以确保卷积操作在边界处能够正确进行。

  5. 输出结果: 最终得到经过高斯滤波处理后的图像,其中噪声已经被平滑,图像边缘和细节得到保留。

python实现高斯滤波算法源码

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段代码实现了以下功能:

  1. 读取图像文件并转换为灰度图像:从文件系统中读取名为”Lena.jpg”的图像文件,并将其转换为灰度图像。

  2. 高斯滤波处理:对原始灰度图像进行高斯滤波处理,以消除图像中的噪声。使用了一个 3×3 的高斯核进行滤波操作。

  3. 添加椒盐噪声:对原始灰度图像添加椒盐噪声,以模拟图像中的噪声情况。

  4. 高斯滤波处理(含椒盐噪声):对添加了椒盐噪声的灰度图像进行高斯滤波处理,以消除噪声并保留图像细节。

  5. 添加高斯噪声:对原始灰度图像添加高斯噪声,以模拟图像中的噪声情况。

  6. 高斯滤波处理(含高斯噪声):对添加了高斯噪声的灰度图像进行高斯滤波处理,以消除噪声并保留图像细节。

  7. 显示结果图像:使用matplotlib库将原始灰度图像、高斯滤波处理后的图像、添加椒盐噪声后的图像、高斯滤波处理后的图像(含椒盐噪声)、添加高斯噪声后的图像、以及高斯滤波处理后的图像(含高斯噪声)进行显示。

MATLAB实现高斯滤波算法源码

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段代码加载了一张名为”Lena.jpg”的图片,并对其进行了以下处理:

  1. 将图片转换为灰度图像。
  2. 对原始灰度图像执行高斯滤波。
  3. 向原始灰度图像添加椒盐噪声,然后对其执行高斯滤波。
  4. 向原始灰度图像添加高斯噪声,然后对其执行高斯滤波。

最后,代码将这些处理后的图像以子图形式显示出来。

FPGA工程分析

工程层次图

demo18相比,只是多了一个img_gaus_fltr的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。
 

img_gaus_fltr u_img_gaus_fltr(
    .i_clk(clk_pixel),
    .i_rst_n(sys_rst_n),
    .i_hs(VGA_HS),
    .i_vs(VGA_VS),
    .i_de(VGA_DE),
    .i_r(VGA_RGB[23:16]),
    .i_g(VGA_RGB[15:8] ),
    .i_b(VGA_RGB[7:0]  ),        
    .o_hs(gaus_hs),
    .o_vs(gaus_vs),
    .o_de(gaus_de),   
    .o_r(gaus_data[23:16]),
    .o_g(gaus_data[15:8] ),
    .o_b(gaus_data[7:0]  )
);

img_gaus_fltr模块源代码分析

跟前面几篇教程一样,我们都需要先用行缓存将像素转化为同时输出3行3列来,后面的讲解都以R通道为例,因为其它三个通道的行为是一样的:

img_buf u_r_buf
(
  .i_clk    (i_clk        ),
  .i_rst_n  (i_rst_n      ),
  .i_de    (i_de        ),
  .i_data    (i_r        ),
  .o_de    (          ),
  .o_p11    (r_p11      ),
  .o_p12    (r_p12      ),
  .o_p13    (r_p13      ),  
  .o_p21    (r_p21      ),
  .o_p22    (r_p22      ),
  .o_p23    (r_p23      ),    
  .o_p31    (r_p31      ),
  .o_p32    (r_p32      ),
  .o_p33    (r_p33      )
);

然后对像素进行高斯滤波,分成三步:

1.先计算每一行的和,注意代码中运用移位优化了 *2 和*4的操作。

PotatoPie 4.0 实验教程(31) —— FPGA实现摄像头图像高斯滤波-Anlogic-安路论坛-FPGA CPLD-ChipDebug

2.然后计算总和:sum_r <= sum_r1 + sum_r2 + sum_r3;

3.然后取和的高8位为有效位,相当于除以16:gau_r <= sum_r[11:4];

管脚约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

时序约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

实验效果

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

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

相关文章

【沉淀之华】从0到1实现用户推荐 - 实时特征系统构建,包含特征计算,特征存储,特征查询,特征补偿超详细思路分享

文章目录 背景介绍设计初衷基本概念 技术架构"四高"特征存储特征计算特征查询特征补偿 技术难点Q&A彩蛋 背景介绍 设计初衷 作为用户推荐系统的支撑系统之一&#xff1a;用户实时特征系统有着举足轻重的重要&#xff0c;甚至说它是一起推荐行为触发的必要条件。…

【经典算法】LeetCode 160. 相交链表(Java/C/Python3/Go实现含注释说明,Easy)

目录 题目描述思路及实现方式一&#xff1a;哈希表思路代码实现Java版本C语言版本Python3版本Golang版本 复杂度分析 方式二&#xff1a;双指针思路代码实现Java版本C语言版本Python3版本Golang版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;链表 题目描述 给你两…

C语言——操作符保姆级教学(含整形提升及算数转换)

操作符 一.操作符的分类二.原码、反码、补码三.移位操作符1.左移操作符&#xff1a;<<2.右移操作符&#xff1a;>> 四.位操作符1.按位与—— &2.按位或—— |3.按位异或—— ^4.按位取反—— ~ 五.逗号表达式六.条件操作符七.操作符的属性&#xff1a;优先级、…

如何配置和使用Apollo的component里的plugin

关于如何使用Apollo的Component里的plugin&#xff0c;在Apollo的文档里只有如果和开发的说明却没有找到一个清楚完整说明怎么把plugin跑起来的说明&#xff0c;例如我想把lidar_detection_filter按我们的需求对目标过滤算法作修改然后编译完后&#xff0c;执行 cyber_launch …

【数据结构】链表专题3

前言 本篇博客我们继续来讨论链表专题&#xff0c;今天的链表算法题是经典中的经典 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.判断链表是否…

Dom获取属性操作

目录 1. 基本认知 1.1 目的和内容 1.2 什么是DOM 1.3 DOM对象 1.4 DOM树 2. 获取DOM元素对象 2.1 选择匹配到的第一个元素 2.2 选择匹配到的多个元素 2.3 其他获取DOM元素方法 3. 操作元素内容 3.1 元素对象.innerText 属性 3.2 元素对象.innerHTML 属性 4. 操作元…

springcloud微服务搭建多数据源(mysql,oracle,postgres,等等)管理模块,支持通过注解方式切换不同类型的数据库

1.背景 同一套微服务管理系统&#xff0c;业务完全一样&#xff0c;但不同的客户可能要求使用自己熟悉的数据库&#xff0c;比如&#xff0c;mysql&#xff0c;oracle&#xff0c;postgres&#xff0c;还有一些国产数据库。如果能够将数据库模块独立出来&#xff0c;兼容各家的…

IDEA启动项目报错:Error running ‘‘: Command line is too long.

1、在workspace.xml 2、 在标签 <component name"PropertiesComponent"> 添加 <property name"dynamic.classpath" value"true" />

MySQL 运维篇

回顾基本语句&#xff1a; 数据定义语言(DDL) 这类语言用于定义和修改数据库的结构&#xff0c;包括创建、删除和修改数据库、 表、视图和索引等对象。 主要的语句关键字包括 CREATE 、 DROP 、 ALTER 、 RENAME 、 TRUNCATE 等。 create database 数据库 &#xff1b; cr…

【MySQL | 第十一篇】一条SQL语句在MySQL的执行过程

文章目录 11.一条SQL语句在MySQL的执行过程11.1MySQL整体架构11.2SQL语句在Server层执行流程11.3拓展&#xff1a;InnoDB存储引擎的更新操作11.3.1问题&#xff1a;为什么写了redolog日志还要写binlog日志&#xff1f;11.3.2问题&#xff1a;为什么要两阶段提交&#xff1f;11.…

《QT实用小工具·四十七》可交互的创意动态按钮

1、概述 源码放在文章末尾 该项目实现了可交互的创意动态按钮&#xff0c;包含如下功能&#xff1a; 所有颜色自定义 鼠标悬浮渐变 两种点击效果&#xff1a;鼠标点击渐变 / 水波纹动画&#xff08;可多层波纹叠加&#xff09; 额外鼠标移入/移出/按下/弹起的实时/延迟共8种事…

springboot 自动配置源码解读

什么是自动装配 当我们程序依赖第三方功能组件时&#xff0c;不需要手动将这些组件类加载到IOC容器中。例如 当程序需要用到redis时&#xff0c;在pom.xml文件中引入依赖&#xff0c;然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。 SpringBootApplication …

【已解决】json文件太大无法打开怎么办+ijson报错

下载了一个json文档&#xff0c;尝试了全部的编辑器都打不开。。。 搜了搜或许可以使用ijson GitHub - ICRAR/ijson: Iterative JSON parser with Pythonic interfaces "Ijson is an iterative JSON parser with standard Python iterator interfaces." 示例代码&…

【C++ —— 多态】

C —— 多态 多态的概念多态的定义和实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变&#xff1a;析构函数的重写 C11 override和final重载、覆盖(重写)、隐藏(重定义)的对比 抽象类概念接口继承和实现继承 多态的继承虚函数表多态的原理动态绑定和静态绑定 单继…

VTK 的可视化方法:Glyph

VTK 的可视化方法&#xff1a;Glyph VTK 的可视化方法&#xff1a;Glyph标量、向量、张量将多边形数据的采集点法向量标记成锥形符号参考 VTK 的可视化方法&#xff1a;Glyph 模型的法向量数据是向量数据&#xff0c;因此法向量不能像前面讲到的通过颜色映射来显示。但是可以通…

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式&#xff0c;下面详细解释并提供相应的举例&#xff1a; 使用var关键字声明的全局变量&#xff1a; var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量&#xff08;不推荐使用&…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

(刷题记录2)随机链表的复制

[刷题记录2]随机链表的复制 题目信息&#xff1a;题目思路(环境来自力扣OJ的C语言)&#xff1a;复杂度&#xff1a;代码和解释&#xff1a;1.遍历一遍原链表的同时&#xff0c;在每个原节点后面插入一个相同的新节点&#xff0c;共插入 n 个新节点。2.利用两者联系&#xff0c;…

神奇的Vue3 - 组件探索

神奇的Vue3 第一章 神奇的Vue3—基础篇 第二章 神奇的Vue3—Pinia 文章目录 神奇的Vue3了解组件一、注册组件1. 全局注册​2. 局部注册3. 组件命名 二、属性详解1. Props&#xff08;1&#xff09;基础使用方法&#xff08;2&#xff09;数据流向&#xff1a;单项绑定原则&…

ThreeJS:Mesh网格与三维变换

Mesh网格 ThreeJS中&#xff0c;Mesh表示基于以三角形为多边形网格(polygon mesh)的物体的类&#xff0c;同时也作为其它类的基类。 通过Mesh网格&#xff0c;我们可以组合Geometry几何体与Material材质属性&#xff0c;在3D世界中&#xff0c;定义一个物体。例如&#xff1a;之…