PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录(2024/04/21)

为什么要进行图像的二值化?

当我们处理图像时,常常需要将其转换为二值图像。这是因为在很多应用中,我们只对图像中的某些特定部分感兴趣,而不需要考虑所有像素的颜色信息。下面我会详细解释为什么要进行图像的二值化:

  1. 简化图像结构:彩色图像包含大量的像素,每个像素都有自己的颜色信息。这种复杂性使得图像处理变得复杂。将图像转换为二值图像可以大大简化图像结构,使得后续的处理更加高效。

  2. 突出目标特征:在很多应用中,我们只对图像中的某些目标感兴趣,而不关心其他部分。通过二值化,我们可以将目标与背景分离,突出目标的特征,便于进一步的分析和处理。

  3. 去除噪声:图像中常常包含各种噪声,如摄像头传感器的噪声、环境光线的影响等。这些噪声会干扰图像的分析和处理。通过二值化,我们可以将噪声过滤掉,只保留目标信息,提高图像的质量。

  4. 减少计算量:在一些图像处理算法中,需要对每个像素进行复杂的计算。如果图像的分辨率很高,计算量会非常大。将图像转换为二值图像可以大大减少计算量,提高算法的执行效率。

  5. 图像压缩:二值图像只包含黑白两种颜色,信息量较少。因此,可以通过二值化来压缩图像,减少存储空间和传输带宽。

总之,图像二值化是图像处理中的一项基础技术,它可以简化图像结构、突出目标特征、去除噪声、减少计算量以及实现图像压缩等多种目的。

图像二值化的常用算法

图像二值化是图像处理中的一项基础任务,有许多不同的算法可以实现。以下是几种常用的图像二值化算法:

  1. 全局阈值法(Global Thresholding):全局阈值法是最简单和最常用的二值化方法之一。它通过设定一个全局阈值,将图像中的像素分为两类:大于阈值的像素设为白色,小于等于阈值的像素设为黑色。其中,Otsu 方法是全局阈值法中的一种优化方法,它能自动确定最佳的阈值,使得类间方差最大化。

  2. 局部阈值法(Local Thresholding):局部阈值法考虑到图像中不同区域的灰度分布可能不同,因此采用不同的阈值来进行二值化。常见的局部阈值法包括自适应阈值法和基于统计的方法,如局部均值、局部中值等。

  3. 基于直方图的方法(Histogram-based Methods):这些方法利用图像的灰度直方图来确定阈值。常见的方法包括基于双峰分析、直方图形态学等。

  4. 基于梯度的方法(Gradient-based Methods):这些方法基于图像的梯度信息来确定阈值。常见的方法包括基于边缘检测算子的方法,如Sobel、Prewitt等。

  5. 基于聚类的方法(Clustering-based Methods):这些方法将图像中的像素看作是一个样本集合,利用聚类算法将像素分成两个类别,然后根据类别信息进行二值化。常见的方法包括K均值聚类、自组织映射聚类等。

这些算法各有优缺点,适用于不同的图像处理任务和场景。在实际应用中,根据图像的特点和需求选择合适的二值化算法是非常重要的。我们本节实验主要采用Otsu 方法

Otsu 方法是由日本学者大津展之(Nobuyuki Otsu)于1979年提出的图像二值化算法。这个方法旨在通过自适应地确定最佳阈值,将图像分为背景和前景两个类别,以最大化类间方差来实现图像的自动化处理。

在 Otsu 方法被提出之前,常用的图像二值化方法主要是基于手动设定阈值的全局阈值法。然而,手动选择阈值可能会因为主观性而不准确,尤其是对于不同的图像和应用场景,需要不断调整阈值才能得到满意的结果。Otsu 方法的提出填补了这一缺陷,使得图像二值化可以更加自动化和准确。

Otsu 方法的核心思想是通过最大化类间方差来确定最佳的阈值。在图像中,背景和前景之间的差异体现在它们的灰度分布上。通过寻找一个阈值,使得背景和前景之间的类间方差最大化,我们可以实现最佳的图像二值化。这种方法不仅能够自动地确定最佳阈值,而且在很多情况下能够产生高质量的二值化结果。

Otsu 方法的提出极大地促进了图像处理领域的发展,成为了图像二值化中的经典算法之一。它被广泛应用于数字图像处理、计算机视觉、图像分割等领域,为图像分析和识别提供了重要的基础。

