一、团队介绍
大家好,我们是293小分队,报名编号为CICC1363。本次我们将分享肤色检测的相关知识。水平有限,如果有错误希望大家多多批评指正。
二、肤色检测原理
在RGB图像中,肤色对光照强度的敏感度很高,因此RGB下的肤色没有明显的特异性。而在YCbCr图像中,去除光照强度Y的影响,人的肤色在CbCr中存在明显的聚类,即77
二、肤色检测流程
A. rgb2YCbCr+二值化:
基于以下公式,将浮点数运算转换为定点数运算,并根据77
B. 滤波(腐蚀+膨胀):
图像中可能存在噪声或者其他干扰项,会对肤色检测带来影响,因此需要对其进行去除,最常用的方法便是腐蚀和膨胀操作。
腐蚀操作将图像中的白色区域缩小,从而可以消除二值图像中的噪声白点或者部分干扰白色小区域;而膨胀操作将图像中的白色区域扩大,从而抵消腐蚀操作对图像带来的变化。通过腐蚀和膨胀,可以在几乎不改变图像的前提下消除干扰,提高肤色检测准确度。其效果如下所示:
在FPGA中,实现腐蚀和膨胀操作最主要的就是按照像素点顺序构建3*3方块矩阵,然后对矩阵中的像素点进行运算,对于腐蚀操作就是“与”,对于膨胀操作就是“或”。在vivado中,可以使用shift RAM来构建方块矩阵。shift RAM的深度设置为图像的宽度,两个shift RAM相连分别输出第一行和第二行数据,而输出可以作为第三行数据,从而构成3*3矩阵,并随着像素的输入该矩阵逐次向前推进。
C. 确定区域
对于二值化图像,我们只需要确定白色像素点坐标在X和Y方向的最值,从而确定肤色区域的外围。
三、肤色检测仿真
将像素点保存在文本文档中,通过testbench将其读入到数组中,并依次输入到肤色检测模块中,最终输出坐标最值。