当前位置: 首页 > news >正文

7.3*3卷积核生成

1.卷积核

  在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。
  由于图像经过卷积操作后会减少两行两列,因此在生成卷积核的时候一般会对图像进行填充,填充的方式有加0,加1和复制边界三种方法。本文将会构建一个边沿复制的的卷积核模块,一个边沿填充0或者1的卷积核模块和一个边沿不填充的卷积核模块
在这里插入图片描述
在这里插入图片描述

2.边沿填充模式卷积核生成

2.1 具有边沿填充的卷积代码

  首先生成一个FWFT的FIFO模块,然后编写下面的卷积核模块

module 	padding_matrix #(parameter 	COL 	= 	1920 	 	,parameter 	ROW 	= 	1080 	 	,parameter 	PADDING = 	0 			
)(input 	wire 			clk 		,input 	wire 			rst_n 		,input 	wire 	[7:0] 	data 		,input 	wire 	 		data_de 	,input 	wire    [1:0] 	padding     , output 	wire  			matrix_de 	,output 	reg 	[7:0] 	matrix11 	,output 	reg 	[7:0] 	matrix12 	,output 	reg 	[7:0] 	matrix13 	,output 	reg 	[7:0] 	matrix21 	,output 	reg 	[7:0] 	matrix22 	,output 	reg 	[7:0] 	matrix23 	,output 	reg 	[7:0] 	matrix31 	,output 	reg 	[7:0] 	matrix32 	,output 	reg 	[7:0] 	matrix33 	
);reg 	[1:0] 	 data_de_r 	;
reg 	[7:0] 	 data_r1 	;
reg 	[7:0] 	 data_r2 	;reg 	[15:0] 	 col_cnt 	;
reg 	[15:0] 	 row_cnt 	;	reg 			data_valid 	;
reg 	[4:0]	data_valid_r;
reg 			fake_data_valid;wire 	[7:0] 	row1_data 	;
wire 	[7:0] 	row2_data 	;
reg 	[7:0] 	row3_data 	;always @(posedge clk )begindata_de_r <= {data_de_r[1:0],data_de};data_valid_r 	<= 	{data_valid_r[3:0],data_valid};data_r1 	<= 	data 		;
end
wire 	pos_data_de;
assign 	pos_data_de = {data_de_r[0],data_de} == 2'b01;always @(posedge clk or negedge rst_n)beginif(rst_n == 0)begincol_cnt 	<= 0;endelse if(col_cnt == COL + 1)begincol_cnt 	<= 0;endelse if(data_valid || fake_data_valid)begincol_cnt 	<= col_cnt + 1;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0)beginrow_cnt 	<= 0;endelse if(col_cnt == COL + 1 && row_cnt == ROW )beginrow_cnt	 	<= 0;endelse if(col_cnt == COL + 1)beginrow_cnt 	<= row_cnt + 1;end
endalways @(posedge clk or negedge rst_n) beginif (rst_n == 0) begin		fake_data_valid 	<= 0;endelse if (data_valid_r[4] == 0 && row_cnt == ROW && col_cnt <= COL  ) beginfake_data_valid 	<= 1;endelse beginfake_data_valid 	<= 	0;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n == 0)beginrow3_data 	<= 0;endelse if(col_cnt == 0 && pos_data_de && padding == 0)beginrow3_data 	<= 0 ;endelse if(col_cnt == 0 && pos_data_de && padding == 1)beginrow3_data 	<= 8'hFF ;endelse if(col_cnt == 0 && pos_data_de)beginrow3_data 	<= data ;endelse if(col_cnt == COL && data_de_r[1] && padding == 0)beginrow3_data 	<= 0;endelse if(col_cnt == COL && data_de_r[1] && padding == 1)beginrow3_data 	<= 8'hFF;endelse if(col_cnt == COL && data_de_r[1])beginrow3_data 	<= row3_data;endelse beginrow3_data 	<= data_r1;end
endalways@(posedge clk or negedge rst_n)beginif(rst_n == 0)begindata_valid <= 0;endelse if(data_de || data_de_r[1])begindata_valid <= 1'b1;endelse begindata_valid <= 1'b0;end
endwire 			rd_en 	;	fifo_matrix_buf u1_fifo_matrix_buf (.rst 		(!rst_n		),  .wr_clk 	(clk  	 	),  .rd_clk 	(clk 	 	),  .din 		(row2_data 	),  .wr_en 		(data_valid ),  .rd_en 		(rd_en 	 	),  .dout 		(row1_data 	),  .full 		( 	 		),  .empty 		( 	 		)   
);fifo_matrix_buf u2_fifo_matrix_buf (.rst 		(!rst_n		),  .wr_clk 	(clk  	 	),  .rd_clk 	(clk 	 	),  .din 		(row3_data 	),  .wr_en 		(data_valid ),  .rd_en 		(rd_en 		),  .dout 		(row2_data 	), .full 		(   		),  .empty 		(    		)   
);assign rd_en = (row_cnt > 0 & (data_valid | fake_data_valid) )? 1'b1 : 1'b0;always @(posedge clk or negedge rst_n)beginif(rst_n == 0)begin{matrix11,matrix12,matrix13} 	<= 	24'd0;{matrix21,matrix22,matrix23} 	<= 	24'd0;{matrix31,matrix32,matrix33} 	<= 	24'd0;endelse if(rd_en)beginif(row_cnt == 1)beginif (padding == 0) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,  	   0};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endif (padding == 1) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,    8'hFF};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row2_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};				endend	else if (row_cnt == ROW) beginif (padding == 0) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,        0};				endelse if(padding == 1) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,    8'hff};				endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row2_data};				end			endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};end	end
endreg 	[3:0] 	rd_en_r;
always @(posedge clk)beginrd_en_r 	<= 	{rd_en_r[2:0],rd_en};
endassign 	matrix_de 	= 	rd_en_r[2] & rd_en_r[0] ;endmodule 		

