FPGA学习笔记

图像处理算法

1. 中值滤波算法1.1 原理1.2 FPGA实现中值滤波算法
2. 应用MATLAB给图片加椒盐噪声
3. 项目结果

1. 中值滤波算法

1.1 原理

  • 将每一像素点的灰度值设置为该点的某领域窗口内的所有像素点灰度值的中值。
  • 特点:有效抑制噪声,保护图像边缘信息,是经典的平滑噪声方法,可用作处理RGB图像格式。

方法:

将数据按大小排序,然后根据有序的数字序列找中值,排序算法:冒泡排序,二等分排序等软件算法,适合硬件的排序算法比较少。

  • 分别对三行像素进行排序
  • 分别对三行像素中的3个最大,3个中间,3个最小分别进行排序
  • 对最大的最小,中间的中间,最小的最大进行排序得到中值

1.2 FPGA实现中值滤波算法

  • 项目目标
    将椒盐噪声图片,通过中值滤波算法,进行去噪处理,并通过FPGA显示到TFT显示屏上。

  • 项目工具
    ① 硬件:Intel Cyclone IV E系列FPGA开发板,5寸(800*480)TFT电容触摸显示屏;
    ② 软件:Quartus软件,Picture2Hex软件,MATLAB;

  • 项目组成模块
    ① pll: 产生项目所需时钟:1. SDRAM控制器时钟;2. SDRAM时钟信号;3. TFT屏控制器时钟
    ② uart串口协议(uart_rx, uart_tx)
    ③ 读FIFO
    ④ 写FIFO
    ⑤ SDRAM控制模块
    ⑥ TFT屏控制模块
    ⑦ 中值滤波模块

  • Verilog代码

