PotatoPie 4.0 实验教程(30) —— FPGA实现摄像头图像中值滤波

news2024/12/28 19:06:14

中值滤波是什么?

图像的中值滤波是一种非线性图像滤波方法,它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同,中值滤波不会受到极端值的影响,因此在处理存在椒盐噪声的图像时通常效果更好。

中值滤波的步骤如下:

  1. 定义邻域大小: 对于图像中的每个像素,定义一个固定大小的邻域,通常是一个正方形或矩形区域。

  2. 获取邻域像素值: 对于每个像素,获取其邻域内的像素值。

  3. 排序邻域像素值: 将邻域内的像素值按照大小进行排序,通常是从小到大或从大到小。

  4. 计算中值: 根据邻域内像素值的排序结果,找到中间位置的像素值,即中位数。

  5. 应用中值: 将中位数作为该像素的新值,用于替代原始图像中的像素值。

  6. 重复步骤: 对图像中的每个像素都重复执行上述步骤,直到整个图像都被处理过。

中值滤波的关键特点是它不受异常值的影响,因为它使用邻域内像素值的中间值来替代当前像素值,从而有效地去除噪声并保留图像的细节信息。

中值滤波是什么?

图像的中值滤波是一种非线性图像滤波方法,它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同,中值滤波不会受到极端值的影响,因此在处理存在椒盐噪声的图像时通常效果更好。

中值滤波的步骤如下:

  1. 定义邻域大小: 对于图像中的每个像素,定义一个固定大小的邻域,通常是一个正方形或矩形区域。

  2. 获取邻域像素值: 对于每个像素,获取其邻域内的像素值。

  3. 排序邻域像素值: 将邻域内的像素值按照大小进行排序,通常是从小到大或从大到小。

  4. 计算中值: 根据邻域内像素值的排序结果,找到中间位置的像素值,即中位数。

  5. 应用中值: 将中位数作为该像素的新值,用于替代原始图像中的像素值。

  6. 重复步骤: 对图像中的每个像素都重复执行上述步骤,直到整个图像都被处理过。

中值滤波的关键特点是它不受异常值的影响,因为它使用邻域内像素值的中间值来替代当前像素值,从而有效地去除噪声并保留图像的细节信息。

中值滤波的算法实现

python实现图像中值滤波的源码

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

这段 Python 代码实现了图像处理中的几个常见操作:

  1. 从文件系统中读取名为 “Lena.jpg” 的图像文件,并将其转换为灰度图像。
  2. 实现了中值滤波函数 median_filter,用于对灰度图像进行中值滤波处理。中值滤波是一种非线性滤波器,用于去除图像中的噪声,通过用像素点周围区域的中值替换当前像素值。
  3. 实现了添加椒盐噪声的函数 add_salt_pepper_noise。椒盐噪声是一种常见的图像噪声,随机将像素点的灰度值设置为黑色或白色,模拟图像传感器中的随机错误。
  4. 使用中值滤波函数处理原始灰度图像、添加椒盐噪声后的图像以及高斯噪声后的图像,并显示处理前后的结果。

整体来说,这段代码演示了如何使用 Python 和 OpenCV 库对图像进行中值滤波处理以及添加椒盐噪声,并展示了处理前后的图像效果。

MATLAB实现图像中值滤波的源码

这段 MATLAB 代码实现了图像的中值滤波,包括对原始灰度图像、添加椒盐噪声后的图像以及添加高斯噪声后的图像进行中值滤波处理,并显示处理前后的图像。

  1. 首先,代码读取了名为 ‘Lena.jpg’ 的图像文件,并将其转换为灰度图像。
  2. 然后,对灰度图像进行了中值滤波处理,使用的窗口大小为3×3,即对每个像素及其周围8个像素进行排序,并将中间值作为该像素的值。
  3. 接着,代码生成了添加了椒盐噪声的图像,并对其进行了相同的中值滤波处理。
  4. 最后,代码生成了添加了高斯噪声的图像,并同样进行了中值滤波处理。

在处理后,原始灰度图像、添加椒盐噪声后的图像和添加高斯噪声后的图像分别与其对应的中值滤波处理结果一起显示在一个图像窗口中,以便比较处理前后的效果。