2.2 边沿填充的卷积核仿真代码

`timescale 1ns / 1psmodule img_gen
#(parameter 	ACTIVE_IW 	= 	1920 	,parameter 	ACTIVE_IH 	= 	1080 	,parameter 	TOTAL_IW 	= 	2200 	,parameter 	TOTAL_IH 	= 	1100 	,parameter 	H_START 	= 	100 	,parameter 	V_START 	= 	4 		 		
)(input 	wire 				clk 	,input 	wire 				rst_n 	,output 	reg 				vs 		,output 	reg  	 	 		de 		,output 	wire 	[7:0] 		data 	
);reg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;reg 			h_de 	;
reg 			v_de  	;reg  			index_de 	;
reg 	[31:0] 	index 	 	;always @(posedge clk or negedge rst_n)if(!rst_n)hcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)hcnt <= 'd0;else hcnt <= hcnt + 1'b1;always @(posedge clk or negedge rst_n)if(!rst_n)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)vcnt <= 'd0;else if(hcnt == TOTAL_IW - 1)vcnt <= vcnt + 1'b1;else vcnt <= vcnt;always @(posedge clk or negedge rst_n)if(!rst_n)vs <= 'd0;else if(vcnt>=2)vs <= 1'b1;else vs <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)h_de <= 'd0;else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)h_de <= 1'b1;else h_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)v_de <= 'd0;else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)v_de <= 1'b1;else v_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index_de <= 'd0;else if(h_de == 1'b1 && v_de == 1'b1)index_de <= 1'b1;else index_de <= 1'b0;always @(posedge clk or negedge rst_n)if(!rst_n)index <= 'd0;else if(index == ACTIVE_IW * ACTIVE_IH-1)index <= 0;else if(index_de == 1'b1)index <= index + 1;else index <= index;always @(posedge clk or negedge rst_n)if(!rst_n)de <= 'd0;else de <= index_de;
assign 	data 	= index;
endmodule
`timescale 1ns / 1psmodule tb_matrix();reg 	clk 	;
reg 	rst_n 	;wire 	[7:0] 	data 	;
wire 			de  	;wire 			vs  	;wire 	[7:0] 	matrix11; 	
wire 	[7:0] 	matrix12; 	
wire 	[7:0] 	matrix13; 	
wire 	[7:0] 	matrix21; 	
wire 	[7:0] 	matrix22; 	
wire 	[7:0] 	matrix23; 	
wire 	[7:0] 	matrix31; 	
wire 	[7:0] 	matrix32; 	
wire 	[7:0] 	matrix33; 	always #5 clk 	<= 	~clk;
initial 	beginclk 	<= 0;rst_n 	= 0;#2000rst_n 	= 1;
endimg_gen
#(.ACTIVE_IW 	(5 	),.ACTIVE_IH 	(5 	),.TOTAL_IW 	(11 	),.TOTAL_IH 	(11 	),.H_START 	(4 	 	),.V_START 	(4 	 	) 		
)u_img_gen(.clk 	 	(clk 	 	),.rst_n 	 	(rst_n 	 	),.vs 		(vs 		),.de 		(de 		),.data 	 	(data 	 	)
);matrix #(.COL(5),.ROW(5)
)u_matrix(.clk 	 	(clk 	 	),.rst_n 	 	(rst_n 	 	),.data 	 	(data 	 	),.data_de  	(de 	  	),.matrix11 	(matrix11 	),.matrix12 	(matrix12 	),.matrix13 	(matrix13 	),.matrix21 	(matrix21 	),.matrix22 	(matrix22 	),.matrix23 	(matrix23 	),.matrix31 	(matrix31 	),.matrix32 	(matrix32 	),.matrix33 	(matrix33 	)
);reg 	vs_r 	;always @(posedge clk)if(rst_n == 0)vs_r 	<= 1'b0;else vs_r 	<= vs;always @(posedge clk)if(~vs&&vs_r)$stop;
endmodule

