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

news2024/11/19 3:25:08

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.coloradmin.cn/o/1629557.html

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

相关文章

机器视觉系统-工业光源什么是同轴光

光路描述:反射光线与镜头平行,称为同轴光。 效果分析:光线经过平面反射后,与光轴平行地进入镜头。此时被测物相当于一面镜子,图像体现的是光源的信息,当“镜子“出现凹凸不平时,将格外地明显。 …

Win32 API 光标隐藏定位和键盘读取等常用函数

Win32 API 光标隐藏定位和键盘读取等常用函数 一、Win32 API二、控制台程序指令modetitlepausecls 三、控制台屏幕上坐标的结构体COORD四、句柄获取函数GetStdHandle五、控制台光标操作1.控制台光标信息结构体CONSOLE_CURSOR_INFO2.得到光标信息函数GetConsoleCursorInfo3. 设置…

会跳舞的网站引导页HTML源码

源码介绍 这套引导页源码非常好看,网址也不会不停的动起来给人一种视觉感很强烈 简单修改一下里面的地址就行看,非常简单! 效果预览 源码下载 会跳舞的网站引导页HTML源码

排序FollowUp

FollowUp 插入排序 直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i) {int…

64位整数高低位的数据获取与赋值操作探讨

参考本篇->LOWORD和HIWORD函数_hidword-CSDN博客 一&#xff0c;如何获取一个64位整数的高32位和低32位 原理其实很简单&#xff1a; 解释一些概念 ①十六进制和二进制直接挂钩 一个十六位的十六进制数【0XAABBCCDD12345678】转为二进制的过程是把其中的每个数转为对应的二…

构建中小型企业网络-单臂路由

1.给IP地址配置好对应的IP和网关 2.配置交换机 3.路由配置 在交换机ge0/0/1中配置端口为trunk是可以允许多个vlan通过的&#xff0c;但路由器是不能够配置vlan&#xff0c;而交换机和路由器间连接的只有一根线&#xff0c;一个端口又只能配置一个ip地址&#xff0c;只有一个ip地…

人脸识别概念解析

目录 1. 概述 2. 人脸检测 3. 人脸跟踪 4. 质量评价 5. 活体检测 6. 特征提取 7. 人脸验证 8. 人脸辨识 1. 概述 人脸识别在我们的生活中随处可见&#xff0c;例如在大楼门禁系统中&#xff0c;它取代了传统的门禁卡或密码&#xff0c;提高了进出的便捷性和安全性。在商…

如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器

提供一份资料文档以一个具体的工程案例来讲解&#xff0c;如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器。采用的数据采集模块是有人物联的边缘采集4G DTU&#xff0c;采集多个多功能电表和远传水表的数据&#xff0c;通过MQTT通讯的型式传送给MQTT服务器&#xf…

Elsevier(爱思唯尔)期刊—Latex模板下载、使用、投稿过程

目录 一、Elsevier期刊-Latex模板下载 1. Elsevier 通用latex模板下载&#xff1a;【elsarticle.zip】 2. Elsevier 复杂版式latex模板下载&#xff1a;【els-cas-templates.zip】&#xff0c;有单栏和双栏版本 二、Elsevier期刊-Latex模板使用 1. 通用模板【elsarticle.zi…

【源码】IM即时通讯源码/H5聊天软件/视频通话+语音通话/带文字部署教程

【源码介绍】 IM即时通讯源码/H5聊天软件/视频通话语音通话/带文字部署教程 【源码说明】 测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;根据情况开启SSL 登录后台看到很熟悉。。原来是…

如何在 Ubuntu 12.04 上使用 Apache 配置 WebDAV 访问

简介 WebDAV 是内置在 HTTP 中的分布式网络编辑实现&#xff0c;允许您轻松共享文件并与他人协作。 我们可以在 Web 服务器中安装此扩展&#xff0c;以允许通过 Web 浏览器远程读写访问本地文件。在本指南中&#xff0c;我们将在带有 Apache Web 服务器的 Ubuntu 12.04 VPS 上…

Mysql--创建数据库

一、创建一个数据库 “db_classes” mysql> create database db_classes; mysql> show databases; -------------------- | Database | -------------------- | db_classes | | information_schema | | mysql | | performance_schema | |…

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper&#xff1a;https://arxiv.org/pdf/2403.07589 code&#xff1a;暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下&#xff1a; 地址 实践 ansible目录结构 如对 ansible 不熟悉&#xff0c;离线包下载有问题&#xff0c;请至此地址下载&#xff0c;按本文操作可直接使用。 相关文章链接如下 文章地…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…

Android Studio gradle 默认sourceSets配置

一. AS默认的sourceSets配置 sourceSets在Android插件中如何使用的&#xff1a;android {sourceSets {main {manifest.srcFile AndroidManifest.xmljava.srcDirs [src]resources.srcDirs [src]aidl.srcDirs [src]renderscript.srcDirs [src]res.srcDirs [res]assets.srcD…

企业智能名片小程序:AI智能跟进功能助力精准营销新篇章

在数字化浪潮的推动下&#xff0c;企业营销手段不断迭代升级。如今&#xff0c;一款集手机号授权自动获取、智能提醒、访客AI智能跟进及客户画像与行为记录于一体的企业智能名片小程序&#xff0c;正以其强大的AI智能跟进功能&#xff0c;助力企业开启精准营销的新篇章。 通过深…

STM32用HAL库函数实现硬件IIC

/*出处&#xff1a;【STM32入门教程-2024】第12集 IIC通信与温湿度传感器AHT20(DHT20)_哔哩哔哩_bilibili */ 这篇笔记我主要介绍代码实现&#xff0c;想要了解原理的请自己看视频&#xff0c;我不过多赘述了。 AHT20通信数据帧格式&#xff1a; ①对照手册上的通信流程写初…

政安晨:【Keras机器学习示例演绎】(二十)—— 综合梯度的模型可解释性

目录 综合梯度 设置 综合梯度算法 可视化渐变和集成渐变的辅助类 让我们试一试 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c…