GEI步态能量图生成
步态能量图生成主要有两步,主要为:
在原始轮廓图上对人的轮廓进行裁剪,在下面制作步态能量图图片叠加以什么为中心位置也是一个问题。一般有两种方式,一种是中心位置为人体宽的一半。另一种是以头顶为中心位置。如:下图为原始图像与裁剪后的图像

为人体宽一般为中心位置

以头顶为中心位置

对裁剪后图像合成,一个步态周期的图像合成一个步态能量图,步态周期如何判断,网上有一些方法,这里直接是手动指定的。如下图为一个步态周期

以身宽一般为中心合成的步态能量图为:

以头顶为中心合成步态能量图为:

可以看出以头顶为中心效果比较好
代码如下裁剪轮廓,存放到与原文件夹相同格式的文件目录中,在通过裁剪的图生成GEI
以CISIA-B数据集为例,原文件目录格式为

生成的剪切图

生成的一张步态能量图

这里以一个整个步态序列作为周期
import os
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
def cut_image(path,cut_path,size):
'''
剪切图片
:param path: 输入图片路径
:param cut_path: 剪切图片后的输出路径
:param size: 要剪切的图片大小
:return:
'''
for (root,dirs,files) in os.walk(path):
temp = root.replace(path,cut_path)
if not os.path.exists(temp):
os.makedirs(temp)
for file in files:
image,flag = cut(Image.open(os.path.join(root,file)))
if not flag: Image.fromarray(image).convert('L').resize((size,size)).save(os.path.join(temp,file))
pass
def cut(image):
'''
通过找到人的最小最大高度与宽度把人的轮廓分割出来,、
因为原始轮廓图为二值图,因此头顶为将二值图像列相加后,形成一列后第一个像素值不为0的索引。
同理脚底为形成一列后最后一个像素值不为0的索引。
人的宽度也同理。
:param image: 需要裁剪的图片 N*M的矩阵
:return: temp:裁剪后的图片 size*size的矩阵。flag:是否是符合要求的图片
'''
image = np.array(image)
# 找到人的最小最大高度与宽度
height_min = (image.sum(axis=1)!=0).argmax()
height_max = ((image.sum(axis=1)!=0).cumsum()).argmax()
width_min = (image.sum(axis=0)!=0).argmax()
width_max = ((image.sum(axis=0)!=0).cumsum()).argmax()
head_top = image[height_min,:].argmax()
# 设置切割后图片的大小,为size*size,因为人的高一般都会大于宽
size=height_max-height_min
temp = np.zeros((size,size))
# 将width_max-width_min(宽)乘height_max-height_min(高,szie)的人的轮廓图,放在size*size的图片中央
# l = (width_max-width_min)//2
# r = width_max-width_min-l
# 以头为中心,将将width_max-width_min(宽)乘height_max-height_min(高,szie)的人的轮廓图,放在size*size的图片中央
l1 = head_top-width_min
r1 = width_max-head_top
# 若宽大于高,或头的左侧或右侧身子比要生成图片的一般要大。则此图片为不符合要求的图片
flag = False
if size<=width_max-width_min or size//2<r1 or size//2<l1:
flag = True
return temp,flag
# centroid = np.array([(width_max+width_min)/2,(height_max+height_min)/2],dtype='int')
temp[:,(size//2-l1):(size//2+r1)] = image[height_min:height_max,width_min:width_max ]
return temp,flag
def GEI(cut_path,data_path,size):
'''
生成步态能量图
:param cut_path: 剪切后的图片路径
:param data_path: 生成图片的路径
:param size: 生成能量图大小
:return:
'''
for (root,dirs,files) in os.walk(cut_path):
temp = root.replace(cut_path,data_path)
if not os.path.exists(temp):
os.makedirs(temp)
GEI = np.zeros([size,size])
if len(files)!=0:
for file in files:
GEI += Image.open(os.path.join(root,file)).convert('L')
GEI /= len(files)
Image.fromarray(GEI).convert('L').resize((size,size)).save(os.path.join(temp,'1.png'))
pass
if __name__=='__main_':
cut_image("C:\\Users\\China\\Desktop\\GaitDatas","C:\\Users\\China\\Desktop\\CutImage",126)
GEI("C:\\Users\\China\\Desktop\\CutImage","C:\\Users\\China\\Desktop\\GEIData",126)
GEI步态能量图生成的更多相关文章
- css sprite,css雪碧图生成工具V3.0更新
V3.0主要改进 1.增加了单独添加单张图片以及删除单张图片的功能 2.增加了生成.sprite文件用以保存雪碧图信息 3.增加了打开.sprite文件功能 什么是css sprite CSS spr ...
- !!字体图标(iconfont、Fontello 、雪碧图生成工具。Glyphicons、fontawesome 等)。 图片压缩
http://www.iconfont.cn/ 阿里巴巴矢量图标库 iconfont http://fontawesome.io fontawesome图标 http://www.bootcss.c ...
- 无线网络实体图生成工具airgraph-ng
无线网络实体图生成工具airgraph-ng airgraph-ng是aircrack-ng套件提供的一个图表生成工具.该工具可以根据airodump工具生成的CSV文件绘制PNG格式的图.绘制的 ...
- D3(v5) in TypeScript 坐标轴之 饼状图生成
饼状图生成时依旧遇到了类型问题,记录如下: import * as d3 from 'd3'; import * as React from 'react'; class TestGraph exte ...
- 在EA中用ER图生成数据库
ER图 E-R图也称实体-联系图(Entity Relationship Diagram).提供了表示实体类型.属性和联系的方法.用来描写叙述现实世界的概念模型. 实体就是看的见摸得着或者能被人感知接 ...
- 一个简单的QQ隐藏图生成算法 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传
一个简单的QQ隐藏图生成算法 隐藏图不是什么新鲜的东西,具体表现在大部分社交软件中,预览图看到的是一张图,而点开后看到的又是另一张图.虽然很早就看到过这类图片,但是一直没有仔细研究过它的原理,今天 ...
- unity读取灰度图生成三维地形mesh
准备灰度图 IGray.png及草地贴图 IGrass.jpg ,放入Assets下StreamingAssets文件夹中. 创建空材质,用作参数传入脚本. 脚本如下,挂载并传入材质球即可 ...
- Ambari服务依赖关系图生成脚本
1. 生成服务依赖关系 #!/usr/bin/python import sys import commands import json def genDependString(ip): url=&q ...
- V4.0到来了,css雪碧图生成工具4.0更新啦
V3.0介绍 http://www.cnblogs.com/wang4517/p/4476758.html V4.0更新内容 V4.0下载地址:http://download.csdn.net/det ...
随机推荐
- 记一次odoo创建新的模块时,但是在odoo web界面找不到应用的案例
原因就是在odoo.conf配置文件中没有说明 模块查找的路径
- Jmeter之用户参数和用户定义的变量
在调试脚本的时候,可以使用前置处理器中的用户参数组件进行数据的提供,在该数据中可以使用固定值也可以使用变量值. 如果是固定不变的一些配置项,不需要多个值的时候,也可以使用用户已定义的变量组件. 一.界 ...
- mybatis 如何关闭connection
1.前言 最开始操作数据库是使用jdbc操作数据库,每次创建一个连接都需要关闭连接,避免占用资源.比如 Class.forName("com.jdbc.mysql.Driver") ...
- 5519: [Usaco2016 Open]Landscaping
农夫约翰正在建造一个美丽的花园,在这个过程中需要移动大量的泥土.花园由N个花圃(1≤N≤100,000)组成,第i个花圃最开始有Ai个泥土. 农夫约翰想要重新整理花园,使每个花圃最后有Bi个泥土.Ai ...
- yolov--7--解决报错:/bin/sh: 1: nvcc: not found make: *** [obj/convolutional_kernels.o] Error 127
1.配置darknet配置darknet出现错误: qhy@qhy-desktop:~/darknet$ make cleanqhy@qhy-desktop:~/darknet$ make……gcc ...
- Ecshop二次开发必备基础
EcShop二次开发学习方法 近年来,随着互联网的发展,电子商务也跟着一起成长,B2B,C2C,B2C的电子商务模式也不断的成熟.这时催生出了众多电子商务相关的PHP开源产品.B2C方面有Ecshop ...
- linux 简单安装mongodb
Linux 安装mongodb 1.下载mongodb linux wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon- ...
- 《剑指offer》面试题20 顺时针打印矩阵 Java版
我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的 ...
- React父子组件间的传值
父组件: import React, { Component } from 'react'; import Child from './chlid'; class parent extends Com ...
- SCUT - 365 - 鹏哥的数字集合 - wqs二分 - 斜率优化dp
https://scut.online/p/365 https://www.luogu.org/problemnew/solution/P2365 写这篇的时候还不是很明白,看一下这个东西. http ...