## 数字图像处理
## 一、总述
手势识别是在计算机视觉领域中受到广泛关注的问题,早在深度神经网络崛起前,研究者和程序员们就对该问题进行了一定的探索,但传统的算法比较复杂,而且随着针对目标的变化,算法也会随之改变。
我在本次大作业中用传统的方法实现了手势数字 0 到 5 的识别,不仅能应用于静态图片,而且能在视频流中实现实时的识别。 近年来,深度神经网络得到广泛应用,在计算机视觉领域更是如此,其特点是不需要人工设计算法进行特征提取,且对不同种类的手势有普适性。因此,我训练了一个卷积神经网络进行手势数字的识别。
本项目的传统算法基于 python 的 OpenCV,深度神经网络方法基于 python 的 TensorFlow。
## 二、静态图片手部提取
静态图片提取手部形状其实是一个图像分割问题,可以使用区域生长算法、分水岭算法等。然而,该问题的难度在于:没有进行区域生长的种子点信息,且图片的背景可能很复杂。因此,我们必须针对特定问题设计特殊的解决方案。
### 2.1 彩色空间转换
![](https://www.writebug.com/myres/static/uploads/2022/5/10/a95e7e85064a082febafb4ae6e58bce2.writebug)
观察上面的图片,可以看出手部的颜色偏红,于是我们想到可以将图像从 rgb 空间转化到 YUV 空间来进行分割(Liu, You, Jain, & Wang。
YUV 空间中,“Y”表示明亮度(Luminance 或 Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance 或 Chroma),作用是描述影像色彩及饱和度。下面分别是图片的 YUV 分量。
![](https://www.writebug.com/myres/static/uploads/2022/5/10/57a6c55801c7e23819180bf71b664a48.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/da64f185f4505a2ee741e31acbc71ccb.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/a2e7d5bd45f9f2fba7076e35b5f3fd7b.writebug)
可以看出在图片的 U 分量中,手部的色度比较突出,于是我们选择分量来进行下一步的分割。
为了减小噪声干扰,我们在分割前对 U 分量进行了高斯模糊,卷积核大小为 5 × 5
### 2.2 OTSU 阀值分割
由于图像没有人工标记的种子点,无法使用区域生长、分水岭算法等。因此我们决定使用简单的阀值分割,阀值的选择使用自适应的 OTSU 算法。
OTSU 算法认为使得目标和前景的方差和最小的的阀值为最佳阀值
(Otsu & cybernetics, 1979),方差和为:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/134deb048384480b996918adcecb0a9a.writebug)
图像的总方差:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/708b957a6650b0d33c3e06238b587e08.writebug)
可以看到,图像的总方差等于组内方差和加上组际方差和,且总方差不变。要使组内方差最小,就是要使组际方差最大,即找到使得下式最大的阀值,作为最优阀值。
![](https://www.writebug.com/myres/static/uploads/2022/5/10/d8a34ba0b36fbc8435ca6a78249b07a3.writebug)
使用 OTSU 算法得到的分割结果如下:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/dae4e8ebfa34d704d19ef727a8b9ef63.writebug)
### 2.3 获取手部区域
在分割后,首先使用形态学开运算去除小的噪点,开运算算子为 5 ×
5 大小的矩形,结果如下:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/152feca4867f74c50351ed13f4bf0d2d.writebug)
开运算后,除了手部区域还有一些干扰部分也被识别成前景,为了去除这些区域,我们找出其中的最大连通区(具体流程在下一部分详述),将其作为提取结果。
![](https://www.writebug.com/myres/static/uploads/2022/5/10/be9f7651dcd63f6fb0ca0d3d64a72069.writebug)
## 三、视频流手部提取
在视频流中进行手部提取时,第二部分的算法仍然是适用的,但是视频流手部提取要求实时计算,算法的计算速度至少要快于帧率。而且第二部分的算法对每一帧单独进行计算,没有考虑视频中帧与帧之间的相关性,这显然是不合理的,因此,我们对视频流使用特别的算法进行手部提取。
### 3.1 混合高斯模型
视频流中的手部提取仍然是一个图像分割问题,我们需要决定每一个像素点属于前景还是背景。我们用概率模型对每个像素点建模,设像素点 x 为前景的概率为(),高斯混合模型基于这样的假设(Zivkovic & Van
Der Heijden, 2006):
![](https://www.writebug.com/myres/static/uploads/2022/5/10/179194593b71d202bd6bea2fb0ec51de.writebug)
### 3.1.1 即整幅图像可由 M 个高斯分布相加拟合,为每个高斯分布的权
重,满足 ∑ = 1,, 为高斯分布的均值和方差。要计算(),我们需要确定合适的 M,, , 。
为了确定模型的参数,我们可以使用最大似然估计,似然函数如下:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/a1e0f79d6250fa6fd9c6b80a5f2ea53a.writebug)
为了使似然函数最大,我们可以求导得到参数的极值点。但由于似然函数的对数符号中有求和号,求极值并不方便。因此我们转而使用 EM 算法。
EM 算法适用于不知道采样数据来源于哪一类的情况,首先给一组起始参数
![](https://www.writebug.com/myres/static/uploads/2022/5/10/a9e94e052db90705f42a1e0d765b8737.writebug)
,每一步对 Q 函数进行优化:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/6fe24d94239b03975e7ecd805e3e5843.writebug)
不断迭代,最终得到最优的参数。实际运算时,样本来自于最近多个帧的数据,利用到了视频流帧与帧相关联的特性。这样就可以得到一个分割结果了。
### 3.2 形态学运算
用 GMM 算法得到的手部 mask 比较粗糙,如下图
![](https://www.writebug.com/myres/static/uploads/2022/5/10/855a1499e6bcce9a7b9708a898ef504b.writebug)
可以看出手部之外的一些噪点也被识别为前景,为了去除这些噪点,我们使用开运算:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/079bcf2929f049248b9fb0e4c8127e0c.writebug)
开运算后,手部内有一些小洞,可以使用闭运算填补:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/4e3c94e6f6f48816c6fe3f512a166ad9.writebug)
经过两步运算后,手部区域已经比较完整了,噪声点也比较少,于是我们对灰度图进行二值化,得到结果:
![](https://www.writebug.com/myres/static/uploads/2022/5/10/a412160031b5520defd0ccb1d4cf858d.writebug)
## 四、手势识别
在提取出手部形状的二值图后,接下来就是对手势的识别。我们需要识别的手势包括如下 6 种。
![](https://www.writebug.com/myres/static/uploads/2022/5/10/1e63b8a431e188a7fbbcf3165f81c29f.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/6a0d66adb1bc5382043f821744f5c93b.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/265197e05582adb140cf6c66f384d18e.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/cb9fb1cf5dd536c90854ed03ac315daf.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/c79ad5d7e7e9607c0f5073996e031093.writebug)
![](https://www.writebug.com/myres/static/uploads/2022/5/10/851127445bf3a29708571b4b8570fba3.writebug)
### 4.1 利用最小凸集算法的识别
- 从上面的图片中我们可以看出,数字手势的一个明显特征是两指间指缝的数量:5 的手势有 4 个指缝,4 的手势有 3 个指缝,以此类推。
- 和 1 的手势都没有指缝,这两者的区分我们会用另外的算法。首先讨论如何识别出指缝�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
手势识别是在计算机视觉领域中受到广泛关注的问题,早在深度神经网络崛起前,研究者和程序员们就对该问题进行了一定的探索,但传统的算法比较复杂,而且随着针对目标的变化,算法也会随之改变。 我在本次大作业中用传统的方法实现了手势数字 0 到 5 的识别,不仅能应用于静态图片,而且能在视频流中实现实时的识别。 近年来,深度神经网络得到广泛应用,在计算机视觉领域更是如此,其特点是不需要人工设计算法进行特征提取,且对不同种类的手势有普适性。因此,我训练了一个卷积神经网络进行手势数字的识别。 本项目的传统算法基于 python 的 OpenCV,深度神经网络方法基于 python 的 TensorFlow。
资源推荐
资源详情
资源评论
收起资源包目录
100010948-基于Python OpenCV实现数字图像处理(手势数字识别).zip (21个子文件)
opencv
LICENSE 1KB
代码
traditional
cofig.py 128B
main.py 343B
hand.jpg 148KB
hand_number.py 2KB
extract_hand_video.py 2KB
extract_hand_pic.py 514B
ui.py 7KB
deeplearning
PalmTracker.py 4KB
TrainedModel
GestureRecogModel.tfl.meta 219KB
checkpoint 227B
GestureRecogModel.tfl.index 2KB
GestureRecogModel.tfl.data-00000-of-00001 7.67MB
ContinuousGesturePredictor.py 6KB
ResizeImages.py 464B
ModelTrainer.ipynb 9KB
__pycache__
ResizeImages.cpython-36.pyc 575B
演示视频
神经网络演示.mp4 545KB
传统方法演示.mp4 596KB
报告.pdf 1.76MB
README.md 14KB
共 21 条
- 1
神仙别闹
- 粉丝: 2668
- 资源: 7640
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页