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
相关文章:

FPGA图像处理(六)------ 图像腐蚀and图像膨胀
默认迭代次数为1,只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化,灰度图像二值化,图像缓存生成滤波模块(3*3),图像腐蚀算法 timescale 1ns / 1ps // // Des…...
Spring三级缓存的作用与原理详解
在Spring框架中,Bean的创建过程涉及到了三级缓存机制。这个机制主要是为了提高单例模式下bean实例化和依赖注入的效率。本文将深入探讨Spring中的三级缓存,以及其在bean生命周期中的重要作用。 首先,让我们理解什么是三级缓存。Spring中的三…...

LVDS系列12:Xilinx Ultrascale系可编程输入延迟(二)
本节讲解Ultrascale IDELAYE3的参数; IDELAYE3参数: REFCLK_FREQUENCY:如果使用COUNT模式,保持300MHz的默认值即可; 如果使用TIME模式,则该值与IDELAYCTRL参考时钟要匹配; DELAY_SRC&#…...

ARM (Attention Refinement Module)
ARM模块【来源于BiSeNet】:细化特征图的注意力,增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块,它通过注意力机制来细化特征图&…...

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)
文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例,新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除,删除值和未删除…...

前端二进制数据指南:从 ArrayBuffer 到高级流处理
前端开发中,二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释: 前端二进制数据介绍 1. 什么是前端二进制数据? 指计算机原始的 0 和 1 格式的数据(比如一张图片的底层代码ÿ…...

如何选择高性价比的 1T 服务器租用服务
选择高性价比的 1T 服务器租用服务,可参考以下内容: 1、根据需求选配置 明确自身业务需求是关键。若为小型网站或轻量级应用,数据存储与处理需求不高,选择基础配置服务器即可。如个人博客网站,普通的 Intel Xeon …...

一个可拖拉实现列表排序的WPF开源控件
从零学习构建一个完整的系统 推荐一个可通过拖拉,来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目,用于在WPF应用程序中实现拖放功能,可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…...

AI-02a5a6.神经网络-与学习相关的技巧-批量归一化
批量归一化 Batch Normalization 设置合适的权重初始值,则各层的激活值分布会有适当的广度,从而可以顺利的进行学习。那么,更进一步,强制性的调整激活值的分布,是的各层拥有适当的广度呢?批量归一化&#…...

SVGPlay:一次 CodeBuddy 主动构建的动画工具之旅
我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 背景与想法 我一直对 SVG 图标的动画处理有浓厚兴趣,特别是描边、渐变、交互等效果能为图标增添许…...

自己手写tomcat项目
一:Servlet的原理 在Servlet(接口中)有: 1.init():初始化servlet 2.getServletConfig():获取当前servlet的配置信息 3.service():服务器(在HttpServlet中实现,目的是为了更好的匹配http的请求方式) 4.g…...

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…...
生成对抗网络(Generative Adversarial Networks ,GAN)
生成对抗网络是深度学习领域最具革命性的生成模型之一。 一 GAN框架 1.1组成 构造生成器(G)与判别器(D)进行动态对抗,实现数据的无监督生成。 G(造假者):接收噪声 ,…...
六、磁盘划分与磁盘配额
目录 1、磁盘划分1.1、什么是磁盘1.2、机械硬盘的结构与关键概念1.3、思考:为什么新买一个1T硬盘,使用时发现可使用容量低于1T1.4、Linux中inode和block1.5、查看超级快信息1.6、磁盘分区与挂载1.6.1、分区工具fdisk与格式化1.6.2、分区工具gdisk与格式化1.7、查看磁盘使用情…...

在WSL中的Ubuntu发行版上安装Anaconda、CUDA、CUDNN和TensorRT
在Windows 11的WSL(Windows Subsystem for Linux)环境中安装Anaconda、CUDA、CUDNN和TensorRT的详细步骤整理: 本文是用cuda12.4与CuDNN 8.9.7 和 TensorRT 9.1.0 及以上对应 一、前言(准备) 确保电脑上有NVIDIA GPU…...
小刚说C语言刷题—1230蝴蝶结
1.题目描述 请输出 n 行的蝴蝶结的形状,n 一定是一个奇数! 输入 一个整数 n ,代表图形的行数! 输出 n 行的图形。 样例 输入 9 输出 ***** **** *** ** * ** *** **** ***** 2.参考代码(C语言版)…...

代码随想录算法训练营第60期第三十九天打卡
大家好,我们今天继续讲解我们的动态规划章节,昨天我们讲到了动态规划章节的背包问题,昨天讲解的主要是0-1背包问题,那么今天我们可能就会涉及到完全背包问题,昨天的题目有一道叫做分割等和子集,今天应该会有…...

计算机网络体系结构深度解析:从理论到实践的全面梳理
计算机网络体系结构深度解析:从理论到实践的全面梳理 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,祝愿大家期末都能考一个好成绩! 一、常见计算机网络体系结构 …...
Qwen2.5-VL模型sft微调和使用vllm部署
本文的server.py和req.py代码参见:https://github.com/zysNLP/quickllm 配套课程《AIGC大模型理论与工业落地实战》;Deepseek相关课程更新中 1. 安装相关docker镜像:nvcr.io/nvidia/pytorch:25.02-py3 docker pull nvcr.io/nvidia/pytorch:…...
python打卡DAY22
##注入所需库 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import random import numpy as np import time import shap # from sklearn.svm import SVC #支持向量机分类器 # # from sklearn.neighbors import KNeighborsClassifier …...

【教程】Docker更换存储位置
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…...

鸿蒙Next API17学习新特性之组件可见区域变化事件新增支持设置事件的回调参数,限制它的执行间隔
概述 鸿蒙开发文档更新的非常快,对应我们开发者的学习能力也要求非常高,今天这篇文章给大家分享一下鸿蒙API17中更新的新特性学习。 鸿蒙 Next 的组件可见区域变化事件在最新的 API Version 17 中得到了增强,新增了支持设置事件的回调参数的…...
AI大模型从0到1记录学习 mysql day23
第 1 章 MySQL概述 1.1 基本概念 1.1.1 数据库是什么? 数据库(DB:Database):存储数据的地方。 1.1.2 为什么要用数据库? 应用程序产生的数据是在内存中的,如果程序退出或者是断电了,…...
spring -MVC-02
SpringMVC-11 - 响应 在 SpringMVC 中,响应是服务器对客户端请求的反馈,它可以以多种形式呈现,包括视图名称、ModelAndView 对象、JSON 数据以及重定向等。以下是对 SpringMVC 中不同响应类型的详细介绍: 1. 视图名称 通过返回…...

深入解析 React 的 useEffect:从入门到实战
文章目录 前言一、为什么需要 useEffect?核心作用: 二、useEffect 的基础用法1. 基本语法2. 依赖项数组的作用 三、依赖项数组演示1. 空数组 []:2.无依赖项(空)3.有依赖项 四、清理副作用函数实战案例演示1. 清除定时器…...

通过Ollama读取模型
通过Ollama读取模型 前言一、查看本地Ollama上有哪些模型二、调用bge-m3模型1、调用模型2、使用bge-m3进行相似度比较 三、调用大模型 前言 手动下载和加载大模型通常需要复杂的环境配置,而使用Ollama可以避免这一问题。本文将介绍如何调用Ollama上的模型。 一、查…...
C#控制流
🧩 一、控制流概述 C# 中的控制流语句用于根据条件或循环执行代码块。它们是程序逻辑的核心部分。 ✅ 二、1. if、else if、else int score 85;if (score > 90) {Console.WriteLine("优秀"); } else if (score > 60) {Console.WriteLine("及…...

永久免费,特殊版本!
随着大家审美的不断提升,无论是社交平台的日常分享还是特定场景的图像展示,人们对图像质量的要求都日益严苛。为了呈现更完美的视觉效果,许多小伙伴都会对原始图像进行精细化的后期处理,其中复杂背景抠图、光影调整、色彩校正等专…...

Canva 推出自有应用生成器以与 Bolt 和 Lovable 竞争
AI 目前是一个巨大的市场,每个人都想从中分一杯羹。 即使是 Canva,这个以拖放图形设计而闻名的流行设计平台,也在其 Canva Create 2025 活动中发布了自己版本的代码生成器,加入了 AI 竞赛。 但为什么一个以设计为先的平台会提供代码生成工具呢? 乍看之下,这似乎有些不…...

Matrix-Game:键鼠实时控制、实时生成的游戏生成模型(论文代码详细解读)
1.简介 本文介绍了一种名为Matrix-Game的交互式世界基础模型,专门用于可控的游戏世界生成。 Matrix-Game通过一个两阶段的训练流程来实现:首先进行大规模无标签预训练以理解环境,然后进行动作标记训练以生成交互式视频。为此,研…...