Python 实现步态能量图

步态识别领域有相当多的研究是基于 “类能量图”。一个步态周期内的所有轮廓按照某种规则累计构成的模板统称为 “类能量图”。能量图法不易受到轮廓噪声的干扰,有效地融合空间的信息,但是特征维数较高。下表展示了 “类能量图” 的主要类型[1]。本博客用 Python 实现步态能量图。
Python 实现步态能量图
文章图片

1 思路 首先我们通过图像分割算法可以获得一个步态内人的二值轮廓图像,如下所示:
Python 实现步态能量图
文章图片

然后我们需要将人从图片中剪切出来,获得一副较小的图片,然后按照步态能量图中的计算公式将一个步态内的图像叠加在一起后除以图片数目。
2 实现 2.1 图像剪裁 代码:

def cut_img(img, T_H, T_W): # 获得最高点和最低点 y = img.sum(axis=1) y_top = (y != 0).argmax(axis=0) y_btm = (y != 0).cumsum(axis=0).argmax(axis=0) img = img[y_top:y_btm + 1, :] # 如果高比宽要大,用高计算 resize 的比例 _r = img.shape[1] / img.shape[0] _t_w = int(T_H * _r) img = cv2.resize(img, (_t_w, T_H), interpolation=cv2.INTER_CUBIC) # 获得人的对称轴 sum_point = img.sum() sum_column = img.sum(axis=0).cumsum() x_center = -1 for i in range(sum_column.size): if sum_column[i] > sum_point / 2: x_center = i break h_T_W = int(T_W / 2) left = x_center - h_T_W right = x_center + h_T_W if left <= 0 or right >= img.shape[1]: left += h_T_W right += h_T_W _ = np.zeros((img.shape[0], h_T_W)) img = np.concatenate([_, img, _], axis=1) img = img[:, left:right] return img.astype('uint8')

测试:
# 图片读取为二值格式 img = cv2.imread('H:/gait recognition/data/001-bg-01-090-044.png',-1) img1 = cut_img(img, 128, 128)cv2.imshow('image', img) cv2.imshow('image1', img1) cv2.waitKey(0) cv2.destroyAllWindows()

结果显示:
Python 实现步态能量图
文章图片

2.2 能量图制作 分割后的一个步态周期内的图像:
Python 实现步态能量图
文章图片

代码:
def get_GEI(path): # path 是文件夹对应的路径,一个文件夹下面放置一个步态周期内的已经剪裁好的图像 imgs = os.listdir() path1 = os.getcwd() imgs_list = [cv2.imread(path1 +'\\'+i)/255 for i in imgs]GEI = imgs_list[0] for i in imgs_list[1:]: GEI += i GEI = GEI/len(imgs_list)return GEI

测试:
GEI = get_GEI(r'H:\gait recognition\data\gait')cv2.imshow('image2', GEI) cv2.waitKey(0) cv2.destroyAllWindows()

结果显示:
Python 实现步态能量图
文章图片

注意:
一定要对图像做归一化处理,否则将显示下面的结果:
【Python 实现步态能量图】Python 实现步态能量图
文章图片


参考资料:
[1] 贲晛烨, 徐森, and 王科俊. "行人步态的特征表达及识别综述." 模式识别与人工智能 2012 年 01 (2012): 71-81.

    推荐阅读