PotatoPie 4.0 实验教程(35) —— FPGA实现摄像头图像二值化膨胀效果

手机扫码

链接直达

https://item.taobao.com/item.htm?ft=t&id=776516984361

什么是图像二值化膨胀,有什么作用?

图像二值化膨胀是图像处理中的一种基本操作,它用于扩展和增强二值图像中的白色区域。具体而言,二值化膨胀操作会将图像中的白色区域进行扩张,使得白色区域的面积增大,边缘变得更加平滑,同时减小了黑色区域的面积。

二值化膨胀的主要作用包括:

  1. 连接分离的白色区域:当二值图像中存在一些白色区域之间有一定的间隔时,通过膨胀操作可以将它们连接起来,形成更大的连通区域。

  2. 填充小孔和缝隙:在二值图像中可能存在一些小的黑色孔洞或者白色缝隙,通过膨胀操作可以将这些孔洞或缝隙填充掉,使得图像的连通性更强。

  3. 平滑边缘:二值化膨胀可以使得白色区域的边缘变得更加平滑,去除一些锯齿状的边缘,从而使得图像更加美观。

  4. 扩展目标区域:在目标检测和分割等任务中,膨胀操作可以扩展目标区域的大小,从而更好地识别和分割目标。

总的来说,二值化膨胀可以帮助改善二值图像的质量,增强目标区域的连通性和稳定性,为后续的图像处理和分析提供更好的基础。

图像二值化膨胀算法步骤

图像二值化膨胀是通过一系列的像素运算来实现的。下面是其基本的算法步骤:

  1. 遍历图像中的每个像素: 从图像的左上角开始,逐行逐列地遍历每个像素。

  2. 定义结构元素: 定义一个结构元素(也称为膨胀核),它是一个指定形状和大小的像素矩阵,通常是一个正方形或圆形。

  3. 将结构元素与图像进行对应位置的匹配: 将结构元素的中心与当前像素位置对齐,然后将结构元素覆盖在图像的局部区域上。

  4. 判断膨胀操作: 如果结构元素覆盖区域内存在至少一个白色像素(像素值为255),则将当前像素的值设置为白色(像素值为255);否则将当前像素的值设置为黑色(像素值为0)。

  5. 重复步骤2-4直到遍历完整个图像: 对图像中的每个像素都执行上述步骤,直到遍历完整个图像。

  6. 输出结果图像: 完成遍历后,得到的图像就是经过膨胀处理后的二值化图像,其中白色区域的面积可能增大,黑色区域的面积可能减小。

通过以上步骤,图像二值化膨胀操作可以扩张和增强二值图像中的白色区域,达到连接、填充和平滑等效果。

与前面的二值化腐蚀相反,我们用3*3的模版滑动,只要这9个像素中有一个像素为255,那就把这9个全部涂为255。

python代码实现图像二值化膨胀源码

PotatoPie 4.0 实验教程(34) —— FPGA实现摄像头图像二值化膨胀效果-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段代码实现了图像的二值化和膨胀处理,并使用 Python 编程语言和 OpenCV 库来实现。具体功能说明如下:

  1. 导入必要的库:导入了 NumPy 用于数组操作,OpenCV 用于图像处理,os 用于路径操作,matplotlib.pyplot 用于图像显示。

  2. 读取图像:从指定路径读取图像,并获取其尺寸。

  3. 将图像转换为灰度图像:使用 OpenCV 的 cvtColor 函数将彩色图像转换为灰度图像。

  4. 图像二值化:将灰度图像转换为二值图像,根据阈值(92)将像素值大于阈值的设置为255,小于等于阈值的设置为0。

  5. 图像膨胀处理:使用按位或操作对二值图像进行膨胀处理,将图像中的白色区域扩张,使其变得更加连通。

  6. 显示图像:使用 matplotlib.pyplot 的 subplot 函数将原始灰度图像、二值化图像和膨胀处理后的图像显示在子图中,并设置标题为中文并使用微软雅黑字体。

对函数的说明如下:

  • cv2.imread(): 读取图像文件。
  • cv2.cvtColor(): 将图像从一个颜色空间转换为另一个颜色空间。
  • plt.imshow(): 显示图像。
  • plt.title(): 设置图像标题。
  • plt.subplot(): 创建子图。
  • plt.show(): 显示图像。

从下图可以看到图像白色的部分增加了:

matlab代码实现图像二值化膨胀源码

PotatoPie 4.0 实验教程(34) —— FPGA实现摄像头图像二值化膨胀效果-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段 MATLAB 代码实现了图像的二值化和膨胀处理,并使用 subplot 函数将原始灰度图像、二值化图像以及经过不同次数膨胀处理后的图像显示在同一窗口中。