FPGA工程分析

工程层次图

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


img_med_fltr u_img_med_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(img_med_hs),

.o_vs(img_med_vs),

.o_de(img_med_de),

.o_r(img_med_data[23:16]),

.o_g(img_med_data[15:8] ),

.o_b(img_med_data[7:0] )

);

img_med_fltr模块源代码分析

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

// 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_p_11      ),
  .o_p12    (r_p_12      ),
  .o_p13    (r_p_13      ),  
  .o_p21    (r_p_21      ),
  .o_p22    (r_p_22      ),
  .o_p23    (r_p_23      ),    
  .o_p31    (r_p_31      ),
  .o_p32    (r_p_32      ),
  .o_p33    (r_p_33      )
);

然后对像素进行排序,分成三步:

1.先按行找出同一行中的最大值,最小值,中值,即:

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

2.从找出这三行的三个最大值中找出最大值里的最小值,同时从三行的最小值里找出最大值,还有从三行的最值里找出最中值,即:

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

3.从第2步的值里找出最终的中值reg [7:0] r_med;

具体怎么比较,verilog代码里写得比较清楚。

管脚约束

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

时序约束

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

实验效果

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

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

相关文章

pytest教程-27-分布式执行用例插件-pytest-xdist

上一小节我们学习了pytest随机执行用例插件-pytest-random-order,本小节我们讲解一下pytest分布式执行用例插件pytest-xdist。 前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟。如果一个测试人员执行需要10…

Bert基础(十八)--Bert实战:NER命名实体识别

1、命名实体识别介绍 1.1 简介 命名实体识别(NER)是自然语言处理(NLP)中的一项关键技术,它的目标是从文本中识别出具有特定意义或指代性强的实体,并对这些实体进行分类。这些实体通常包括人名、地名、组织…

【Linux】make 和 makefile

进度条 #pragma once#include <stdio.h>#define NUM 102 #define BODY #define TOP 100 #define RIGHT >extern void processbar(int rate);#include "processBar.h" #include <string.h> #include <unistd.h>const char lable[] "|/-\…

排序试题解析(二)

8.4.3 01.在以下排序算法中&#xff0c;每次从未排序的记录中选取最小关键字的记录&#xff0c;加入已排序记录的 末尾&#xff0c;该排序算法是( A ). A.简单选择排序 B.冒泡排序 C.堆排序 D.直接插入排序 02&#xff0e;简单选择排序算法的比较次数和移动次数分别为( C )。…

苹果可能将OpenAI技术集成至iOS/iPadOS 18

&#x1f989; AI新闻 &#x1f680; 苹果可能将OpenAI技术集成至iOS/iPadOS 18 摘要&#xff1a;苹果正在与OpenAI就将GPT技术部署在iOS/iPadOS 18中进行谈判。这项技术被视为可能增强的Siri功能&#xff0c;即“AI聊天机器人”。除Siri外&#xff0c;新技术还可能改善Spotl…

RFC 6071: IP Security (IPsec) and Internet Key Exchange (IKE) Document Roadmap

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/96882d1fb67b4383bc77c4dd421f7b

LeetCode 面试题 17.08 —— 马戏团人塔

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;我们对人的身高按照从小到大排序&#xff0c;特别注意&#xff0c;对于身高相等的人&#xff0c;要按照体重从高到低排序。这时候&#xff0c;序列已经满足了在上面的人要比下面的人矮一点&#…

Blender面操作

1.细分Subdivide -选择一个面 -右键&#xff0c;细分 -微调&#xff0c;设置切割次数 2.删除 -选择一个或多个面&#xff0c;按X键 -选择要删除的是面&#xff0c;线还是点 3.挤出面Extrude -选择一个面 -Extrude工具 -拖拽手柄&#xff0c;向外挤出 -微调&#xff…

【Linux】基础指令

文章目录 基础指令1. pwd 指令2. cd 指令3. ls 指令4. touch 指令5. mkdir 指令6. rmdir 和 rm 指令7. man 指令8. cp 指令9. mv 指令10. cat 指令11. more 和 less 指令12. head 和 tail 指令13. date 指令14. cal 指令15. find 指令16. grep 指令18. zip 和 unzip 指令19. ta…