2.3 边沿填充的卷积核仿真波形

  边沿复制后的数据为
在这里插入图片描述
  仿真波形为:
在这里插入图片描述
  可以看到3X3卷积模板生成无误。
  无边沿填充的卷积核只需要将martex

相关文章:

  • 机器学习——聚类算法-层次聚类算法
  • hive 、spark 、flink之想一想
  • 使用Spring Cloud Gateway构建API网关,实现路由、过滤、流量控制等功能。
  • H5小程序视频方案解决方案,实现轻量化视频制作
  • 从根本上优雅地解决 VSCode 中的 Python 模块导入问题
  • 阿里云部署宝塔,设置了安全组还是打不开。
  • 递归算法 分析json字符串,自制简易表达式
  • 校园app开发流程-uniapp开发-支持APP小程序H5-源码交付-跑腿-二手市场-交友论坛等功能,学校自由选择!
  • Microsoft VBA Excel 单元格 重复元素 去重
  • 利用python脚本,根据词条爬取百度图片(爬虫)
  • 基于 YAML 接口自动化测试框架设计
  • 设计模式——行为型——策略模式Strategy
  • vue2项目设置浏览器标题title及图标logo
  • Django批量插入和分页器
  • 阿里云 -- 连接云服务器ECS、管理云服务器ECS、WordPress 页面配置
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 0基础学习移动端适配
  • Apache的基本使用
  • gf框架之分页模块(五) - 自定义分页
  • Java 网络编程(2):UDP 的使用
  • JavaScript 基础知识 - 入门篇(一)
  • jquery ajax学习笔记
  • Quartz初级教程
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Spring声明式事务管理之一:五大属性分析
  • Vue小说阅读器(仿追书神器)
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 编写符合Python风格的对象
  • 从零开始的无人驾驶 1
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 构造函数(constructor)与原型链(prototype)关系
  • 区块链共识机制优缺点对比都是什么
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用jQuery怎么做到前后端分离
  • 白色的风信子
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #Z2294. 打印树的直径
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)Android布局类型(线性布局LinearLayout)
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET 指南:抽象化实现的基类
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net操作Excel出错解决
  • .net连接oracle数据库
  • .net生成的类,跨工程调用显示注释
  • .pop ----remove 删除
  • .project文件
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [bzoj1006]: [HNOI2008]神奇的国度(最大势算法)