前言
研究生阶段用到了一点图像差分的技术,现在分享出来,算是对工作的一些总结吧
1.差分法
面部表情图像在采集时难免会引入光照、背景等噪声,并且人脸表情自身还存在着个体差异。针对个体差异及环境噪声对抑郁症识别的影响,使用人脸表情图像差分方法,最大化保留人脸表情信息的同时,消除个体差异和环境噪声。实验中选取每个受试者的第一帧图像作为标准帧,其余图像作为被测帧进行图像差分:
- 针对光线图像噪声等自然条件干扰的影响,使用高斯滤波器对图像进行平滑降噪,抑制噪声。
- 将被测帧在图像空间域上与标准帧进行差分𝐷𝑓(𝑥,𝑦,∇𝑡_𝑖 )=𝑎𝑏𝑠[𝑓(𝑥,𝑦,𝑡_𝑖 )−𝑓(𝑥,𝑦,𝑡_0)]。
- 将差分后的图像灰度值归一化至0-255之间。
- 形态学处理,利用腐蚀和膨胀处理提取差分图像的边缘信息。
2.效果图
2.程序
import os
import cv2
import numpy as np
# 指定GPU
# os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" #按照PCI_BUS_ID顺序从0开始排列GPU设备
# os.environ["CUDA_VISIBLE_DEVICES"] = "2" #使用第3块GPU进行训练
def generate_flow(src, des): # 以个体为单位生成光流图
"""
:param src: 原图每个个体的文件夹路径
:param des: 差分图每个个体的文件夹路径
:return:
"""
def mkfile(file):
if not os.path.exists(file):
os.makedirs(file)
file_list=os.listdir(src)
file_list = sorted(file_list)
# 获取第一帧
frame1 = cv2.imread(os.path.join(src, file_list[0]))
for file in file_list:
# 选取第一帧作为背景图
background_img = frame1.astype(np.int16)
# 对背景图高斯滤波
#background_img_blur = cv2.GaussianBlur(background_img, (3, 3), 0)
path = os.path.join(src, file)
# 读取前景图片
front_image = cv2.imread(path).astype(np.int16)
# 对前景图高斯滤波
#front_image_blur = cv2.GaussianBlur(front_image, (3, 3), 0)
# 图像差分
differ_image = cv2.absdiff(front_image, background_img)
# # 二值化处理,用OTSU自动寻找阈值,th2为返回的图像
# ret2, differ_image = cv2.threshold(differ_image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# # #
# 把灰度值归一化到0~255
differ_image = cv2.normalize(differ_image, None, 0, 255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC3)
# 形态操作
kernel = np.ones((1, 1), np.uint8)
differ_image = cv2.morphologyEx(differ_image, cv2.MORPH_OPEN, kernel)
mkfile(des)
# 写入新的文件夹
try:
cv2.imwrite(os.path.join(des, file), differ_image)
except Exception as e:
continue
prvs = next
print('img number:%d' % len(os.listdir(des)))
original_dir_path = r"C:\Users\yc\Desktop\zong"
flow_dir_path = r"C:\Users\yc\Desktop\shengcheng"
for root, s_dirs, _ in os.walk(original_dir_path, topdown=True):
s_dirs = sorted(s_dirs)
print (s_dirs)
for sub_dir in s_dirs:
sub_dir_path = os.path.join(root, sub_dir) # 原图每个个体文件夹的绝对路径
flow_dir_path_geti = os.path.join(flow_dir_path, sub_dir)
generate_flow(sub_dir_path, flow_dir_path_geti)
print('%s is finished!' % sub_dir)