/*
1. 分别对三行像素进行排序
2. 分别对三行像素中:3个最大值,3个中间值,3个最小值,进行排序
3. 对:3最大值中的最小值,3个中间值中的中间值,3个最小值中的最大值,进行排序,得到中值
*/module median_filter_r0(input                         clk, //33MHZinput                           rst_n,input         [15:0]          data_in, //灰度像素输入input                          data_in_en,//lcd显示有效区使能信号input                          hs_in,//行同步信号输入input                            vs_in,//场同步信号输入output   wire    [15:0]          data_out,//中值处理后灰度像素输出output    wire                    data_out_en,output  wire                    hs_out,//行同步信号输出output  wire                    vs_out//场同步信号输出
);
//----timing declaration----reg         hs_reg0;reg         hs_reg1;reg         hs_reg2;reg         vs_reg0;reg         vs_reg1;reg         vs_reg2;reg         de_reg0;reg         de_reg1;reg         de_reg2;//----pipeline declaration----  wire [15:0] row0;wire [15:0] row1;wire [15:0] row2;reg  [15:0]  r0_c0;reg  [15:0]   r0_c1;reg  [15:0]   r0_c2;reg  [15:0]   r1_c0;reg  [15:0]   r1_c1;reg  [15:0]   r1_c2;reg  [15:0]   r2_c0;reg  [15:0]   r2_c1;reg  [15:0]   r2_c2;reg  [15:0]   r0_max;reg  [15:0]  r0_mid;reg  [15:0]  r0_min;reg  [15:0]  r1_max;reg  [15:0]  r1_mid;reg  [15:0]  r1_min;reg  [15:0]  r2_max;reg  [15:0]  r2_mid;reg  [15:0]  r2_min;reg  [15:0] max_max;reg  [15:0] max_mid;reg  [15:0] max_min;reg  [15:0] mid_max;reg  [15:0] mid_mid;reg  [15:0] mid_min;reg  [15:0] min_max;reg  [15:0] min_mid;reg  [15:0] min_min;reg  [15:0] mid;//--------------------------------------------------
//----3行像素缓存--------------------------//shifter3_3 shifter3_3(.clken(data_in_en),.clock(clk),.shiftin(data_in),.shiftout(),.taps0x(row0),.taps1x(row1),.taps2x(row2));//----timing control-----------------------//always@(posedge clk or negedge rst_n)beginif(!rst_n)beginhs_reg0 <= 1'd0;hs_reg1 <= 1'd0;hs_reg2 <= 1'd0;vs_reg0 <= 1'd0;vs_reg1 <= 1'd0;vs_reg2 <= 1'd0;de_reg0 <= 1'd0;de_reg1 <= 1'd0;de_reg2 <= 1'd0;endelse if(data_in_en)beginhs_reg0 <= hs_in;hs_reg1 <= hs_reg0;hs_reg2 <= hs_reg1;vs_reg0 <= vs_in;vs_reg1 <= vs_reg0;vs_reg2 <= vs_reg1;de_reg0 <= data_in_en;de_reg1 <= de_reg0;de_reg2 <= de_reg1;endend
//-----------------------------------------////----pipeline-----------------------------//
//----3*3 matix from imagealways@(posedge clk or negedge rst_n)beginif(!rst_n)beginr0_c0 <= 16'd0;r0_c1 <= 16'd0;r0_c2 <= 16'd0;r1_c0 <= 16'd0;r1_c1 <= 16'd0;r1_c2 <= 16'd0;r2_c0 <= 16'd0;r2_c1 <= 16'd0;r2_c2 <= 16'd0;            end else if(data_in_en)beginr0_c0 <= row0;r0_c1 <= r0_c0;r0_c2 <= r0_c1;r1_c0 <= row1;r1_c1 <= r1_c0;r1_c2 <= r1_c1;r2_c0 <= row2;r2_c1 <= r2_c0;r2_c2 <= r2_c1;end
end
//------------------------------------------------------------------
//----1.分别对三行像素进行排序r0_max, r10_max,r2_max
//----r0------------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginr0_max <= 16'd0;r0_mid <= 16'd0;r0_min <= 16'd0;     end else if(data_in_en)beginif((r0_c0>=r0_c1)&&(r0_c0>=r0_c2))begin//r0_max <= r0_c0r0_max <= r0_c0;if(r0_c1>=r0_c2)beginr0_mid <= r0_c1;r0_min <= r0_c2;               endelse beginr0_mid <= r0_c2;r0_min <= r0_c1;               endendelse if((r0_c1>=r0_c0)&&(r0_c1>=r0_c2))begin//r0_max <= r0_c1;r0_max <= r0_c1;if(r0_c0>=r0_c2)beginr0_mid <= r0_c0;r0_min <= r0_c2;               endelse beginr0_mid <= r0_c2;r0_min <= r0_c0;               endendelse if((r0_c2>=r0_c0)&&(r0_c2>=r0_c1))begin//r0_max <= r0_c2;r0_max <= r0_c2;if(r0_c0>=r0_c1)beginr0_mid <= r0_c0;r0_min <= r0_c1;               endelse beginr0_mid <= r0_c1;r0_min <= r0_c0;               endendendend
//----r1--------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginr1_max <= 16'd0;r1_mid <= 16'd0;r1_min <= 16'd0;         end else if(data_in_en)beginif((r1_c0>=r1_c1)&&(r1_c0>=r1_c2))begin//r0_max <= r0_c0r1_max <= r1_c0;if(r1_c1>=r1_c2)beginr1_mid <= r1_c1;r1_min <= r1_c2;               endelse beginr1_mid <= r1_c2;r1_min <= r1_c1;               endendelse if((r1_c1>=r1_c0)&&(r1_c1>=r1_c2))begin//r0_max <= r0_c1;r1_max <= r1_c1;if(r1_c0>=r1_c2)beginr1_mid <= r1_c0;r1_min <= r1_c2;               endelse beginr1_mid <= r1_c2;r1_min <= r1_c0;               endendelse if((r1_c2>=r1_c0)&&(r1_c2>=r1_c1))begin//r0_max <= r0_c2;r1_max <= r1_c2;if(r1_c0>=r1_c1)beginr1_mid <= r1_c0;r1_min <= r1_c1;               endelse beginr1_mid <= r1_c1;r1_min <= r1_c0;               endendendend
//----r2--------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginr2_max <= 16'd0;r2_mid <= 16'd0;r2_min <= 16'd0;         end else if(data_in_en)beginif((r2_c0>=r2_c1)&&(r2_c0>=r2_c2))begin//r0_max <= r0_c0r2_max <= r2_c0;if(r2_c1>=r2_c2)beginr2_mid <= r2_c1;r2_min <= r2_c2;               endelse beginr2_mid <= r2_c2;r2_min <= r2_c1;               endendelse if((r2_c1>=r2_c0)&&(r2_c1>=r2_c2))begin//r0_max <= r0_c1;r2_max <= r2_c1;if(r2_c0>=r2_c2)beginr2_mid <= r2_c0;r2_min <= r2_c2;               endelse beginr2_mid <= r2_c2;r2_min <= r2_c0;               endendelse if((r2_c2>=r2_c0)&&(r2_c2>=r2_c1))begin//r0_max <= r0_c2;r2_max <= r2_c2;if(r2_c0>=r2_c1)beginr2_mid <= r2_c0;r2_min <= r2_c1;               endelse beginr2_mid <= r2_c1;r2_min <= r2_c0;               endendendend
//--------------------------------------------------------------------
//----2. 分别对三行像素中:3个最大值,3个中间值,3个最小值,进行排序
//----3个最大值------------------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginmax_max <= 16'd0;max_mid <= 16'd0;max_min <= 16'd0;         endelse if(data_in_en)beginif((r0_max >= r1_max)&&(r0_max >= r2_max))begin//max_max <= r0_maxmax_max <= r0_max;if((r1_max >= r2_max))beginmax_mid <= r1_max;max_min <= r2_max;                      end else beginmax_mid <= r2_max;max_min <= r1_max;              end     endelse if((r1_max >= r0_max)&&(r1_max >= r2_max))begin//max_max <= r1_max;max_max <= r1_max;if((r0_max >= r2_max))beginmax_mid <= r0_max;max_min <= r2_max;                        end else beginmax_mid <= r2_max;max_min <= r0_max;              end     endelse if((r2_max >= r0_max)&&(r2_max >= r1_max))begin//max_max <= r2_max;max_max <= r2_max;if((r0_max >= r1_max))beginmax_mid <= r0_max;max_min <= r1_max;                        end else beginmax_mid <= r1_max;max_min <= r0_max;              end     endendend
//----3个中间值------------------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginmid_max <= 16'd0;mid_mid <= 16'd0;mid_min <= 16'd0;         endelse if(data_in_en)beginif((r0_mid >= r1_mid)&&(r0_mid >= r2_mid))begin//mid_max <= r0_midmid_max <= r0_mid;if((r1_mid >= r2_mid))beginmid_mid <= r1_mid;mid_min <= r2_mid;                      end else beginmid_mid <= r2_mid;mid_min <= r1_mid;              end     endelse if((r1_mid >= r0_mid)&&(r1_mid >= r2_mid))begin//mid_max <= r1_mid;mid_max <= r1_mid;if((r0_mid >= r2_mid))beginmid_mid <= r0_mid;mid_min <= r2_mid;                        end else beginmid_mid <= r2_mid;mid_min <= r0_mid;              end     endelse if((r2_mid >= r0_mid)&&(r2_mid >= r1_mid))begin//mid_max <= r2_mid;mid_max <= r2_mid;if((r0_mid >= r1_mid))beginmid_mid <= r0_mid;mid_min <= r1_mid;                        end else beginmid_mid <= r1_mid;mid_min <= r0_mid;              end     endendend//----3个最小值------------------------------------------------always@(posedge clk or negedge rst_n)beginif(!rst_n)beginmin_max <= 16'd0;min_mid <= 16'd0;min_min <= 16'd0;            endelse if(data_in_en)beginif((r0_min >= r1_min)&&(r0_min >= r2_min))begin//min_max <= r0_minmin_max <= r0_min;if((r1_min >= r2_min))beginmin_mid <= r1_min;min_min <= r2_min;                      end else beginmin_mid <= r2_min;min_min <= r1_min;              end     endelse if((r1_min >= r0_min)&&(r1_min >= r2_min))begin//min_max <= r1_min;min_max <= r1_min;if((r0_min >= r2_min))beginmin_mid <= r0_min;min_min <= r2_min;                        end else beginmin_mid <= r2_min;min_min <= r0_min;              end     endelse if((r2_min >= r0_min)&&(r2_min >= r1_min))begin//min_max <= r2_min;min_max <= r2_min;if((r0_min >= r1_min))beginmin_mid <= r0_min;min_min <= r1_min;                        end else beginmin_mid <= r1_min;min_min <= r0_min;              end     endendend
//---------------------------------------------------------------------------------
//----3. 对:3个最大值中的最小值,3个中间值中的中间值,3个最小值中的最大值,进行排序,得到中值always@(posedge clk or negedge rst_n)beginif(!rst_n)mid <= 16'd0;         else if(data_in_en)beginif(((max_min >= mid_mid)&&(max_min < min_max))||((max_min < mid_mid)&&(max_min >= min_max)) )//mid <= max_min;mid <= max_min;else if(((mid_mid >= max_min)&&(mid_mid < min_max))||((mid_mid < max_min)&&(mid_mid >= min_max)) )//mid <= mid_mid;mid <= mid_mid;else if(((min_max >= max_min)&&(min_max < mid_mid))||((min_max < max_min)&&(min_max >= mid_mid)) )//mid <= min_max;mid <= min_max;else;end     else;end
//----result-------------------------------------------------------------------------assign data_out = mid;assign data_out_en = de_reg2;assign hs_out = hs_reg2;assign vs_out = vs_reg2;
//-----------------------------------------------------------------------------------
endmodule

