简介

卷积是图像处理中很常见的一种操作,3x3是最常见的窗口大小。

如果像素是一个个来的,要想实现3x3卷积,就得同时获取一个像素和它周围的8个像素,将输入像素缓存2行,这样就能同时获取3行的像素输入,此时再将这3个并行输入的像素移位进3x3窗口,就获得了3x3卷积模板,如图:
这里要注意,输入像素此时作为第三行数据输入3x3窗口,最下面的行缓存输出的才是第一行像素,上图窗口的右下角是3x3卷积模板的左上角,窗口的左上角是3x3卷积模板的右下角。
实现两行缓存并获取3x3卷积窗口,用shift-ram是最简单的实现方法。

shift-ram简介

shift-ram是一个ip核,quartus13.0中叫做Shift register(RAM based)
普通shift-ram如图:

带taps的shift-ram:

其实带taps的shift-ram就是多个普通shift-ram组合,使用带taps的shift-ram可以轻松实现行缓存,设定taps数量为2,taps间隔为一行的像素数(此处为640),即可缓存两行。之后将这两个taps和输入像素移位进3x3窗口即可获得3x3卷积模板。

verilog源码

为了简单起见,输入和输出都是valid+data的形式。

module filter_3x3(input clk,input rst_n,input iValid,input [7:0] iData,output oValid,output reg [7:0] oData_11, oData_12, oData_13,output reg [7:0] oData_21, oData_22, oData_23,output reg [7:0] oData_31, oData_32, oData_33
);reg [7:0] row3_data;wire [7:0] row2_data;wire [7:0] row1_data;reg [1:0] Valid_shift;// shift_ram实现2行缓存line_shift_ram inst_line_shift_ram(.clock    (clk),.clken    (iValid),.shiftin  (row3_data),.taps0x   (row2_data),.taps1x   (row1_data),.shiftout ());// 将输入数据寄存作为窗口第三行起始数据,同时也作为行缓存的输入always @(posedge clk, negedge rst_n) beginif(!rst_n)row3_data <= 0;else if(iValid)row3_data <= iData;end// 获取3x3卷积模板always @(posedge clk, negedge rst_n) beginif(!rst_n) begin{oData_11, oData_12, oData_13} <= 3'b000;{oData_21, oData_22, oData_23} <= 3'b000;{oData_31, oData_32, oData_33} <= 3'b000;end else if(iValid) begin{oData_11, oData_12, oData_13} <= {oData_12, oData_13, row1_data};{oData_21, oData_22, oData_23} <= {oData_22, oData_23, row2_data};{oData_31, oData_32, oData_33} <= {oData_32, oData_33, row3_data};endend// iValid打两拍输出always @(posedge clk, negedge rst_n) beginif(!rst_n)Valid_shift <=  2'b00;elseValid_shift <= {Valid_shift[0], iValid};endassign oValid = Valid_shift[1];
endmodule

testbench

只仿真三行,每行640个像素。