功能说明:

  1. 首先,代码读取了名为 “Lena.jpg” 的图像文件,并将其转换为灰度图像。

  2. 然后,通过阈值将灰度图像进行二值化处理,将灰度值大于 92 的像素置为白色(255),其余置为黑色(0)。

  3. 接着,对二值化后的图像进行膨胀处理,分别进行了三次膨胀处理,每次处理都是将图像中的黑色像素点与其周围的8个像素点进行按位或运算,并将结果赋值给当前像素点。这样可以使得黑色区域扩张,增加图像中白色区域的连通性。

  4. 最后,使用 subplot 函数将原始灰度图像、二值化图像以及经过不同次数膨胀处理后的图像显示在同一窗口中,并设置了标题的字体为微软雅黑,方便阅读和展示。

函数功能说明:

  • imread:用于读取图像文件。
  • rgb2gray:将彩色图像转换为灰度图像。
  • subplot:用于在同一窗口中显示多个子图像。
  • imshow:用于显示图像。
  • title:用于设置图像的标题,并设置了标题的字体为微软雅黑。
  • for 循环:用于遍历图像的每个像素,并进行二值化和膨胀处理。

从下图可以看到图像白色的部分增加了:

FPGA工程解析

工程层次图

demo18相比,只是多了一个img_dlat_fltr的模块,同时这个例程中使能了video_tgp_24b模块目的是为了不使用摄像头数据而使用video_tgp_24b生成的条纹数,这样效果更明显,也就是下面这两段代码,在从SDRAM读出来之后,经img_dlat_fltr处理后再输出hdmi_tx模块。

