基于FPGA的肤色识别算法实现

         大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现。

         我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现。

将彩色图像转化为灰度的方法有两种,一个是令RGB三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为YCbCr格式,将Y分量提取出来,YCbCr格式中的Y分量表示的是图像的亮度和浓度所以只输出Y分量,得到的图像就是灰度图像了。我在这里选择第二种方法实现。

YCBCr是通过有序的三元组来表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。人的肉眼对由YCbCr色彩空间编码的视频中的Y分量更敏感,而Cb和Cr的微小变化不会引起视觉上的不同,根据该原理,通过对Cb和Cr进行子采样来减小图像的数据量,使得图像对存储需求和传输带宽的要求大大降低,从而达到在完成图像压缩的同时也保证了视觉上几乎没有损失的效果,进而使得图像的传输速度更快,存储更加方便。我们要的到灰度图像,首先要将采集到的彩色图像转化为YCbCr。

         我通过串口发送的彩色图片数据是RGB332 8bit,根据官方给出的转化公式是RGB888->YCbCr,所以我首先要将8bit RGB332转化为24bit RGB888。转化如下,这里用到了循环补偿的概念。

从如上转化可以看出,B分量进行了四轮补偿。进行这样的补偿,在做色彩格式转化的时候,能够明显的改善色彩效果,减少精度上的损失。代码实现部分如下。

下面是官方给的RGB888 to YCbCr的算法公式,我们可以直接把算法移植到FPGA上,但是我们都知道FPGA无法进行浮点运算,所以我们采取将整个式子右端先都扩大256倍,然后再右移8位,这样就得到了FPGA擅长的乘法运算和加法运算了。

这个计算式子看起来是十分简单的,但是要是直接用Verilog直接写出来,那么只能说,这个人的代码写的一塌糊涂,所以这里就引出FPGA中流水线的设计思想。

         在这里我们选择加3级流水线,就第一个Y分量而言,先计算括号中得乘法运算,消耗一个时钟,然后将括号中的数据求和,消耗一个时钟,这里为了计算方便,将128也扩大256倍,放到括号中,最终结果除以256就行了也就是右移8位,在FPGA中我们只需要舍弃低8位取高8位就行。

将RGB565—>YCbCr成功后,提取出Y的值输出,就可以得到灰度色彩的图像了。

将采集到的RGB565的像素数据,输入到算法处理模块进行操作,由RGB565——>YCbCr——Gray官方给出的公式来算,先将RGB565拆分开R G B三个分量,使用如上公式计算的到Y Cb Cr是三个分量。

RGB转YCbCr算法的仿真过程,从图中可以看出,加了流水线后的运算过程,每一级运算相差一个时钟,然而每一级都在进行新的运算,我们加了3级流水线,这样运算速度可以提升3倍。

最后将Y分量的数据输出,进行位拼接,16位的RGB565像素R、G、B分量分别对应的取Y分量的高位,最后的输出显示出来就是灰度图像了。

视频演示请看我微博链接http://t.cn/RO9DJoZ

         对于肤色检测其实也是基于这个基础上,首先利用如上图公式将RGB转化为YCbCr,然后通过对Cb和Cr分量设置阈值,我这边设置的是当Cb和Cr分量在这个阈值之间时,输出为全1,即白色,其他情况输出为全0,即为黑色,我使用前面的200x200的图片做实验,效果不怎么好,最后借用业界前辈CrazyBingo大神的摄像头驱动,试了一下这个肤色识别算法,最后得到的效果还是可以的。这个用YCbCr阈值法实现肤色识别的方法,是不很精确,后面我会尝试用另一种识别方法来试着实现。

肤色识别YCbCr阈值

77 < Cb < 127

133 < Cr < 173

最终的效果如下视频:http://t.cn/ROwEnrb

转载请注明出处:NingHeChuan(宁河川)

图像处理系列文章

第一篇:基于FPGA的VGA显示静态图片

第二篇:基于FPGA的RGB565_YCbCr_Gray算法实现

第三篇:基于FPGA的Uart接收图像数据至VGA显示

番外篇:数字图像处理界标准图像 Lena 后面的故事

第四篇:纠错:基于FPGA串口发送彩色图片数据至VGA显示

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

干货!这里有一份神经网络入门指导,请收下!

图片来源于网络 翻译 | 林椿眄 编辑 | Donna 本周,我们为您准备了一份数据科学家Ben Gorman撰写的神经网络指导。这份指导包含了他具体的学习思路...

1817
来自专栏奇点大数据

深度学习入门必须理解这25个概念

1)神经元(Neuron):就像形成我们大脑基本元素的神经元一样,神经元形成神经网络的基本结构。想象一下,当我们得到新信息时我们该怎么做。当我们获取信息时,我们...

491
来自专栏决胜机器学习

神经网络和深度学习(五) ——深层神经网络基础

神经网络和深度学习(五)——深层神经网络基础 (原创内容,转载请注明来源,谢谢) 一、概述 本文是对深层神经网络的基础,主要讨论深层神经网络的算法、公式推导以...

3677
来自专栏开源FPGA

基于FPGA的彩色图像转灰度算法实现

  昨天才更新了两篇博客,今天又要更新了,并不是我垃圾产,只不过这些在上个月就已经写好了,只是因为比赛忙,一直腾不出时间整理出来发表而已,但是做完一件事情总感觉...

2439
来自专栏机器之心

学界 | 取代学习率衰减的新方法:谷歌大脑提出增加Batch Size

31911
来自专栏企鹅号快讯

如何使用Keras集成多个卷积网络并实现共同预测

在统计学和机器学习领域,集成方法(ensemble method)使用多种学习算法以获得更好的预测性能(相比单独使用其中任何一种算法)。和统计力学中的统计集成(...

3369
来自专栏大数据挖掘DT机器学习

机器学习——感知器学习算法

这里开始介绍神经网络方面的知识(Neural Networks)。首先我们会介绍几个监督式学习的算法,随后便是非监督式的学习。 一、感知器学习算法基本介绍 1...

3628
来自专栏深度学习思考者

机器学习——Dropout原理介绍

一:引言   因为在机器学习的一些模型中,如果模型的参数太多,而训练样本又太少的话,这样训练出来的模型很容易产生过拟合现象。在训练bp网络时经常遇到的一个问题,...

3598
来自专栏决胜机器学习

深层神经网络参数调优(二) ——dropout、题都消失与梯度检验

深层神经网络参数调优(二)——dropout、题都消失与梯度检验 (原创内容,转载请注明来源,谢谢) 一、dropout正则化 中文是随机失活正则化,这个是一...

3495
来自专栏AI科技大本营的专栏

深度学习入门必须理解这25个概念

1)神经元(Neuron):就像形成我们大脑基本元素的神经元一样,神经元形成神经网络的基本结构。想象一下,当我们得到新信息时我们该怎么做。当我们获取信息时,我们...

1073

扫码关注云+社区