FPGA/ZYNQ:中值滤波

news/2024/10/11 14:22:44

一、简述
滤波是图像处理领域应用非常广泛的工具之一,它可以改善图像质量,包括去除高频噪声与干扰、图像平滑等。我们常见的空间滤波有中值滤波和均值滤波。图像可以看成是一个定义在二维平面上的信号,该信号的幅值对应像素的灰度(彩色图像对应 RGB 三个分量)。图像的频率指的是空间频率,它和我们认知的物理频率是不同的。图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。图像的主要成分是低频信息,它形成了图像的基本灰度等级,对图像结构的决定作用较小;中频信息决定了图像的基本结构,形成了图像的主要边缘结构;高频信息形成了图像的边缘和细节,是在中频信息上对图像内容的进一步强化。
我们也可以通过空间滤波器(也称为空间掩模、模板或窗口)直接作用于图像本身而对图像进行滤波处理。空间滤波器由两部分组成:(1)邻域,(2)对该邻域包围的图像像素执行的预定义操作。领域是指一个像素点及其附近像素点所组成的空间。滤波会产生一个新像素,像素的坐标就是邻域中心的坐标,像素的值就是滤波操作的结果。
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近真实值,从而消除孤立的噪声点。

中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值近真实值,从而消除孤立的噪声点。
二、实现方法
建立3x3滤波模板,再对3x3模板中每行的值按大小排序,再按列取最大值列中的最小值,中值列中的中值,最小值中的最大值,再对取出的三个值取中值,最终得到9个值中的中值。将该值作为模板中心位置的值。
三、实现过程
1.对图像进行灰度化处理
2.对灰度化后的图像进行中值滤波,在其中调用3x3生成模块、中值提取模块
灰度化处理将在其他博客中介绍,这里不做详细介绍,3x3生成模块在上一个博客中已经做了介绍,可以查看上一个博客了解。本章主要介绍中值提取模块
reg [2:0] median_frame_vsync_r; reg [2:0] median_frame_href_r; reg [2:0] median_frame_clken_r;
首先对视频信号做延时处理,延迟三个时钟周期。

//step1 对sort3进行三次例化操作Sort3 u_Sort3_1(.clk (clk),.rst_n (rst_n),.data1 (data11),.data2 (data12),.data3 (data13),.max_data (max_data1),.mid_data (mid_data1),.min_data (min_data1));Sort3 u_Sort3_2(.clk (clk),.rst_n (rst_n),.data1 (data21),.data2 (data22),.data3 (data23),.max_data (max_data2),.mid_data (mid_data2),.min_data (min_data2));Sort3 u_Sort3_3(.clk (clk),.rst_n (rst_n),.data1 (data31),.data2 (data32),.data3 (data33),.max_data (max_data3),.mid_data (mid_data3),.min_data (min_data3));

第一步,调用三次Sort模块对3行数据进行排序(按从大到小)

Sort3 u_Sort3_4(.clk (clk),.rst_n (rst_n),.data1 (max_data1),.data2 (max_data2),.data3 (max_data3),.max_data (),.mid_data (),.min_data (max_min_data));Sort3 u_Sort3_5(.clk (clk),.rst_n (rst_n),.data1 (mid_data1),.data2 (mid_data2),.data3 (mid_data3),.max_data (),.mid_data (mid_mid_data),.min_data ());Sort3 u_Sort3_6(.clk (clk),.rst_n (rst_n),.data1 (min_data1),.data2 (min_data2),.data3 (min_data3),.max_data (min_max_data),.mid_data (),.min_data ());

第二步,再调用三次Sort模块,以列为单位求取最大值列中的最小值,中值列中的中值,最小值列中的最大值

//step3 将step2中的三个值再取中值
Sort3 u_Sort3_7(.clk (clk),.rst_n (rst_n),.data1 (max_min_data),.data2 (mid_mid_data),.data3 (min_max_data),.max_data (),.mid_data (target_data),.min_data ());

第三步,再调用一次Sort模块,求取上步三个值中的中值,以作为输出的3x3模板的中值。

always @(posedge clk or negedge rst_n)beginif(!rst_n)beginmedian_frame_clken_r <= 0;median_frame_href_r <= 0;median_frame_vsync_r <= 0;endelse beginmedian_frame_vsync_r <= {median_frame_vsync_r[1:0],median_frame_vsync};median_frame_clken_r <= {median_frame_clken_r[1:0],median_frame_clken};median_frame_href_r  <= {median_frame_href_r[1:0],median_frame_href};end
end

