PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头图像二值化腐蚀效果

本文主要是介绍PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头图像二值化腐蚀效果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接直达

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

图像二值化腐蚀处理有什么作用?

图像二值化腐蚀处理在图像处理中起到了以下作用:

  1. 物体分割与提取:在图像二值化之后,通过腐蚀操作可以消除噪声、连接相邻的物体,并使得物体的边界更加清晰,从而更容易对物体进行分割和提取。

  2. 图像细化:对于二值图像中的细长对象或者凹陷部分,腐蚀操作可以使得这些部分变得更加细长,达到细化的效果,有助于后续的图像分析和处理。

  3. 图像形态学处理:腐蚀操作是形态学图像处理中的基本操作之一,通过腐蚀可以改变图像的形状和结构,使得后续的处理更加精确和准确。

  4. 图像预处理:在图像处理的预处理阶段,二值化腐蚀处理可以使得图像更加规范化和标准化,为后续的特征提取、目标检测等操作提供更好的图像基础。

总的来说,图像二值化腐蚀处理可以提高图像的质量,增强图像的特征,从而更好地适应各种图像处理和分析任务的需求。

图像二值化腐蚀的算法和步骤

图像二值化腐蚀是图像处理中常用的一种形态学操作,其算法和步骤如下:

  1. 二值化:首先将输入的灰度图像进行二值化处理,将图像转换为黑白二值图像。二值化操作可以根据阈值将图像中的像素分为两类,一类是大于阈值的像素(前景),另一类是小于等于阈值的像素(背景)。

  2. 结构元素:定义一个结构元素,通常是一个小的二值化图像,用来表示腐蚀的形状和大小。结构元素可以是任意形状,常见的包括矩形、圆形、十字形等。

  3. 腐蚀操作:对二值化后的图像进行腐蚀操作。腐蚀操作的原理是用结构元素在图像上滑动,如果结构元素完全覆盖了前景区域(像素值为1),则中心像素的值保持为1;否则,中心像素的值被置为0。这样可以使得前景区域逐渐收缩,边界变得更加平滑,孔洞变得更小。

  4. 重复操作:根据具体的需求,可以多次进行腐蚀操作,以进一步缩小前景区域的大小或填充小的孔洞。每次腐蚀操作都会使前景区域缩小,直到达到预期的效果为止。

  5. 输出结果:腐蚀操作结束后,得到经过二值化腐蚀处理的图像,可以用于后续的图像分析、特征提取或目标检测等任务。

总的来说,图像二值化腐蚀的算法步骤简单清晰,通过不断缩小前景区域的像素来实现对图像的处理和特征增强。

我们下需展示的源码是使用的结构元素实为3*3的模板,具体操作是当这九个像素点全为白色(“1”) 时输出白色(“1”), 否则输出黑色(“0”)。 优化成逻辑,就是使用逻辑与运算对这9个像素进行位与操作。 

python代码实现图像二值化腐蚀源码

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

这段代码实现了图像的二值化和腐蚀处理,并通过Matplotlib库将处理后的图像显示出来。

  1. 图像二值化处理

    • 通过循环遍历图像的每个像素,判断其灰度值是否大于阈值92,若大于则将像素值设为255(白色),否则设为0(黑色),从而将图像转换为二值图像。
  2. 腐蚀处理

    • 分别对二值化后的图像进行了三次腐蚀处理,每次腐蚀操作都是基于逻辑运算的操作。
    • 在腐蚀操作中,遍历图像的每个像素点,通过与周围8个像素的值进行逻辑与运算,如果周围8个像素中有一个像素为0,则当前像素也设为0,否则设为255。
    • 第一次腐蚀操作应用于二值化后的图像,第二次和第三次腐蚀操作应用于上一次腐蚀处理后的图像。
  3. 函数说明

    • imread(image_path): 用于读取图像文件。
    • cvtColor(image_in, cv2.COLOR_BGR2GRAY): 将彩色图像转换为灰度图像。
    • imshow(image, cmap='gray'): 显示灰度图像。
    • plt.title('title', fontproperties='Microsoft YaHei'): 设置标题的字体为微软雅黑。

通过这些处理,可以清晰地观察到图像经过二值化和腐蚀处理后的效果,以及不同次数腐蚀处理对图像的影响。

从下图可以看到图像白色的部分减少了:

matlab代码实现图像二值化腐蚀源码

以上代码实现了图像的二值化和腐蚀处理。具体功能如下:

  1. 读取图像并转换为灰度图像:

    • 通过imread函数读取指定路径下的图像文件。
    • 使用rgb2gray函数将读取到的彩色图像转换为灰度图像。
  2. 图像二值化:

    • 将灰度图像中灰度值大于92的像素点设置为255(白色),小于等于92的像素点设置为0(黑色)。
  3. 腐蚀处理:

    • 利用图像的腐蚀操作将目标物体的边界进行腐蚀,消除小的干扰目标和连通区域之间的连接。
    • 采用了多次腐蚀的方式,每次腐蚀都在上一次腐蚀的基础上进行,从而进一步加强腐蚀效果。
  4. 显示图像:

    • 使用subplot函数将原始灰度图像、二值化图像以及三次腐蚀处理后的图像显示在一个窗口中。

函数说明:

  • imread: 用于读取图像文件。
  • rgb2gray: 将彩色图像转换为灰度图像。
  • imshow: 显示图像。
  • subplot: 在一个窗口中显示多个子图像。

从下图可以看到图像白色的部分减少了:

FPGA工程解析

工程层次图

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

demo18相比,只是多了一个img_erosion_fltr 的模块,同时这个例程中使能了video_tgp_24b模块目的是为了不使用摄像头数据而使用video_tgp_24b生成的条纹数,这样效果更明显,也就是下面这两段代码,在从SDRAM读出来之后,经img_erosion_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_erosion_fltr u_img_erosion_fltr_6(.i_clk (clk_pixel ),.i_rst_n (sys_rst_n ),.i_hs (erosion_5_hs ),.i_vs (erosion_5_vs ),.i_de (erosion_5_de ),.i_bin (erosion_5_bin ),.o_hs (erosion_6_hs ),.o_vs (erosion_6_vs ),.o_de (erosion_6_de ),.o_bin (erosion_6_bin ));

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

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_erosion_fltr模块代码解析

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

然后就是检查这9个像素是否都为255,

erosion_and <= r_p11 &

r_p12 &

r_p13 &

r_p21 &

r_p22 &

r_p23 &

r_p31 &

r_p32 &

r_p33;

如果是由结果为255,如果不是则结果为0

if(!i_rst_n)

begin

bin <= 'd0;

end

else if(erosion_and)

begin

bin <= 'd255;

end

else

begin

bin <= 'd0;

end

管脚约束

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

时序约束

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

实验结果:

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

这篇关于PotatoPie 4.0 实验教程(33) —— FPGA实现摄像头图像二值化腐蚀效果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943488

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S