FPGA图像处理(六)------ 图像腐蚀and图像膨胀

默认迭代次数为1,只进行一次腐蚀、膨胀

一、图像腐蚀

1.相关定义 

2.图像腐蚀效果图

 

3.fpga实现 

彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法

`timescale 1ns / 1ps
//
// Description: 图像腐蚀 (前景色是黑色(0),背景色是白色(1)  腐蚀黑色)
//
module image_erode(input wire           clk             ,input wire           reset           ,input wire [10:0]    img_width       ,input wire [9:0]     img_height      ,input wire           valid_i         ,input wire [23:0]    last_line_data  ,input wire [23:0]    cur_line_data   ,input wire [23:0]    next_line_data  ,output reg           valid_o         ,output reg [23:0]    img_data_o
);//常量声明parameter N = 3; //窗口大小//结构系数模版为{1,1,1,//              1,1,1,//              1,1,1}//变量声明reg         valid_d1;reg [23:0]  last_line_data_d1, last_line_data_d2;reg [23:0]  cur_line_data_d1 , cur_line_data_d2 ;reg [23:0]  next_line_data_d1, next_line_data_d2;//中心点位置,为cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data_d1;endend//模板窗口范围内判断,前景色是黑色,背景色是白色,腐蚀处理就是前景色黑色减少//简单理解也就是,3*3窗口中所有像素值都是0时,才能将当前像素值为0输出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd0}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= {3{8'd255}};   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

明显可以看书汉字部分,经过腐蚀运算之后,白色字体变宽了(要是清晰显示文字,应该腐蚀白色,效果可能更好一点) 


二、图像膨胀

1.相关定义

 2.图像膨胀与图像腐蚀的联系

 3.FPGA实现

`timescale 1ns / 1ps
//
// Description: 图像膨胀 (前景色是黑色,背景色是白色  只要覆盖区域有前景色则膨胀黑色)
//
module image_dilate(input  wire          clk             ,input  wire          reset           ,input  wire [10:0]   img_width       ,input  wire [9:0]    img_height      ,input  wire          valid_i         ,input  wire [23:0]   last_line_data  ,input  wire [23:0]   cur_line_data   ,input  wire [23:0]   next_line_data  , output reg           valid_o         ,output reg [23:0]    img_data_o      
);//常量声明parameter N = 3; //窗口大小//结构系数模版为{1,1,1,1,1,1,1,1,1}//变量声明reg valid_d1;reg [23:0] last_line_data_d1, last_line_data_d2;reg [23:0] cur_line_data_d1 , cur_line_data_d2 ;reg [23:0] next_line_data_d1, next_line_data_d2;//中心点位置,为cur_line_data_d1always@(posedge clk or posedge reset) beginif(reset) beginvalid_d1 <= 0;{last_line_data_d1, last_line_data_d2} <= 0;{cur_line_data_d1 , cur_line_data_d2 } <= 0;{next_line_data_d1, next_line_data_d2} <= 0;end else beginvalid_d1 <= valid_i;last_line_data_d1 <= last_line_data;last_line_data_d2 <= last_line_data_d1;cur_line_data_d1  <= cur_line_data;cur_line_data_d2  <= cur_line_data_d1;next_line_data_d1 <= next_line_data;next_line_data_d2 <= next_line_data;endend//模板窗口范围内判断,前景色是黑色,背景色是白色,膨胀处理就是前景色黑色扩张//简单理解也就是,3*3窗口中所有像素值都是255(白)时,才能将当前像素值为255输出always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;img_data_o <= 0;end else if(valid_d1) beginif({last_line_data_d2, last_line_data_d1, last_line_data,cur_line_data_d2 , cur_line_data_d1 , cur_line_data ,next_line_data_d2, next_line_data_d1, next_line_data} == {27{8'd255}}) beginimg_data_o <= cur_line_data_d1;end else beginimg_data_o <= 0;   endvalid_o <= 1'b1;end else beginvalid_o <= 0;img_data_o <= 0;endendendmodule

 三、图像处理的开运算,闭运算和梯度运算

1.相关定义 

2.fpga实现 

开运算:

闭运算 :

梯度运算:

module image_process_top(input wire clk,input wire reset,input wire [10:0] img_width,input wire [9:0] img_height,input wire valid_i,input wire [23:0] img_data_i,output wire valid_o,output wire [23:0] img_data_o);//参数定义wire rgb2gray_valid;wire [23:0] rgb2gray_data;wire binary_valid;wire [23:0] binary_data;wire line_valid;wire [23:0] last_line_data, cur_line_data, next_line_data;wire erode_valid;wire [23:0] erode_data;wire dilate_valid;wire [23:0] dilate_data;wire line1_valid;wire [23:0] last_line1_data, cur_line1_data, next_line1_data;//灰度化处理image_rgb2gray u_image_rgb2gray(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( valid_i    ),.img_data_i ( img_data_i ),.valid_o    ( rgb2gray_valid    ),.img_data_o  ( rgb2gray_data  ));//二值化处理image_binary u_image_binary(.clk        ( clk        ),.reset      ( reset      ),.valid_i    ( rgb2gray_valid    ),.img_data_i ( rgb2gray_data ),.valid_o    ( binary_valid    ),.img_data_o  ( binary_data  ));//开运算
/*//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));//3行缓存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( erode_valid ),.img_data_i     ( erode_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///闭运算
/*//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//3行缓存image_line_buffer u_image_line_buffer1(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( dilate_valid ),.img_data_i     ( dilate_data ),.valid_o        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data  ( next_line1_data  ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line1_valid        ),.last_line_data ( last_line1_data ),.cur_line_data  ( cur_line1_data  ),.next_line_data ( next_line1_data ),.valid_o        ( valid_o        ),.img_data_o     ( img_data_o     ));
*///梯度运算//3行缓存image_line_buffer u_image_line_buffer(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( binary_valid ),.img_data_i     ( binary_data ),.valid_o        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data  ( next_line_data  ));//图像膨胀image_dilate u_image_dilate(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( dilate_valid    ),.img_data_o     ( dilate_data     ));//图像腐蚀image_erode u_image_erode(.clk            ( clk            ),.reset          ( reset          ),.img_width      ( img_width      ),.img_height     ( img_height     ),.valid_i        ( line_valid        ),.last_line_data ( last_line_data ),.cur_line_data  ( cur_line_data  ),.next_line_data ( next_line_data ),.valid_o        ( erode_valid    ),.img_data_o     ( erode_data     ));assign valid_o = dilate_valid;assign img_data_o = (dilate_data == 0)&&(erode_data == {3{8'd255}}) ? 0 : {3{8'd255}};endmodule

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

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

相关文章

中国版Cursor:CodeBuddy腾讯云代码助手使用体验

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴” 1.CodeBuddy简介 腾讯云代码助手CodeBuddy&#xff0c;这个是一款编程插件&#xff0c;我们可以在各个编程…

Go语言 GORM框架 使用指南

在 Go 语言社区中&#xff0c;数据库交互一直是开发者们关注的重点领域&#xff0c;不同开发者基于自身的需求和偏好&#xff0c;形成了两种主要的技术选型流派。一部分开发者钟情于像sqlx这类简洁的库&#xff0c;尽管其功能并非一应俱全&#xff0c;但它赋予开发者对 SQL 语句…

从零开始学习three.js(18):一文详解three.js中的着色器Shader

在WebGL和Three.js的3D图形渲染中&#xff0c;着色器&#xff08;Shader&#xff09; 是实现复杂视觉效果的核心工具。通过编写自定义的着色器代码&#xff0c;开发者可以直接操作GPU&#xff0c;实现从基础颜色渲染到动态光照、粒子效果等高级图形技术。本文将深入解析Three.j…

Python函数库调用实战:以数据分析为例

一、引言 Python之所以在编程领域广受欢迎&#xff0c;很大程度上得益于其丰富且强大的函数库。这些函数库涵盖了从数据分析、科学计算到Web开发、机器学习等众多领域&#xff0c;极大地提高了开发效率。本文将以数据分析为例&#xff0c;介绍如何调用Python的一些常用函数库。…

shell脚本之条件判断,循环控制,exit详解

if条件语句的语法及案例 一、基本语法结构 1. 单条件判断 if [ 条件 ]; then命令1命令2... fi2. 双分支&#xff08;if-else&#xff09; if [ 条件 ]; then条件为真时执行的命令 else条件为假时执行的命令 fi3. 多分支&#xff08;if-elif-else&#xff09; if [ 条件1 ]…

现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析

现代 Web 自动化测试框架对比&#xff1a;Playwright 与 Selenium 的深度剖析 摘要&#xff1a;本文对 Playwright 与 Selenium 在开发适配性、使用难度、场景适用性及性能表现等方面进行了全面深入的对比分析。通过详细的技术实现细节阐述与实测数据支撑&#xff0c;为开发者…

系统架构设计(十):结构化编程

定义 结构化编程是一种遵循清晰逻辑结构、避免使用 goto 的编程方法。它强调使用有限的三种基本控制结构来组织程序&#xff0c;提高程序的可读性、可维护性和可测试性。 它是现代程序设计的基础&#xff0c;被广泛应用于命令式语言&#xff08;如 C、Pascal、Java&#xff0…

TC3xx学习笔记-UCB BMHD使用详解(二)

