GEI步态能量图生成

步态能量图生成主要有两步,主要为:

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

    1066465-20190523220950322-50381872.png

    为人体宽一般为中心位置

    1066465-20190523220907606-419487260.png

    以头顶为中心位置

    1066465-20190527194533651-2075490131.png

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

    1066465-20190524121806321-1163561079.png1066465-20190524121808424-890453629.png1066465-20190524121813120-815016086.png1066465-20190524121814898-1473959564.png1066465-20190524121816645-814748161.png1066465-20190524121818585-633385453.png1066465-20190524121821567-1470442691.png1066465-20190524121824661-89554174.png1066465-20190524121827010-859165350.png1066465-20190524121828422-1944765516.png1066465-20190524121830052-660679009.png1066465-20190524121831841-2069876113.png1066465-20190524121834864-2009657482.png1066465-20190524121837809-1465831762.png1066465-20190524121851010-729554488.png

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

    1066465-20190524122446827-1000238099.png

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

    1066465-20190527194717124-777046079.png

    可以看出以头顶为中心效果比较好

代码如下裁剪轮廓,存放到与原文件夹相同格式的文件目录中,在通过裁剪的图生成GEI
以CISIA-B数据集为例,原文件目录格式为
1066465-20190626114421775-174734749.png
生成的剪切图
1066465-20190626114138932-328073132.png
生成的一张步态能量图
1066465-20190626114313946-771791902.png

这里以一个整个步态序列作为周期

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)

转载于:https://www.cnblogs.com/lolybj/p/10914957.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值