Otsu 算法的详细步骤:

  1. 计算直方图:首先,计算图像的灰度直方图,统计每个灰度级别的像素数量。

  2. 归一化直方图:将直方图中每个灰度级别的像素数量除以图像的总像素数,得到每个灰度级别的归一化频率。

  3. 计算累积分布函数:计算归一化直方图的累积分布函数,即累积概率密度函数。这可以通过累加每个灰度级别的归一化频率来实现。

  4. 初始化类间方差和最佳阈值:初始化类间方差为 0,并将最佳阈值设为 0。

  5. 遍历阈值:对每个可能的阈值 t 进行遍历(从 0 到最大灰度级别)。

  6. 计算类间方差:对于每个阈值 t,计算两个类别的均值和方差,然后根据这些统计量计算类间方差。类间方差可通过下式计算得到:

  7. 选择最佳阈值:选择使类间方差最大的阈值作为最佳阈值,即找到能够最好地将图像分成两个类别,使得类别之间的差异最大化。

  8. 应用阈值:使用最佳阈值将图像进行二值化处理,将大于阈值的像素设为白色(255),小于等于阈值的像素设为黑色(0)。

  9. 通过这些步骤,Otsu 算法能够自动确定最佳的阈值,将图像转换为二值图像,并且在很多情况下能够产生高质量的二值化结果。

用python实现Otsu 算法对图像进行二值化处理

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这个代码会读取名为 Lena.jpg 的彩色图片,然后将其转换为灰度图像,并使用 Otsu 算法进行图像二值化。然后显示原始彩色图像、灰度图像和二值化后的图像。

用如下的powershell指令运行python脚本,后面的教程中将不再举例说明如何运行python文件。

可以看到演示效果:

上面的代码是直接采用的opencv的otsu方法实现的,没有展示细节,我们下面提供的这段代码展示了otsu的方法细节。

matlab版代码

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段 MATLAB 代码实现了以下功能:

  1. 读取名为 “Lena.jpg” 的彩色图像。
  2. 将彩色图像转换为灰度图像。
  3. 使用 Otsu 算法对灰度图像进行二值化处理,得到二值化图像。
  4. 在单个窗口中显示原始彩色图像、灰度图像和二值化图像,以便比较和分析图像处理的效果。

通过这段代码,可以轻松地了解图像处理中常用的 Otsu 二值化算法,并可视化其效果。

FPGA工程分析

工程层次图

与demo18相比,只是多了一个img2rgb的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。

img_rgb2gray2bin u_img_rgb2gray2bin

(

.i_clk(clk_pixel),

.i_rst_n(sys_rst_n),

.i_hs(VGA_HS),

.i_vs(VGA_VS),

.i_de (VGA_DE),

.i_vld(1'b1),

.i_th(78),

.i_r(VGA_RGB[23:16]),

.i_g(VGA_RGB[15:8] ),

.i_b(VGA_RGB[7:0] ),

.o_bin_hs(gray_hs),

.o_bin_vs(gray_vs),

.o_bin_de (gray_de),

.o_bin_data(gray_data)

);

模块代码分析

由于 Otsu 算法使用 Verilog 实现十分复杂,这些步骤在EG4上实现资源不太够, 这里我们将直接指定阈值进行二值化。 

模块的管脚定义注释比较清晰,如下

 

module img_rgb2gray2bin (

input wire i_clk, // 时钟信号

input wire i_rst_n, // 复位信号

input wire i_vld, // 有效信号

input wire [7:0] i_th, // 阈值信号

input wire i_hs, // 水平同步信号

input wire i_vs, // 垂直同步信号

input wire [7:0] i_r, // 红色通道信号

input wire [7:0] i_g, // 绿色通道信号

input wire [7:0] i_b, // 蓝色通道信号

input wire i_de, // 数据使能信号

output reg o_bin_hs, // 二值化水平同步信号

output reg o_bin_vs, // 二值化垂直同步信号

output reg o_bin_de, // 二值化数据使能信号

output reg [7:0] o_bin_data // 二值化图像数据信号

);

代码的流程比较简单先进行灰度转换

然后进行阈值比较

管脚约束

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

时序约束

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

实验结果

这是我的键盘和显示器,这效果出来像水墨画啊,下面是阈值98时候的效果。

说值调到45看看。

调到 78时效果我比较喜欢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript 中的IF判断竟然可以这样写,效率更高

当然,它们是创建控制流的一种简单而方便的方式,但你可以写下数十亿行条件性的 JavaScript 代码,而不需要一个 if 语句。 而且有很多情况下,使用不同的结构会更清晰地展示你想要做的事情 —— 只要我们还在为人类编写代码&#xf…

深度学习系列65:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入,主要流程包括: 1) 使用cv2获取视频中所有帧的列表,如下: 2)定义Croper。核心代码为69行:full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…

基于springboot+vue+Mysql的乐校园二手书交易管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

OPPO手机支持深度测试+免深度测试解锁BL+ROOT权限机型整理-2024年3月更新

绿厂OPPO手机线上线下卖的都很不错,目前市场份额十分巨大,用户自然也非常多,而近期ROM乐园后台受到很多关于OPPO手机的私信,咨询哪些机型支持解锁BL,ROOT刷机,今天ROM乐园正式盘点当前市场上可以解BL刷root…

Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换

