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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定