2. 应用MATLAB给图片加椒盐噪声

  • MATLAB代码
close all;clear all;clc;%清除L = imread('C:\Users\GloriaHuo\Desktop\0001.jpg');  % 在指定路径读取图像
J = imnoise(L,'salt & pepper', 0.1); %Salt&pepper 噪声密度=0.1figure(1);
imshow(L);  % 显示原图
figure(2);
imshow(J); %立即弹出窗口,显示加了加椒盐噪声后的图片
hold on;imwrite(J,'C:\Users\GloriaHuo\Desktop\0001_saltpepper.jpg');%把加入噪声的图像保存起来
  • 1. 原图像
  • 2. 加入椒盐噪声图像

3. 项目结果

5寸TFT电容触摸显示屏
图像:800*480像素

(1). (易烊千玺^^)网络原图:

(2). FPGA显示原图:

(3). 加入椒盐噪声图:

  • Salt&pepper 噪声密度=0.1

    (4). FPGA中值滤波处理图:

  • Salt&pepper 噪声密度=0.1

    项目结果分析:

  • 对比图3与图4可以发现,中值滤波算法可以有效地去除椒盐噪声;


参考资料:《FPGA系统设计与验证实战指南》
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~


FPGA学习笔记_图像处理3_FPGA实现中值滤波算法相关推荐

  1. 【python学习笔记】25:scipy中值滤波

    中值滤波技术能有效抑制噪声,通过把数字图像中一点的值用该点周围的各点值的中位数来代替,让这些值接近,以消除原图像中的噪声. *模拟中值滤波 >>> import random > ...

  2. 实时高速实现改进型中值滤波算法_爱学术_免费下载

    [摘要]在图像采集和处理过程中会引入噪声,必须先对图像进行预处理.本文介绍一种快速中值滤波算法,该算法在硬件平台上实现实时处理功能.综合考虑,选择现场可编程门阵列(FPGA)作为硬件平台,采用硬件描述 ...

  3. OpenCV图像处理专栏九 | 基于直方图的快速中值滤波算法

    转载自:https://zhuanlan.zhihu.com/p/98092747  侵删 前言 这是OpenCV图像处理专栏的第9篇文章,主要介绍一个基于直方图的快速中值滤波算法,希望对大家有帮助. ...

  4. 数字图像处理,自适应中值滤波的C++实现

    自适应中值滤波的原理 自适应中值滤波的思想是根据噪声密度改变滤波窗口的大小,同时对噪声点和信号点采取不同的处理方法.对噪声点进行中值滤波,对信号点保持其灰度值不变. 设为fij为点(i,j)的灰度值, ...

  5. c语言均值滤波步骤,关于中值滤波算法,以及C语言实现

    中值滤波是一种非线性的图像平滑方法,与均值滤波器以及其他线性滤波器相比,它能够很好地滤除脉冲噪声,同时又能够保护目标图像边缘.它是一种邻域运算, 类似于卷积,但计算的不是加权求和,而是把邻域中的像素按 ...

  6. matlab中基于十字形窗口的滤波算法,#215;字形滤波窗口在Matlab自适应中值滤波算法中的应用 - 21ic中国电子网...

    由于种种原因,图像在生成.传输.变换等过程中往往会受到各种噪声的污染,从而导致图像质量退化.噪声信号的滤波是图像处理的基本任务之一,主要有线性滤波和非线性滤波两种方法.线性滤波方法一般具有低通特性,而 ...

  7. 【老生谈算法】matlab实现车牌识别中值滤波算法——车牌识别中值滤波算法

    基于Matlab的车牌识别中值滤波算法的研究与实现 1.原文下载: 本算法原文如下,有需要的朋友可以点击进行下载 序号 原文(点击下载) 本项目原文 [老生谈算法]基于Matlab的车牌识别中值滤波算 ...

  8. ARM 汇编程序,演示中值滤波算法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.滤波的概念及种类 1.经典滤波 2.现代滤波 二.中值滤波及程序设计内容 1.中值滤波 2.中值滤波程序设计 3. ...

  9. matlab中值滤波法算法,基于MATLAB中值滤波算法的优化与实现

    总第238期2014年第4期 舰 船 电 子 工 程 Ship Electronic Engineering Vol.34No.437 基于 MATLAB中值滤波算法的优化与实现* 赵建春 刘力源 ( ...

  10. 滑动窗口滤波 c语言,关于中值滤波算法,以及C语言实现(转)

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

最新文章

  1. 论文精读 Learning to Segment Object Candidates(一)
  2. 记一次CPU占用率和load高的排查
  3. WEB渗透之对于开了3389远程连接不上的总结
  4. 从桌面到移动:异构计算翻天覆地的技术变革
  5. jquery学习。。
  6. linux sigprocmask函数理解
  7. 西山居Donya达成战略合作 Simplygon技术优化《剑网3》
  8. P2421 A-B数对(增强版)
  9. 【Python3爬虫】微博用户爬虫
  10. 将一张图片修改为合适的像素大小
  11. Docker-服务安装
  12. MacOS平台上编译 hadoop 3.1.2 源码
  13. 递归--练习6--noi1755菲波那契数列
  14. 整合Solr到Tomcat服务器,并配置IK分词
  15. 发那科机器人override指令_发那科FANUC机器人编写简单的程序详细教程
  16. 利用原生node.js连接sql数据库
  17. 小米平板完整bios_小米平板bios设置u盘启动操作步骤
  18. 3000元台式电脑组装配置单2021 3000元组装电脑配置清单
  19. Method threw ‘java.lang.NullPointerException‘ exception. Cannot evaluate com.sun.proxy.xxx
  20. java浮点数计算程序_计算器程序.可以准确进行浮点数运算

热门文章

  1. python定时任务_Python 定时任务的实现方式
  2. 数据库基础笔试题(附带答案)
  3. 写给初学者,一文搞懂大数据学习、岗位、面试及简历
  4. 软件测试环境有几种,什么是软件测试环境_软件测试环境有哪几种_做软件测试要用到什么工具...
  5. 《JavaScript高级程序设计》学习笔记 JavaScript基本(1)
  6. 8款超好用的SVG编辑工具用起来
  7. Meshing Tutorials(网格划分教程)
  8. rslogix5000pide实例_用RSLogix5000梯形图实现一种高级PID运算
  9. 为什么要玩FLTK(Fast Light Tool Kit)
  10. python爬虫必看书籍推荐