7.3*3卷积核生成

1.卷积核

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

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

2.1 边沿复制的卷积代码

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

module 	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 	,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 	[2: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 	[10: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[9:0],data_valid};data_r1 	<= 	data 		;data_r2 	<= 	data_r1 	;
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		// resetfake_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)beginrow3_data 	<= data ;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)begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row2_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};end	else if (row_cnt == ROW) begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row2_data}; 			endelse begin{matrix11,matrix12,matrix13} 	<= 	{matrix12,matrix13,row1_data};{matrix21,matrix22,matrix23} 	<= 	{matrix22,matrix23,row2_data};{matrix31,matrix32,matrix33} 	<= 	{matrix32,matrix33,row3_data};end	endendreg 	[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卷积模板生成无误。
  后面将边沿填充0和1以及无填充的三种方式一起讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javax mail邮件发送(sockts代理)

1.pom引入 <!--hutool工具类--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.21</version></dependency> <!-- 邮件--><dependency><groupId>javax.m…

【CXL协议-ARB/MUX层(5)】

5.0 Compute Express Link ARB/MUX 前言&#xff1a; 在CXL协议中&#xff0c;ARB/MUX层&#xff08;Arbitration/Multiplexer layer&#xff09;是负责管理资源共享和数据通路选择的一层。CXL协议包含了几个子协议&#xff0c;主要有CXL.io、CXL.cache 和 CXL.memory。ARB/MU…

LeetCode 面试经典150题 383.赎金信

题目&#xff1a; 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 思路&#x…

生态修复相关的书籍推荐

近期&#xff0c;为了解生态修复找了很多的书籍阅读&#xff0c;其中有基本书都下来感觉还不错。以此&#xff0c;做个记录。 《生态修复理论与实践》 李锋 这本书写得有点空&#xff0c;更多的是从规划的视角来写。因而&#xff0c;这本书看起来就像是看规划的文本一样。因而…

计算机网络——网络基础1

网络基础一 1.初识网络 ​ 网卡也是一种文件&#xff0c;所以对于网络的编程也是一种文件操作&#xff1b; ​ 早期由于不同的计算机之间要根据数据进行协作&#xff0c;但是计算机之间是独立的&#xff0c;所以使用了光驱或者软盘之类的进行协作&#xff1b;对于将计算机连…

速盾:本地高防 和 cdn

本地高防和CDN是两种网络安全解决方案&#xff0c;主要用于保护网站免受DDoS攻击和提高网站的性能和可用性。本文将介绍本地高防和CDN的定义、原理、优缺点以及如何选择适合自己的解决方案。 本地高防是指在本地网络环境中部署的一种防御DDoS攻击的解决方案。它通过在网络入口…

计算机网络——数据链路层(差错控制)

计算机网络——数据链路层&#xff08;差错控制&#xff09; 差错从何而来数据链路层的差错控制检错编码奇偶校验码循环冗余校验&#xff08;CRC&#xff09;FCS 纠错编码海明码海明距离纠错流程确定校验码的位数r确定校验码和数据位置 求出校验码的值检错并纠错 我们今年天来继…

【Linux】-Linux下的编辑器Vim的模式命令大全及其自主配置方法

目录 1.简单了解vim 2.vim的模式 2.1命令模式 2.2插入模式 2.3底行模式 3.vim各模式下的命令集 3.1正常&#xff08;命令模式下&#xff09; 3.1.1光标定位命令 3.1.2 复制粘贴 3.1.3 删除 3.1.4 撤销 3.1.5大小写转换 3.1.6替换 「R」&#xff1a;替换光标所到之处的字符&…

ComfyUI SDWebUI升级pytorch随记

目前使用的版本是去年10月的1.6版本&#xff0c;有点老。希望支持新的特性&#xff0c;于是乎开始作死。从升级torch开始。先看看已有的版本&#xff1a; (venv) rootubuntu-sd-server:~# pip show torch Name: torch Version: 2.0.1 Summary: Tensors and Dynamic neural net…

maya获取帧长度

目录 maya获取帧长度 python实现 获取对象的帧长度 maya获取帧长度 python实现 import maya.cmds as cmds# 获取动画的起始帧和结束帧 start_frame cmds.playbackOptions(queryTrue, minTimeTrue) end_frame cmds.playbackOptions(queryTrue, maxTimeTrue)# 计算帧长度 fr…

论文翻译 - Multilingual Jailbreak Challenges in Large Language Models

论文链接&#xff1a;https://arxiv.org/pdf/2310.06474.pdf 项目代码&#xff1a;https://github.com/DAMO-NLP-SG/multilingual-safety-for-LLMs Multilingual Jailbreak Challenges in Large Language Models Abstract1 Introduction2 Preliminary Study2.1 Setup2.2 Result…

【贪心]【字符串】【分类讨论】420 强密码检验器