文章目录 前言Confirmation的定义Dual UCB: Confirmation StatesDual UCB: Errored State or ECC Error in the UCB Confirmation CodesECC Error in the UCB ContentDual Password UCB ORIG and COPY Re-programming UCB_BMHDx_ORIG and UCB_BMHDx_COPY (x 0-3)BMHD Protecti…

OTA与boot loader

OTA指的是无线升级&#xff0c;通常用于更新设备的固件或软件&#xff0c;用户不用手动操作&#xff0c;非常方便。而bootloader是启动时加载操作系统的程序&#xff0c;负责硬件初始化和启动流程。 首先&#xff0c;OTA是如何通过bootloader工作的。OTA下载更新包后&#xff0…

实验六:FPGA序列检测器实验

FPGA序列检测器实验(远程实验系统) 文章目录 FPGA序列检测器实验(远程实验系统)一、数字电路基础知识1. 时钟与同步2. 按键消抖原理代码讲解:分频与消抖3. 有限状态机(FSM)设计代码讲解:状态机编码与转移4. 边沿检测与信号同步5. 模块化设计二、实验数字电路整体思想三…

jenkins部署

开发者将代码push到git运维人员通过jenkins部署&#xff0c;自动到git上pull代码通过maven构建成jar包&#xff0c;并结合dockerfile打包成镜像&#xff0c;push docker镜像到docker registry通过k8s发起 发布/更新 服务 操作 通过Jenkins部署&#xff0c;自动到Git上PULL代码 …

BBR 的 buffer 动力学观感

这周很忙&#xff0c;今天还加了一天班&#xff0c;但还是抽空实现了五一在安徽泾县山区喝着一壶酒写的 BBR ProbeRTT 的想法&#xff0c;没多少行代码&#xff0c;它真就消除了带宽锯齿&#xff0c;皮了个鞋&#x1f45e;&#xff0c;昨天我还在群里说了今天再说说 BBR 的&…

第9讲、深入理解Scaled Dot-Product Attention

Scaled Dot-Product Attention是Transformer架构的核心组件&#xff0c;也是现代深度学习中最重要的注意力机制之一。本文将从原理、实现和应用三个方面深入剖析这一机制。 1. 基本原理 Scaled Dot-Product Attention的本质是一种加权求和机制&#xff0c;通过计算查询(Query…

el-tree结合checkbox实现数据回显

组件代码 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>获取选择的节点 handleCheckChan…

OpenResty 深度解析:构建高性能 Web 服务的终极方案

引言 openresty是什么&#xff1f;在我个人对它的理解来看相当于嵌入了lua的nginx; 我们在nginx中嵌入lua是为了不需要再重新编译,我们只需要重新修改lua脚本,随后重启即可; 一.lua指令序列 我们分别从初始化阶段&#xff0c;重写/访问阶段&#xff0c;内容阶段&#xff0c;日志…

多商户商城系统源码解析:开发直播电商APP的技术底层实战详解

随着直播电商的火爆&#xff0c;越来越多的创业者和企业都在寻求打造自己的多商户商城系统&#xff0c;以实现“人、货、场”三者的深度融合。然而&#xff0c;从一个简单的电商平台到一个功能完善的直播电商APP&#xff0c;其技术底层架构和实现过程并非一蹴而就。本文将从架构…

桌面端进程通信

以下是关于 Electron 桌面端进程通信的基本知识点总结: 一、Electron 进程模型基础 1. 进程类型与职责 进程类型职责权限主进程(Main)创建窗口、系统级操作、IPC中枢完全Node.js访问权限渲染进程(Renderer)展示Web内容、UI交互默认受限(可配置开启Node.js)预加载脚本(Prelo…

openEuler24.03 LTS下安装MySQL8.0.42

目录 前提步骤 删除原有mysql及maridb数据库 安装MySQL 启动MySQL 启动查看MySQL状态 设置MySQL开机自启动 查看登录密码 登录MySQL 修改密码及支持远程连接 远程连接MySQL 前提步骤 拥有openEuler24.03 LTS环境&#xff0c;可参考&#xff1a;Vmware下安装openEule…

idea 保证旧版本配置的同时,如何从低版本升到高版本

文章目录 前言idea 保证旧版本配置的同时,如何从低版本升到高版本1. 备份项目2. 下载最新的idea3. 安装安装包4. 导入idea2019旧配置5. 验证前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,…

填坑记: 古董项目Apache POI 依赖异常排除

当你看到NoSuchMethodError的时候&#xff0c;不要慌&#xff0c;深呼吸&#xff0c;这可能只是JAR包版本的问题… 引子&#xff1a;一个平静的周二下午 那是一个看似平常的周二下午&#xff0c;系统运行良好&#xff0c;开发团队在有条不紊地推进着新功能的开发。突然&#x…