因为每一步Sort执行都耗费一个时钟周期,所以需要对信号做延迟处理,延迟三个时钟周期。
其中调用的Sort模块是用来排序求取最大值、最小值、中值的模块,代码实现较为简单,如下

always @(posedge clk or negedge rst_n)beginif(!rst_n)beginmax_data <= 0;mid_data <= 0;min_data <= 0;endelse beginif(data1>=data2 && data1>=data3)max_data <= data1;else if(data2>=data1 && data2>=data3)max_data <= data2;elsemax_data <= data3;if((data1 >= data2 && data1 <= data3) || (data1 >= data3 && data1 <= data2))mid_data <= data1;else if((data2 >= data1 && data2 <= data3) || (data2 >= data3 && data2 <= data1))mid_data <= data2;elsemid_data <= data3;if(data1 <= data2 &&data1 <= data3)min_data <= data1;else if(data2 <= data1 && data2 <= data3)min_data <= data2;else min_data <= data3;endend

对输入的三个数据进行大小比较以输出。至此已经可以成功实现中值滤波
四、总结
中值滤波是图像处理中常见的一种滤波方式,对椒盐噪声抑制效果较好。在硬件中的实现方式也较为简单,本次实验也成功实现中值滤波。由于实验中的图像对滤波前后的效果不明显,本次实验图未上传。
五、参考资料
1.正点原子sdk中值滤波;
2.csdn——bingbudingxz
(本文用作学习记录,如有侵权请告知作者)

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

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

相关文章

2024.6.13(周四)

H = 2 * eye(3);f = zeros(3,1);Aeq = [1 1 0; 1 0 1];beq = [1;0];x0 = [0; 0; 0];% 调用quadprog函数求解[x,fval] = quadprog(H, f, [], [], Aeq, beq, [], [], x0);disp(最优解为:); disp(x); disp(对应的最优值为:); disp(fval);

[OpenBMC] LDAP 设定(二) - openldap 伺服架设与BMC的设定

这篇会接续介绍ldap server的架设和redfish/web设定,因为openbmc支援了 openldap 和 windows 的ad,这篇选用OpenLDAP server架设为范例 在Ubuntu上架设OpenLDAP Server OpenLDAP是轻型目录访问协议(Lightweight Directory Access Protocol)的开源实现。通常用来管理公司组织的…

宏景HCM 任意文件读取漏洞

漏洞复现: 1、读取/etc/passwd http:url/servlet/OutputCode?path=RNcrjWtNfJnkUMbX1UB6VAPAATTP3HJDPAATTPPAATTP3HJDPAATTP 其中path字段加密通过下面工具来实现 工具地址:https://github.com/wafinfo/DecryptTools读取成功

保密U盘应该具备哪些功能,从而提高数据安全性?

保密U盘和普通U盘在基本功能上是相似的,都是用于存储和传输数据的USB闪存驱动器。但是,保密U盘针对数据安全性有额外的设计和功能,主要区别包括:加密技术:保密U盘通常内置了加密技术,如AES加密,确保存储在U盘上的数据即使被非法访问也无法读取。 访问控制:安全U盘可能具…

APP自动化环境搭建与安装(Windows)

一、Appium简介 Appium实现APP自动化测试的脚本开发环境一般包括: appium服务端:appium server GUI appium客户端:appium inspector 手机或者模拟器(OR真机):夜神模拟器 pycharm:自动化工具 python:自动化开发语言 Android SDK:主要用于adb安装与aapt安装 java:开发基…

cc3链:TrAXFilter在构造方法中加载字节码

cc1的终点`InvokerTransformer`如果被拉黑了怎么办?这就是cc3出现的机缘cc1的终点InvokerTransformer如果被拉黑了怎么办? 这就是cc3出现的机缘 回顾一下cc1的org.apache.commons.collections.functors.InstantiateTransformer InvokerTransformer的transform方法会接受一个对…

Go语言什么时候该使用指针 与 指针使用分析

Go语言什么时候该使用指针 与 指针使用分析 原创 疯子 Go语言圈 2024-06-12 08:31 广东Go语言圈 Go语言开发者的学习好助手,分享Go语言知识,技术技巧,学习与交流Go语言开发经验,互动才有助于技术的提升,每天5分钟,助你GO语言技术快乐成长 161篇原创内容公众号最近在学习Go…

手把手教你搭建Docker私有仓库Harbor

1、什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部署在本地云环境中,用于组织内部开…