`timescale 1ps/1ps
module test_tb;reg clk = 1'b1;always #10 clk = ~clk;reg rst_n = 1'b0;reg iValid = 1'b0;reg [7:0] iData = 0;wire oValid;wire [7:0] oData_11;wire [7:0] oData_12;wire [7:0] oData_13;wire [7:0] oData_21;wire [7:0] oData_22;wire [7:0] oData_23;wire [7:0] oData_31;wire [7:0] oData_32;wire [7:0] oData_33;initial begin#20 rst_n <= 1'b1;#20 iValid <= 1'b1;// 第一行数据repeat(640) beginiData <= $random;#20;endiValid <= 1'b0;#100 iValid <= 1'b1;// 第二行数据repeat(640) beginiData <= $random;#20;endiValid <= 1'b0;#100 iValid <= 1'b1;// 第三行数据repeat(640) beginiData <= $random;#20;end#500 $stop;endfilter_3x3 inst_filter_3x3(.clk      (clk),.rst_n    (rst_n),.iValid   (iValid),.iData    (iData),.oValid   (oValid),.oData_11 (oData_11),.oData_12 (oData_12),.oData_13 (oData_13),.oData_21 (oData_21),.oData_22 (oData_22),.oData_23 (oData_23),.oData_31 (oData_31),.oData_32 (oData_32),.oData_33 (oData_33));
endmodule

波形分析


可以看出,3x3卷积模板的第三行最先出现,然后是第二行,最后才是第一行。
输入像素第一行的最前面几个像素如图,前三个为36,129,9。

输入像素第二行最前面几个像素如图,前三个像素为235,248,242:

此时再来看输入像素第三行,前三个像素为121,205,146:

上图黄色竖线处即可看到oData11 ~ oData33为36,129,9,235,248,242,121,205,146,正是每一行的前三个像素。
这个模板的移动类似于下图,最开始时模板只有右下角一个像素,然后向右移动,遍历完一行就遍历下一行。

虽然跟正常的卷积比,这个模板向左上角错位了,但视觉上影响不大,用它来做图像处理足够了。

FPGA图像处理-3x3卷积模板相关推荐

  1. 算子,滤波器,卷积模板,卷积核的概念比较

    滤波器是用于实现滤波过程的实体. 处理过程 处理工具 说明 映射函数空间 算子   滤波 滤波器 滤波器是一种算子 因此有时用算子代指滤波器 空域卷积进行图像处理 卷积模板 图像矩阵局部范围的权矩阵( ...

  2. 超详细介绍 图像处理(卷积)

    图像处理(卷积)作者太棒了 原文  http://blog.sina.com.cn/s/blog_4bdb170b01019atv.html 图像处理-线性滤波-1 基础(相关算子.卷积算子.边缘效应 ...

  3. FPGA图像处理的一些基础知识,FPGA是如何实现最高实时性的?相比于GPU的优势在哪?

    先来说一下工业上用到的图像传感器种类和部分我知道的厂家.如上图所示,工业上除了会用到手机和相机中常见的面阵传感器之外,还会用到线阵传感器.线阵传感器的分辨率是几k乘1,也就是它只扫描一行图像,主要用于 ...

  4. 【图像处理】卷积算法

    本文索引: 文章目录 # 一. 什么是卷积?       在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作.       卷积核(算子)是用来做图像处理时的矩阵,图像处理时也 ...

  5. Java OpenCV-4.0.0 图像处理22 图像模板匹配

    Java OpenCV-4.0.0 图像处理22 图像模板匹配 参考链接:https://blog.csdn.net/qq_34814092/article/details/95813654 Java ...

  6. FPGA图像处理的开发流程

    FPGA图像处理的开发流程 1.需求分析及问题描述 问题描述应该清楚地描述问题而不是解决方法.它应该包括系统需要做什么.为什么要做,而不包括怎么做. 为了描述更具体,至少需要讨论三个方面. 第一是系统 ...

  7. 基于FPGA的一维卷积神经网络CNN的实现(二)资源分配

    资源分配 环境:Vivado2019.2. Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb. 说明:通过识别加高斯白噪声的正弦波. ...

  8. 基于FPGA的一维卷积神经网络CNN的实现(一)框架

    理论建立与效果展示 环境:Vivado2019.2. Part:xcku040-ffva1156-2-i,内嵌DSP个数 1920个,BRAM 600个也就是21.1Mb. 说明:通过识别加高斯白噪声 ...

  9. 优秀的 Verilog/FPGA开源项目介绍(二十五)- FPGA图像处理库

    今天介绍几个和图像处理的项目,废话不多说,我们开始吧~ FPGA-Imaging-Library https://github.com/dtysky/FPGA-Imaging-Library 介绍 一 ...

  10. FPGA白平衡 自动白平衡 FPGA图像处理

    FPGA白平衡 自动白平衡 FPGA图像处理 工程和算法包含以下内容: 1,MATLAB中实现图像处理. 2,verilog代码利用MATLAB联合modelsim仿真实现的图像处理. 3,小梅哥AC ...

最新文章

  1. Subversion权限详解
  2. 机器学习中的基本数学知识
  3. SPS2003升级MOSS2007时SSO部件错误解决
  4. [Vue]组件——通过$emit为组件自定义事件
  5. 把对方陷入困境中(博弈论的诡计)
  6. Mongo 常用的server命令
  7. 并发编程之线程安全性
  8. python数据分析挖掘与可视化课件_python数据分析与可视化
  9. 使用JConsole观察分析Java程序的运行(转)
  10. 数据治理:数据指标管理平台解决方案
  11. 复数计算器(c++实训)
  12. AlphaTest烘焙的阴影不正确
  13. 《低代码指南100解决方案》——5疫情防控常态化之下,如何做好访客管理?
  14. 思考互联网发展三阶段
  15. 【JavaScript】用循环语句解决鸡兔同笼和百元买百鸡问题
  16. JavaScript练习--[使用js语言实现网页切换图片的效果]
  17. 炫舞时代显示服务器出错,qq炫舞2各种常见bug大全 FAQ详解
  18. Java 16 藏刀而来,Java 8 面不改色 | 它强任它强,我用 Java 8,嘿嘿
  19. 手把手教你破解Linux系统root密码——无需任何工具,有手就行
  20. 使用CLB部署HTTPS业务

热门文章

  1. 照相4440【2023AcWing每日一题】
  2. aes解密流程图_史上最全经典设计案例:基于AES加密算法的保密通信系统设计,完整软硬件协同方案-通信/网络-与非网...
  3. python是一门高级的计算机程序语言_python是一门程序设计语言,学习python有什么好的视频教程?...
  4. 小程序给循环的数组中在某个位置中插入两边横线,中间文字的效果
  5. 2022年煤炭生产经营单位(安全生产管理人员)特种作业证考试题库及答案
  6. 猪肉各部位的做法,程序员,照顾好自己
  7. 操作系统:实验二 进程控制
  8. Elasticsearch向量检索的演进与变革:从基础到应用
  9. 第十届全国青少年信息学奥林匹克联赛C语言初赛
  10. Codeforces 225E 梅森素数