本文涉及知识点 贪心 字符串 分类讨论 LeetCode420 强密码检验器 满足以下条件的密码被认为是强密码&#xff1a; 由至少 6 个&#xff0c;至多 20 个字符组成。 包含至少 一个小写 字母&#xff0c;至少 一个大写 字母&#xff0c;和至少 一个数字 。 不包含连续三个重复字…

Reactor 模式全解:实现非阻塞 I/O 多路复用

Reactor网络模式是什么&#xff1f; Reactor网络模式时目前网络最常用的网络模式。如果你使用Netty&#xff0c;那么你在使用Reactor;如果你使用Twisted,那么你子啊使用Reactor;如果你使用netpoll&#xff0c;那么你在使用Reactor。 这里先给出答案&#xff1a;Reactor I/O多…

204基于matlab的图像融合

基于matlab的图像融合&#xff0c;包括三种方式&#xff0c;加权、PCA、IHS变换。比较三者融合后的图像差异。程序已调通&#xff0c;可直接运行。 204 matlab 图像融合 信息融合 - 小红书 (xiaohongshu.com)

软件工程的相关知识点

软件工程是一个广泛的领域&#xff0c;涉及到从软件的概念化设计到开发、测试、维护以及最终的退役全过程。它不仅仅关注编程&#xff0c;还包括需求分析、系统设计、项目管理、质量保证等多方面的知识。下面是一些软件工程的关键知识点&#xff1a; 需求工程&#xff1a;需求工…

前端理论总结(js)——DOM、BOM

什么是DOM&#xff1f; DOM 指的是Document Object Model&#xff08;文档对象模型&#xff09;&#xff0c;它指的是把文档当做一个对象来对待&#xff0c;这个对象主要定义了处理网页内容的方法和接口。 有什么用&#xff1f; 就是为了操作 HTML 中的元素&#xff0c;比如…

【二叉树】Leetcode 94. 二叉树的中序遍历【简单】

二叉树的中序遍历 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 解题思路 中序遍历是一种二叉树遍历方式&#xff0c;按照“左根右”的顺序遍历二叉树节点。 1、递归…

python 处理png图片无损压缩

代码利用了Pillow库来处理图片的压缩&#xff0c;并使用了 glob 模块来搜索所有的 .png 文件。这个脚本应该能够按照当前的编写来完成预期的工作。 请注意&#xff0c;compress_level9 指定了Pillow保存PNG图片时采用的最大压缩等级。这确保了每张图片都被以可能的最小文件大小…

线程安全(买票案例):加锁方式(synchronized、Lock锁)【同步代码块、同步方法】--学习JavaEE的day31上

day31上 线程安全 – 加锁 注意&#xff1a;要想多个线程互斥住&#xff0c;就必须使用同一把锁(对象)&#xff01;&#xff01;&#xff01; 加锁方式 synchronized Lock synchronized 继day30的售票需求案例学习 学习思路&#xff1a; 1.使用线程类、任务类方式不同 2.加锁方…

【Spring】Spring框架中的一个核心接口ApplicationContext 简介,以及入口 Run() 的源码分析

一、简介 ApplicationContext 是Spring框架中的一个核心接口&#xff0c;它是Spring IoC容器的实现之一&#xff0c;用于管理和组织应用程序中的各种Bean&#xff0c;同时提供了一系列功能来支持依赖注入、AOP等特性。 简单来说&#xff0c;ApplicationContext 是一个大型的、…