1. Android图片压缩、Drawable和Bitmap转换、bitmap和base64转换 1.1. Drawable和Bitmap之间的转化 1.1.1. bitmap和Drawable间的区别 Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565、RGB888。作为一种逐像素的显示对象执…

【YesPMP】众包平台,最新项目

YesPMP平台专注于软件开发领域,是专业的一站式互联网众包平台,目前平台汇聚了上万个解决方案,覆盖全国,拥有众多专业优质的H5开发服务商,专为企业提供软件H5开发解决方案,提高企业的知名度。优秀的H5能为用…

云仓酒庄北京发布会与《综合品酒师》培训的延伸层次分享

原标题:云仓酒庄北京发布会与《综合品酒师》培训近日,云仓酒庄在北京举办了一场盛大的发布会,并近期举行了首届《综合品酒师》培训活动。这一事件不仅引起了业内的广泛关注,更成为了酒类行业专业化、规范化发展的重要里程碑。大世…

[移动端] “viewport“ content=“width=device-width, initial-scale=1.0“ 什么意思

布局视口, 代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>body,html {margin: 0;padding: 0;}.box {width: 200px;height: 200px;background-color: pi…

“无媒体,不活动”,这句话怎么理解?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 “无媒体&#xff0c;不活动”通常指的是在现代社会中&#xff0c;媒体对于各种活动&#xff0c;尤其是公共活动和事件的推广、宣传和影响力是至关重要的。它强调了媒体在塑造公众意识、…

通往AGI路上,DPU将如何构建生成式AI时代的坚实算力基石?

4月19日&#xff0c;在以“重构世界 奔赴未来”为主题的2024中国生成式AI大会上&#xff0c;中科驭数作为DPU新型算力基础设施代表&#xff0c;受邀出席了中国智算中心创新论坛&#xff0c;发表了题为《以网络为中心的AI算力底座构建之路》主题演讲&#xff0c;勾勒出在通往AGI…

Python_AI库 Pandas的数据结构及基本操作

Python_AI库 Pandas的数据结构及基本操作 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 本文篇幅较长&#xff0c;但比较重要&#xff0c;希望读者可以认真看完并实例运行。 Pa…

不可重复读,幻读和脏读

不可重复读一般在读未提交&#xff0c;读已提交这两种隔离级别出现&#xff0c;第一次读和第二次读的数据不一致。 幻读一般在读未提交&#xff0c;读已提交&#xff0c;可重复读出现&#xff0c;原因是第一个事务执行时&#xff0c;第二个事务完成了提交&#xff0c;在第一个…

Xilinx 7系列MMCM/PLL的使用模型

本文展示了MMCM的一些使用模型&#xff08;同样适用于PLL&#xff09;&#xff0c;如时钟网络去偏斜、具有内部反馈的MMCM和零延迟缓冲区等。 1、时钟网络去偏斜&#xff08;Clock Network Deskew&#xff09; MMCM的主要用途之一是用于时钟网络去偏斜。图3-11和图3-12展示了…

SpringCloud中网关-详解、案例(代码)

简介&#xff1a;在Spring Cloud中&#xff0c;网关的角色是非常重要的&#xff0c;它负责整个系统的入口流量&#xff0c;并且可以处理路由、过滤、协议转换等操作 目录 1、网关的技术实现 1.1 网关功能 1.2 网关的形式 2、网关实现步骤 2.1 添加相关依赖 2.2 创建此mod…

获取1年免费的SSL证书

之所以写这篇帖子是因为一直使用的阿里云和腾讯云免费的ssl证书由一年有效期相继改为了3个月&#xff0c;3个月换一次证书想太过麻烦了&#xff0c;还是需要一年有效期的证书更为适合 有两个站点推荐:(本次以FreeSSL为例) .JoySSL一个提供免费HTTPS证书申请的网站 FreeSSL.c…

156.25MHz的差分晶体振荡器SG3225VEN

数字经济正焕发出勃勃生机,云计算,大数据,5G和人工智能等新技术的发展给行业带来了新的机遇。无论是在数据中心内部还是在数据中心之间,提供低成本,高速的100/200/400G小型化解决方案都是光模块的发展需求。为了使DSP稳定工作&#xff0c;需要一个小型的封装晶体振荡器来提供参…

嵌入式学习63-C++

知识零碎&#xff1a; newmalloc friend 友元函数 …

面向对象练习题【从零开始学Java】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

nginx修改http为https

Linux运维工具-ywtool 目录 一. 获取 SSL 证书1.安装openssl2.自签名证书 二.安装SSL证书三.配置Nginx支持HTTPS四.重启nginx 一. 获取 SSL 证书 SSL/TLS证书是用来验证服务器身份和提供一个安全的连接通道的 获取SSL/TLS证书有几种方法 1.购买域名,购买SSL证书 2.自签名证书…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…
最新文章