图像高斯滤波的Verilog实现
高斯滤波的原理:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯滤波函数:
高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,而且大部份基于卷积平滑滤波器都是低通滤波器。本实验为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实现的更多相关文章
- Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法
原文:Win8 Metro(C#)数字图像处理--2.64图像高斯滤波算法 [函数名称] 高斯平滑滤波器 GaussFilter(WriteableBitmap src,int r ...
- 学习 opencv---(7) 线性邻域滤波专场:方框滤波,均值滤波,高斯滤波
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作.图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了"方框滤波","均值滤 ...
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...
- python数字图像处理(10):图像简单滤波
对图像进行滤波,可以有两种效果:一种是平滑滤波,用来抑制噪声:另一种是微分算子,可以用来检测边缘和特征提取. skimage库中通过filters模块进行滤波操作. 1.sobel算子 sobel算子 ...
- OpenCV实现的高斯滤波探究_1(《学习OpenCV》练习题第五章第三题ab部分)
首先看下OpenCV 官方文档对于cvSmooth各个参数的解释: Smooths the image in one of several ways. C: void cvSmooth(const C ...
- 基于MATLAB的中值滤波均值滤波以及高斯滤波的实现
基于MATLAB的中值滤波均值滤波以及高斯滤波的实现 作者:lee神 1. 背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤 ...
- 基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存
如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存 ...
- opencv3.2.0图像处理之高斯滤波GaussianBlur API函数
/*高斯滤波:GaussianBlur函数 函数原型: void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double s ...
- 第三节,使用OpenCV 3处理图像(模糊滤波、边缘检测)
一 不同色彩空间的转换 OpenCV中有数百种关于在不同色彩空间之间转换的方法.当前,在计算机中有三种常用的色彩空间:灰度,BGR以及HSV(Hue,Saturation,Value). 灰度色彩空间 ...
- 机器学习进阶-阈值与平滑-图像平滑操作(去噪操作) 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, ...
随机推荐
- 《话糙理不糙》之如何在学习openfoam时避免坑蒙拐骗
今天开启一个单独的系列 <话糙理不糙> - 谁要和你说学openfoamC++基础不重要,那就是放氨气,非常误人 这就好比没读过外国文献的人和你说不需要学专业英语一样 谜底就在谜面里,程序 ...
- C++实现二叉树的定义与操作
头文件及常量定义 #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<iostr ...
- transformers 之Trainer对应的数据加载
基础信息说明 本文以Seq2SeqTrainer作为实例,来讨论其模型训练时的数据加载方式 预训练模型:opus-mt-en-zh 数据集:本地数据集 任务:en-zh 机器翻译 数据加载 Train ...
- 在windows服务中托管asp.net.core
参考:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1& ...
- mysql常用的查询语句
好记性不如烂笔头! 查询表中全部信息: select * from 表名 查询表中指定列的信息: select 列1,列2 from 表名 数据去重: select distinct 列... fro ...
- 其他6-break,continue,exit,return区别
break.continue.exit.return的区别 break 跳出整个循环语句 continue 跳过本次循环,进入下一次循环语句 exit n 退出当前shell,并返回状态值 retur ...
- fastdfs java客户端操作
https://github.com/happyfish100/fastdfs-client-java 到此处下载下来demo 这里采用maven的方式 mvn clean install 上传到本地 ...
- 在sublime text 3中编译javascript
1.整理步骤: 1).安装node.js: 2).配置js编译系统: 2.过程 1).先是按照网上的方法,在配置的时候输入如下内容: {"cmd": ["node&quo ...
- Python_基础_Print_输出函数
输出函数print() print()函数: 功能:向目的地输出内容 输出的内容:数字.字符串.表达式 目的地:IDLE.控制台.文件 print()函数可以输出些什么内容? 数字 字符串(用单引号和 ...
- myod od -tx -tc功能的c语言实现1210
一.实验要求 1. 复习c文件处理内容: 2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能: 3. main与其他分开,制作静态库和动态库: 4. 编写Ma ...