科学高效备考AMC8和AMC10竞赛,吃透2000-2024年1850道真题和解析

多做真题&#xff0c;吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一&#xff0c;通过做真题&#xff0c;可以帮助孩子找到真实竞赛的感觉&#xff0c;而且更加贴近比赛的内容&#xff0c;可以通过真题查漏补缺&#xff0c;更有针对性的补齐知识的短板。 AMC8和AMC10…

元宇宙中的DAPP:你了解多少?

元宇宙是什么&#xff1f;这是一个在当今科技圈炙手可热的话题。而在元宇宙中&#xff0c;DAPP起着至关重要的角色&#xff0c;它作为连接现实世界与虚拟世界的桥梁&#xff0c;为未来的数字世界开启了一个全新的篇章。 一、元宇宙&#xff1a;一个虚拟的数字世界 元宇宙是一…

振弦采集仪在岩土工程监测中的误差分析及提高措施探讨振弦

振弦采集仪在岩土工程监测中的误差分析及提高措施探讨 振弦采集仪是岩土工程监测中常用的一种测量设备&#xff0c;广泛应用于地基沉降、岩土体固结、地下水位变化等监测工作中。然而&#xff0c;在实际应用中&#xff0c;振弦采集仪可能存在一些误差&#xff0c;影响监测结果…

vue学习的预备知识为学好vue打好基础

目录 Vue是什么 &#xff1f;如何使用Vue &#xff1f;Vue ApiVue入口apiVue实例apiVue函数api 无构建过程的渐进式增强静态HTMLVue模块化构建工具npmyarnWebpackvue-cliVite Vue是什么 &#xff1f; 文章基于Vue3叙述。 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于…

基于Springboot的考研资讯平台

基于SpringbootVue的考研资讯平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 考研资讯 报考指南 资料信息 论坛信息 后台登录 考研资讯管理 学生管理 资…

将静态资源解析成组件使用的库

vite版本的vite-plugin-svgr vite-plugin-svgr - npm 使用

实现SpringMVC底层机制(三)

文章目录 1.封装请求数据1.将方法的httpservletrequest和httpservletresponse参数封装到参数数组进行反射调用1.修改SunDispatcherServlet.java的executeDispatch方法2.debug测试 2.封装http请求参数1.需求分析2.自定义注解RequestsParam3.修改MonsterService接口&#xff0c;添…

Python PyTorch 获取 MNIST 数据

Python PyTorch 获取 MNIST 数据 1 PyTorch 获取 MNIST 数据2 PyTorch 保存 MNIST 数据3 PyTorch 显示 MNIST 数据 1 PyTorch 获取 MNIST 数据 import torch import numpy as np import matplotlib.pyplot as plt # type: ignore from torchvision import datasets, transform…

Rust 实战练习 - 12. Axum Web 简单demo

Rust Web 历程 Rust 的异步框架tokio非他莫属&#xff0c;而web框架一直是悬而未决&#xff0c;说到底还是因为没有官方成熟的方案指引&#xff0c;大家各玩各的&#xff0c;互不兼容&#xff0c;白白浪费精力。 这个事情一直等到半官方组织tokio推出axum有了改善。但是市场上…

【神经网络结构可视化】PlotNeuralNet的安装、测试及创建自己的神经网络结构可视化图形

文章目录 前提准备1、下载MikTeX2、下载Git bash3、下载PlotNeuralNet 进行测试1、解压PlotNeuralNet-master.zip2、打开Git bash3、 在my_project中查看生成的pdf文件 创建自己的神经网络结构可视化图形 前提准备 1、下载MikTeX 下载链接&#xff1a; MikTeX ( https://mikt…

RestfulApi RestTemplate代码规范介绍

1.介绍 1.1 RestfulApi Restful API 是一种设计风格&#xff0c;代表了使用 HTTP 协议构建 web 服务的一种架构原则。REST&#xff08;Representational State Transfer&#xff09;的核心思想是&#xff0c;通过 URL 定位资源&#xff0c;使用 HTTP 方法&#xff08;GET, POS…