video_tgp_24b    
#(.H_DISP             (12'd1280),.V_DISP             (12'd720)
)
u_video_tgp_24b
(.clk                (pattern_clk),        .rst_n              (sys_rst_n),     .vaild          (sdram_init_done),.DIVIDE_PARAM       (8'd128),.data           (pattern_data),    .we             (pattern_we)
);
img_dlat_fltr u_img_dlat_fltr_1
(.i_clk          (clk_pixel             ),//input   wire        .i_rst_n        (sys_rst_n            ),//input   wire        .i_hs         (VGA_HS           ),//input   wire        .i_vs         (VGA_VS           ),//input   wire        .i_en           (VGA_DE           ),//input   wire        .i_bin       (v_bin              ),//input   wire [7:0]  .o_hs           (dlat_1_hs         ),//output  wire        .o_vs           (dlat_1_vs         ),//output  wire        .o_en           (dlat_1_de         ),//output  wire        .o_bin       (dlat_1_bin     ) //output  wire [7:0]  
);

共计例化了img_dlat_fltr6次,每处理一次会显示一个画面并延迟一会。

video_tgp_24b模块代码解析

相比之前教程中的video_tgp_24b模块,将图像的测试固定在了img_state <= 2'd1; 这一状态。即图像始终输出为data <= ((lcd_ypos[4]==1'b1) ^ (lcd_xpos[4]==1'b1)) ? {24{1'b0}} : {24{1'b1}}; ,显示为黑白条纹。

img_dilation_fltr模块代码解析

首先例化图像缓冲模块,用于将图像从一个时钟一个像素转为一个时钟输出三行三列9个像素,由于图像是二值图,我们只需随意例化一个通道的buf就可以,我们这里例化R通道。

同前面的腐蚀代码相比,膨胀就是把&运算改为|运算,因为只要9个像素中有一个不为0,那么所有像素就都为255。

erosion_or <= r_p11  |r_p12 |r_p13 |r_p21 |r_p22 |r_p23 |r_p31 |r_p32 |r_p33;

管脚约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

时序约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

实验结果:

这个程序会进行6次膨胀,每次膨胀之后会停顿1秒,可以看到图中的白条纹越来越小,黑条纹越来越细,就是白条纹被膨胀了。

20240409200523703-d72c17ab0277878e8bf559658b4e7fb

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

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

相关文章

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…

LeetCode55:跳跃游戏

题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 解题思想 每次…

update_min_vruntime()流程图

linux kernel scheduler cfs的update_min_vruntime() 看起来还挺绕的。含义其实也简单&#xff0c;总一句话&#xff0c;将 cfs_rq->min_vruntime 设置为&#xff1a; max( cfs_rq->vruntime, min(leftmost_se->vruntime, cfs_rq->curr->vruntime) )。 画个流…

滑动窗口详解

目录 一、滑动窗口的特定步骤&#xff1a; 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种&#xff0c;它由暴…

PDF高效编辑器,支持修改PDF文档并转换格式从PDF文件转换成图片文件,轻松管理你的文档世界!

PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;传统的PDF阅读器往往只能满足简单的查看需求&#xff0c;对于需要频繁编辑、修改或转换格式的用户来说&#xff0c;就显得力不从心。现在&#xff0c;我们为您带来一款全新的PDF高效编辑器&#xff0c;让…

挑战一周完成Vue3项目Day3: 品牌管理+平台属性管理+SPU管理+SKU管理

一、真实接口替换mock接口 &#xff08;1&#xff09;替换各个环境下的服务器地址&#xff08; .env.development、.env.production、.env.test &#xff09; VITE_SERVE"http://sph-api.atguigu.cn" &#xff08;2&#xff09; 配饰代理跨域&#xff1a;vite.con…

根据标签最大层面ROI提取原始图像区域

今天要实现的任务是提取肿瘤的感兴趣区域。 有两个文件&#xff0c;一个是nii的原始图像文件&#xff0c;一个是nii的标签文件。 我们要实现的是&#xff1a;在标签文件上选出最大层面&#xff0c;然后把最大层面的ROI映射到原始图像区域&#xff0c;在原始图像上提裁剪出ROI…

PLC通过Modbus转Profinet网关连接变频器与电机通讯

Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口&#xff0c;PLC作为控制中枢&#xff0c;变频器作为控制电机转速&#xff0c;通过Modbus转Profinet网关&#…

瑞米派实时系统与EtherCAT移植-米尔Remi Pi

1.概述 Remi Pi采用瑞萨RZ/G2L作为核心处理器&#xff0c;该处理器搭载双核Cortex-A551.2GHzCortex-M33200MHz处理器&#xff0c;其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元&#xff08;支持H.264硬件编解码&#xff09;,16位的DDR4-1600 / DDR3L-1333内存…

Webshell绕过技巧分析之-base64编码和压缩编码

在网络安全运营&#xff0c;护网HVV&#xff0c;重保等活动的过程中&#xff0c;webshell是一个无法绕过的话题。通常出现的webshell都不是以明文的形式出现&#xff0c;而是针对webshell关键的内容进行&#xff0c;混淆&#xff0c;编码来绕过网络安全产品&#xff0c;例如IDS…

计算机提示msvcp110.dll是什么意思?msvcp110.dll丢失恢复办法

在Windows操作系统中&#xff0c;动态链接库&#xff08;DLL&#xff09;扮演着至关重要的角色&#xff0c;它们是实现程序间代码共享和模块化设计的关键组件。msvcp110.dll&#xff0c;作为Microsoft Visual C 2012运行时库的一个组成部分&#xff0c;是理解现代软件开发和维护…

【酱浦菌-爬虫技术细节】解决学术堂爬虫翻页(下一页)问题

首先我们通过css选择器获取页码信息&#xff0c;这里的css选择器&#xff0c;选择的是含有a标签的所有li标签&#xff0c;代码如下&#xff1a; li html_web.css(div.pd_c_xslb_left_fenye ul li>a) for li in li:li_url li.css(a::attr(href)).get()li_num li.css(a::t…

STM32入门_江协科技_3~4_OB记录的自学笔记_软件安装新建工程

3. 软件安装 3.1. 安装Keil5 MDK 作者的资料下载的连接如下&#xff1a;https://jiangxiekeji.com/download.html#32 3.2. 安装器件支持包 因为新的芯片层出不穷&#xff0c;所以需要安装Keil5提供的器件升级版对软件进行升级&#xff0c;从而支持新的芯片&#xff1b;如果不…

unity-C#调用百度千帆AppBuilder的OpenApi

目录 功能描述准备工作百度智能云账号创建应用编辑应用创建Api秘钥Api调用流程unity代码Unitywebrequest非流式流式注意事项 Restsharp 功能描述 使用百度千帆AppBuilder平台,通过api调用的方式实现AI大模型对话功能(文字) 准备工作 百度智能云账号 请自行在百度智能云进行…

力扣---二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []实现方法&…

nginx+Tomcat动静分离

本⽂的动静分离主要是通过nginxtomcat来实现&#xff0c;其中nginx处理图⽚、html等静态的⽂ 件&#xff0c;tomcat处理jsp、do等动态⽂件. 实验环境 192.168.200.133 nginx反向代理 192.168.200.129 static 192.168.200.130 dynamic 步骤 修改三台主机名 [rootadmin ~]#…

关于Centos 7/8 网络设置 与工具连接

网络三步曲的配置 1、首先更改虚拟机的网络配置 查看子网地址以及网关 如果有要求需要更改IP地址&#xff0c;规定第三位是指定数值&#xff0c;那么需要全部更改 例如&#xff0c;IP地址为192.168.200.30 其中200为重点&#xff0c;更改时为以下步骤 1、点击DHCP设置&#x…

【数据结构】顺序表专题

前言 本篇文章我们来进行有关顺序表的专题训练&#xff0c;让我们一起来看一下有关顺序表的算法题 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 &#x1f4dd;若有问题 评论区见 &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 1.移除…

每天五分钟深度学习:导数是反向传播算法的数学基础

本文重点 导数作为微积分学的核心概念之一,不仅在数学领域内占有举足轻重的地位,更在实际问题中发挥着不可替代的作用。我们要想学习反现象传播算法,我们前提是先要学习导数的概念。本节课程我们将看一下导数是什么? 导数 导数,顾名思义,是函数在某一点或某一段区间内…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…