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.hqwc.cn/news/660106.html

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

相关文章

【VSCode调试技巧】Pytorch分布式训练调试

最近遇到个头疼的问题&#xff0c;对于单机多卡的训练脚本&#xff0c;不知道如何使用VSCode进行Debug。 解决方案&#xff1a; 1、找到控制分布式训练的启动脚本&#xff0c;在自己的虚拟环境的/lib/python3.9/site-packages/torch/distributed/launch.py中 2、配置launch.…

微视网媒:引领新媒体时代的视觉先锋

在信息爆炸的时代&#xff0c;内容消费的方式日新月异&#xff0c;而“微视网媒”正是这场媒体变革中的佼佼者。凭借其独特的视角、精湛的制作和广泛的传播渠道&#xff0c;微视网媒不仅改变了人们获取信息的方式&#xff0c;更在不断地塑造着未来的媒体生态。 一、创新内容&am…

Hotcoin Research | 市场洞察:2024年4月22日-28日

加密货币市场表现 本周内加密大盘整体呈现出复苏状态&#xff0c;在BTC减半后进入到震荡上行周期。BTC在$62000-66000徘徊&#xff0c;ETH在$3100-3300徘徊&#xff0c;随着港交所将于 4 月 30 日开始交易嘉实基金的比特币和以太坊现货 ETF&#xff0c;周末行情有一波小的拉升…

【Qt】QtCreator忽然变得很卡

1. 问题 Qt Creator忽然变得很卡。电脑里两个版本的Qt Creator&#xff0c;老版本的开启就卡死&#xff0c;新版本好一点&#xff0c;但是相比于之前也非常卡&#xff0c;最明显的是在 ctrl鼠标滚轮 放大缩小的时候&#xff0c;要卡好几秒才反应。 2. 解决方案 2.1 方法1 关…

2000.1-2023.8中国经济政策不确定性指数数据(月度)

2000.1-2023.8中国经济政策不确定性指数数据&#xff08;月度&#xff09; 1、时间&#xff1a;2000.1-2023.8 2、指标&#xff1a;CNEPU&#xff08;经济政策不确定性指数&#xff09; 3、来源&#xff1a;China Economic Policy Uncertainty Index 4、用途&#xff1a;可…

虚析构与纯虚析构

这里的new Cat("Tom"&#xff09;是由于基类函数中的构造函数里面带有string变量 1. 法一:利用虚函数&#xff0c;虚化基类中的析构函数 virtual ~Animal() { cout << "动物的析构函数调用" << endl; } 2. 法二:利用纯…

188页 | 2023企业数字化转型建设方案(数据中台、业务中台、AI中台)(免费下载)

1、知识星球下载&#xff1a; 如需下载完整PPTX可编辑源文件&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/19KcxSeyA 2、免费领取步骤&#xff1a; 【1】关注公众号 方案驿站 【2】私信发送 2023企业数字化转型建设方案 【3】获取本方案PDF下载链接&#xff0…

文件分块+断点续传 实现大文件上传全栈解决方案(前端+nodejs)

1. 文件分块 将大文件切分成较小的片段&#xff08;通常称为分片或块&#xff09;&#xff0c;然后逐个上传这些分片。这种方法可以提高上传的稳定性&#xff0c;因为如果某个分片上传失败&#xff0c;只需要重新上传该分片而不需要重新上传整个文件。同时&#xff0c;分片上传…

可以在手机端运行的大模型标杆:微软发布第三代Phi-3系列模型,评测结果超过同等参数规模水平,包含三个版本,最小38亿,最高140亿参数

本文原文来自DataLearnerAI官方网站&#xff1a; 可以在手机端运行的大模型标杆&#xff1a;微软发布第三代Phi-3系列模型&#xff0c;评测结果超过同等参数规模水平&#xff0c;包含三个版本&#xff0c;最小38亿&#xff0c;最高140亿参数 | 数据学习者官方网站(Datalearner…

Amazon云计算AWS之[5]关系数据库服务RDS

文章目录 RDS的基本原理主从备份和下读写分离 RDS的使用 RDS的基本原理 Amazon RDS(Amazon Relational Database Service) 将MySQL数据库移植到集群中&#xff0c;在一定的范围内解决了关系数据库的可扩展性问题。 MySQL集群方式采用Share-Nothing架构。每台数据库服务器都是…

Kimichat使用技巧:方便又实用的kimi+智能体

今天kimi智能助手推出了kimi的功能。简单的说&#xff0c;就是一系列kimi已经写好的提示词&#xff0c;用户可以直接调用、对话。 Kimi分为官方推荐、办公提效、辅助写作、社交娱乐、生活实用这几类。可以从左边侧边栏点击进入。 官方推荐的有&#xff1a; Kimi 001号小客服&…

final、finally、finalize有什么区别?

引言 在Java编程语言中&#xff0c;final、finally和finalize是三个具有不同用途和语义的关键字或方法。它们在编程和面试中经常被提及&#xff0c;因此理解它们之间的区别是非常重要的。 题目 final、finally、 finalize有什么区别&#xff1f; 典型回答 final&#xff1…