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

server/2024/10/18 16:49:41/

中值滤波是什么?

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

中值滤波的步骤如下:

  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.ppmy.cn/server/28799.html

相关文章

CM3:lldb 调试 qemu 跑的程序

正文 环境:macOS M1。 QEMU可以通过启动一个GDB调试端口来允许使用GDB调试正在运行的虚拟机,我们要做的就是通过 gdb 或者 lldb 连接到这个端口,然后进行调试。 我们先写一个简单的CM3 程序: .equ STACK_TOP, 0x20000800.text.gl…

MWCNTs微纳米纤维膜的制备

MWCNTs微纳米纤维膜是一种由多壁碳纳米管(MWCNTs)与聚合物纤维复合而成的纳米纤维膜。这种材料结合了MWCNTs的良好性能和纳米纤维膜的高比表面积、高通量等特点,具有广泛的应用前景。 在制备过程中,首先需要对MWCNTs进行酸化处理和…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构:分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变,软件架构也需要同步进行升级,引入面向服务的架构(Service-Oriented Architecture,简称 SOA)方法论。…

2024年第二十六届“华东杯”(A题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看华东杯 (A题)! 问题一&a…

前端科举八股文-CSS篇

前端科举面经-CSS篇 Css选择器的优先级css盒模型行内元素和块级元素的区别?link标签和import标签的区别讲一下弹性盒子布局的常见属性flex是哪三个属性的简写什么是BFC? 有什么作用垂直居中的方法?visibilityhidden, opacity0,display:none的区别清除浮…

服务器远程连接jupyter notebook

目录 服务器远程连接jupyter notebook1、在服务器端安装notebook2、在服务器端的设置Step 1:Step 2:Step 3: 3. 在服务器端运行jupyter4、在windows 上连接远程服务器 参考资料 服务器远程连接jupyter notebook 1、在服务器端安装notebook conda install jupyter notebook 2…

全栈开发之路——前端篇(2)文件、组件与setup引入

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 本文系该系列第二篇,主要将介绍各个文件的意义、组件结构与导入以及setup的引入。 目录 一、src外文件介绍.gitignore为git忽略文件env.d.ts用于识别其他文件index.htmljson文件vite.confi…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后,发现是出现汉化不完全或者部分汉化的情况,如下图: 解决方法: 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析:安…