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

news2024/11/16 9:23:51

链接直达

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秒,可以看到图中的白条纹越来越小,黑条纹越来越大,就是白条纹被腐蚀了。

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

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

相关文章

搭建Kafka源码环境并测试

文章目录 一、前言二、环境准备三、环境搭建3.1 JDK 环境搭建3.2 Scala 环境搭建3.2.1 配置 Scala 环境变量3.2.2 验证 3.3 Gradle 环境搭建3.3.1 配置 Gradle 环境变量3.3.2 验证 3.4 Zookeeper 环境搭建3.4.1 配置 Zookeeper 环境变量3.4.2 验证 3.5 Kafka 源码搭建3.5.1 导入…

44. UE5 RPG 初始化敌人的属性

在正常的游戏中&#xff0c;我们应该考虑如何去初始化角色属性&#xff0c;并且要给角色分好类型。比如&#xff0c;在我们游戏中&#xff0c;我们如何去初始化小兵的属性&#xff0c;并且还要实现小兵随着等级的增长而增加属性。而且就是小兵也有类型的区分&#xff0c;比如我…

使用qemu调试NVME driver

参考nvme驱动相关的博客&#xff0c;可以使用qemu buildroot进行nvme驱动的流程debug。 一、QEMU编译 首先需要编译qemu&#xff0c;可以参考QEMU编译。wget下载最新版本的QEMU&#xff0c;编译之前&#xff0c;最好检查下依赖包是否安装&#xff0c;避免安装过程出现各种错…

c++容器与算法概述

容器与算法 每个标准库容器都提供了begin() end() 函数&#xff0c;分别返回容器的头部位置和尾部位置。 I/O 流 对于自定义的类型&#xff1a; struct Entry {std::string name;int number;};如果需要使用标准输出需要重载<< 运算符&#xff0c;特别注意&#xff1a…

环形链表的经典问题

环形链表 环形链表的介绍链表中是否带环返回链表开始入环的第一个节点 本文主要介绍如何判断一个链表是否是环形链表&#xff0c;以及如何得到环形链表中的第一个节点。 环形链表的介绍 环形链表是一种链表数据结构&#xff0c;环形链表是某个节点的next指针指向前面的节点或指…

微软如何打造数字零售力航母系列科普05 - Azure中计算机视觉的视觉指南

Azure中计算机视觉的视觉指南 什么是计算机视觉&#xff1f;如何使用Microsoft Azure将计算机视觉功能集成到应用程序和工作流中&#xff1f; 作者&#xff1a;Nitya Narasimhan 编辑&#xff1a;数字化营销工兵 •11分钟阅读 什么是计算机视觉&#xff1f;如何使用Microso…

在树莓派安装 rpi-imager

步骤 安装 sudo apt install rpi-imager 我没有更新镜像源&#xff0c; 但是能安装完&#xff0c; 只是花的时间旧点。 烧写镜像 因为我是没有桌面的树莓派系统&#xff0c; 所以我这里执行的指令是不需要显示图形化界面的 man rpi-imager ## man指令查看说明 查看帮助手…

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 &#xff08;1&#xff09;登录接口 &#xff08;2&#xff09;图书列表接口 三、服务器代码 &#xff08;1&#xff09;创建一个UserController类&#xff0c;实现登录验证接口 &#xff…

服务运营 | 精选:用药难?用药贵?运筹学与统计学视角下的药物研发与管理

作者设计了一个多阶段博弈论模型来针对罕见病的不同补贴方案&#xff0c;分析政府、联盟、制药商和患者之间的相互作用。 制药商补贴为 α C \alpha C αC&#xff0c;其中 C C C是研发成本&#xff0c; α ∈ [ 0 , 1 ) \alpha \in [0,1) α∈[0,1)是政府总成本的比例。患者补…

vue3 依赖-组件tablepage-vue3 项目公共配置封装

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

模型智能体开发之metagpt-多智能体实践

参考&#xff1a; metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case&#xff0c;但是现实生活场景是很复杂的&#xff0c;所以单智能体远远不能满足我们的诉求&#xff0c;所以仍然还需要了解多智能体的实现。通过多个role对动…

Android11适配

一、分区存储 1.背景 Android 11 进一步增强了平台功能&#xff0c;为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分&#xff0c;平台引入了进一步的改进&#xff0c;以简化向分区存储的转换。 为了让用户更好地控制自己的文件&#xff0c;保护用户…

【华为】华为防火墙双机热备

【华为】华为防火墙双机热备 实验需求实验拓扑配置FW5-M前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; FW6-B前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; LSW2PC NATSNAT &#xff1a;Easy IPDNAT&…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分&#xff0c;它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中&#xff0c;聚碳酸酯&#xff08;PC&#xff09;是一种常用的材料&#xff0c;它具有高抗冲击性、耐化学品腐蚀和优良的…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

使用 Python 和 OpenCV 进行实时目标检测的详解

使用到的模型文件我已经上传了&#xff0c;但是不知道能否通过审核&#xff0c;无法通过审核的话&#xff0c;就只能 靠大家自己发挥实力了&#xff0c;^_^ 目录 简介 代码介绍 代码拆解讲解 1.首先&#xff0c;让我们导入需要用到的库&#xff1a; 2.然后&#xff0c;设…

【数据结构-之八大排序(下),冒泡排序,快速排序,挖坑法,归并排序】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展&#xff1a;意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用&#xff08;1&#xff09;意向锁的兼容互斥性&#xff08;2&#xff09;例子1&#xff08…

Springboot+vue+小程序+基于微信小程序的在线学习平台

一、项目介绍    基于Spring BootVue小程序的在线学习平台从实际情况出发&#xff0c;结合当前年轻人的学习环境喜好来开发。基于Spring BootVue小程序的在线学习平台在语言上使用Java语言进行开发&#xff0c;在数据库存储方面使用的MySQL数据库&#xff0c;开发工具是IDEA。…

主成分分析在R语言中的简单应用:使用mvstats包

在数据科学领域&#xff0c;主成分分析&#xff08;PCA&#xff09;是一种广泛使用的技术&#xff0c;主要用于数据降维和探索性数据分析。PCA可以帮助我们发现数据中的模式&#xff0c;减少数据集的复杂性&#xff0c;同时保持数据中最重要的特征。本文将介绍如何在R语言中使用…