高斯滤波的原理:

  高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。

  高斯滤波函数:

  

  高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,而且大部份基于卷积平滑滤波器都是低通滤波器。本实验为3*3阶的计算算子:

  根据该算子,可用Verilog来实现,难点主要是3*3矩阵的生成。前面的文章边缘检测已经实现了3*3矩阵的生成,原理都一样。

  1 //**************************************************************************
2 // *** file name : Space_filter.v
3 // *** version : 1.0
4 // *** Description : 3*3 Weighted filtering
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.10.16
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module Space_filter
12 (
13 input i_sys_clk ,
14 input i_sys_rstn ,
15 input i_frame_rst ,
16 input i_sf_en ,
17 input i_sf_level ,
18 input [9:0] i_s_tdata ,
19 input i_s_tvalid ,
20 output o_s_tready ,
21 output [9:0] o_m_tdata ,
22 output o_m_tvalid ,
23 input i_m_tready
24 );
25
26 wire w_rst_all ;
27 wire w_valid ;
28 wire [9:0] w_matrix_00 ;
29 wire [9:0] w_matrix_10 ;
30 wire [9:0] w_matrix_20 ;
31 wire [9:0] w_matrix_10t;
32 wire [9:0] w_matrix_20t;
33 wire [9:0] w_add_data ;
34 wire [9:0] w_add_2data ;
35 wire [11:0] w_add_4data ;
36 wire [12:0] w_add_20data;
37 wire [7:0] w_outslt ;
38 wire w_empty ;
39 wire w_prog_full ;
40
41 reg [1:0] r_sel_fun ;
42 reg r_1st_line_en;
43 reg r_2rd_line_en;
44 reg r_1st_left_en;
45 reg [7:0] r_matrix_01 ;
46 reg [7:0] r_matrix_02 ;
47 reg [7:0] r_matrix_11 ;
48 reg [7:0] r_matrix_12 ;
49 reg [7:0] r_matrix_21 ;
50 reg [7:0] r_matrix_22 ;
51 reg [9:0] r_data ;
52 reg [9:0] r_fifo_din ;
53 reg r_fifo_wr ;
54
55
56 assign w_rst_all = i_frame_rst & (~i_sys_rstn);
57 assign w_valid = o_s_tready & i_s_tvalid;
58 assign w_matrix_00 = i_s_tdata;
59
60 always@(posedge i_sys_clk)
61 begin
62 r_sel_fun <= {i_sf_en,i_sf_level};
63 end
64 /******************************************************************************\
65 Generate 3 * 3 matrix
66 \******************************************************************************/
67 assign w_line0_rd = w_valid;
68 assign w_line1_rd = w_valid & r_1st_line_en;
69 assign w_line2_rd = w_valid & r_2rd_line_en;
70
71 always@(posedge i_sys_clk)
72 begin
73 if(w_rst_all)
74 begin
75 r_1st_line_en <= 'd0;
76 r_2rd_line_en <= 'd0;
77 r_1st_left_en <= 'd0;
78 end
79 else if(w_valid)
80 begin
81 if(w_matrix_00[8])
82 begin
83 r_1st_line_en <= 1'b1;
84 r_2rd_line_en <= r_1st_line_en;
85 r_1st_left_en <= 1'b1;
86 end
87 else
88 begin
89 r_1st_left_en <= 1'b0;
90 end
91 end
92 end
93
94 fifo_2048x10 line1_fifo
95 (
96 .clk (i_sys_clk ),
97 .srst (w_rst_all ),
98 .din (w_matrix_00 ),
99 .wr_en (w_line0_rd ),
100 .dout (w_matrix_10t ),
101 .rd_en (w_line1_rd ),
102 .full ( ),
103 .empty ( )
104 );
105 fifo_2048x10 line2_fifo
106 (
107 .clk (i_sys_clk ),
108 .srst (w_rst_all ),
109 .din (w_matrix_10t ),
110 .wr_en (w_line1_rd ),
111 .dout (w_matrix_20t ),
112 .rd_en (w_line2_rd ),
113 .full ( ),
114 .empty ( )
115 );
116
117 assign w_matrix_10 = w_line1_rd ? w_matrix_10t : w_matrix_00;
118 assign w_matrix_20 = w_line2_rd ? w_matrix_20t : w_matrix_10;
119
120 always@(posedge i_sys_clk)
121 begin
122 if(w_valid)
123 begin
124 r_matrix_01 <= w_matrix_00[7:0];
125 r_matrix_11 <= w_matrix_10[7:0];
126 r_matrix_21 <= w_matrix_20[7:0];
127
128 if(r_1st_left_en)
129 begin
130 r_matrix_02 <= w_matrix_00[7:0];
131 r_matrix_12 <= w_matrix_10[7:0];
132 r_matrix_22 <= w_matrix_20[7:0];
133 end
134 else
135 begin
136 r_matrix_02 <= r_matrix_01;
137 r_matrix_12 <= r_matrix_11;
138 r_matrix_22 <= r_matrix_21;
139 end
140 end
141 end
142
143 /******************************************************************************\
144 Data weighting processing
145 \******************************************************************************/
146 assign w_add_data = w_matrix_00[7:0] + r_matrix_02 + w_matrix_20[7:0] + r_matrix_22;
147 assign w_add_2data = r_matrix_01 + w_matrix_10[7:0] + r_matrix_12 + r_matrix_21;
148 assign w_add_4data = {r_matrix_11,2'd0} + {w_add_2data,1'b0} + w_add_data;
149 assign w_add_20data = {r_matrix_11,4'd0} + w_add_4data;
150
151 assign w_outslt = r_sel_fun[0] ? w_add_4data[11:4] : w_add_20data[12:5];
152
153 always@(*)
154 begin
155 case(r_sel_fun[1])
156 1'b0 :begin r_data <= i_s_tdata;end
157 1'b1 :begin r_data <= (w_valid & r_1st_left_en) ? w_matrix_00 : {w_matrix_00[9:8],w_outslt}; end
158 default:r_data <= i_s_tdata;
159 endcase
160 end
161
162 always@(posedge i_sys_clk)
163 begin
164 if(w_rst_all)
165 begin
166 r_fifo_din <= 'd0;
167 r_fifo_wr <= 'd0;
168 end
169 else
170 begin
171 r_fifo_din <= r_data;
172 r_fifo_wr <= w_valid;
173 end
174 end
175
176 fifo_2048x10_f2000 dout_fifo
177 (
178 .clk (i_sys_clk ),
179 .srst (w_rst_all ),
180 .din (r_fifo_din ),
181 .wr_en (r_fifo_wr ),
182 .dout (o_m_tdata ),
183 .rd_en (i_m_tready ),
184 .full ( ),
185 .empty (w_empty ),
186 .prog_full (w_prog_full )
187 );
188
189 assign o_m_tvalid = ~w_empty & i_m_tready;
190 assign o_s_tready = ~w_prog_full;
191
192 endmodule

  具体实验就不做了,类似于上一个边缘检测的实验,只是对Y通道数据进行处理。3*3阶的高斯滤波效果并不是很明显,这里就不把实验的图展示了。

图像高斯滤波的Verilog实现的更多相关文章

  1. Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法

    原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法  [函数名称]   高斯平滑滤波器      GaussFilter(WriteableBitmap src,int r ...

  2. 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波

    本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...

  3. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  4. python数字图像处理(10):图像简单滤波

    对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声:另一种是微分算子,可以用来检测边缘和特征提取. skimage库中通过filters模块进行滤波操作. 1.sobel算子 sobel算子 ...

  5. OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)

    首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...

  6. 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现

    基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1.   背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...

  7. 基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存

    如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存 ...

  8. opencv3.2.0图像处理之高斯滤波GaussianBlur API函数

    /*高斯滤波:GaussianBlur函数 函数原型: void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double s ...

  9. 第三节,使用OpenCV 3处理图像(模糊滤波、边缘检测)

    一 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机中有三种常用的色彩空间:灰度,BGR以及HSV(Hue,Saturation,Value). 灰度色彩空间 ...

  10. 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 1. cv2.blur(均值滤波) 2.cv2.boxfilter(方框滤波) 3. cv2.Guassiannblur(进行高斯滤波) 4. cv2.medianBlur(进行中值滤波)

    1.cv2.blur(img, (3, 3))  进行均值滤波 参数说明:img表示输入的图片, (3, 3) 表示进行均值滤波的方框大小 2. cv2.boxfilter(img, -1, (3, ...

随机推荐

  1. CF796C Bank Hacking

    题目传送门 思路 放眼整个题解区没有我这种解法,因此来写一篇题解. 既然要求我们选择一个节点作为根,那么我们就枚举根. 接下来的问题就是如何 \(\mathcal{O}(1)\) 或 \(\mathc ...

  2. echar 多个图形显示时,点击显示隐藏然后样式缺失,变得非常小

    原因:Echarts 图表是根据你定义的div 的样式来确定图表的大小,当图表隐藏时,Echarts会找不到div的宽和高,再次显示时它会给自己一个非常小的默认宽高值,所以在隐藏显示后会发现它变得非常 ...

  3. LeetCode算法训练 93.复原IP地址 78.子集 90.子集II

    欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不 ...

  4. LeetCode-689 三个无重叠子数组的最大和

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-sum-of-3-non-overlapping-subarrays 题目描述 ...

  5. Python实战项目6-后端多方式登录接口/手机登录接口

    为开源项目共享代码 步骤: 1先fork开源项目 2clone下来,修改代码,进行提交 3提交pr,等作者同意 Pycharm 使用Git 右键文件会列出Git命令 登录注册功能分析 多方式登录接口: ...

  6. [转载]python跨文件使用全局变量的实现

    python跨文件使用全局变量的实现 更新时间:2022-10-25 14:46:38发布时间:602天前 朗读 Python 定义了全局变量的特性,使用global 关键字修饰 1 global k ...

  7. Day 24 24.1:逆向分析1 - Steam案例

    STEAM逆向分析 url:https://store.steampowered.com/login/?redir=&redir_ssl=1 分析思路: 输入用户名和密码后,点击登录按钮,通过 ...

  8. TensorFlow中的Variable 变量

    简单运用 这节课我们学习如何在 Tensorflow 中使用 Variable . 在 Tensorflow 中,定义了某字符串是变量,它才是变量,这一点是与 Python 所不同的. 定义语法: s ...

  9. Pygame的基本应用(14周)

    制作一个跳跃的小球游戏        创建一个游戏窗口,然后在窗口内创建一个小球.以一定的速度移动小球,当小球碰到游戏窗口的边缘时,小球弹回,继续移动.代码如下: import sysimport p ...

  10. js 页面小数相加精度问题

    解决方法:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法. 比如计算0.33和5.2的和,则需要把( ...